<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Beta-User</id>
	<title>FHEMWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Beta-User"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Beta-User"/>
	<updated>2026-04-08T01:05:29Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT&amp;diff=40065</id>
		<title>MQTT</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT&amp;diff=40065"/>
		<updated>2025-03-24T14:33:45Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: /* Installation in FHEM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[MQTT]] ist ein Protokoll (&amp;quot;Message Queue Telemetry Transport&amp;quot;), mit dem Daten und Befehle zwischen verschiedenen Geräten ausgetauscht werden. Die Kommunikation erfolgt dabei über einen zentralen MQTT-Server, in alter Nomenklatur auch &#039;&#039;Broker&#039;&#039; genannt.&lt;br /&gt;
&lt;br /&gt;
MQTT wurde entwickelt, um möglichst effizient, sicher und mit wenig Datenlast zu kommunizieren. MQTT ist nachrichtenorientiert, daher muss ein Client nicht beständig beim Server anfragen, ob neue Daten vorliegen. Heute findet sich MQTT vor allem im Bereich des &#039;&#039;Internet of Things&#039;&#039; (IoT). MQTT kann leicht mit FHEM verbunden werden, ohne dass dabei größerer CPU- oder Datenverbrauch entsteht. &lt;br /&gt;
&lt;br /&gt;
== Schnellstart für Ungeduldige ==&lt;br /&gt;
 define m2s MQTT2_SERVER 1883 global&lt;br /&gt;
&lt;br /&gt;
Am MQTT-Endgerät den FHEM-Server angeben wie in der Dokumentation des Endgeräts angegeben, danach das Endgerät neu starten.&lt;br /&gt;
Das Endgerät ist dann im Raum &#039;&#039;MQTT2_DEVICE&#039;&#039; zu finden. &lt;br /&gt;
&lt;br /&gt;
Schau mal in attrTemplate des neu angelegten MQTT2_DEVICE, ob was passendes für Dich dabei ist. &lt;br /&gt;
&lt;br /&gt;
Für die meisten ggf. hierzu auftretenden Fragen sollten Hinweise in den [[MQTT2-Module - Praxisbeispiele|Praxisbeispielen zu den MQTT2-Modulen]] enthalten sein.&lt;br /&gt;
&lt;br /&gt;
== Eine sehr kurze Einführung in MQTT ==&lt;br /&gt;
Die folgende Einführung kann eine vollwertige Einleitung wie beispielsweise [https://github.com/mqtt/mqtt.github.io/wiki diese Wikieinträge] nicht ersetzen. &lt;br /&gt;
&lt;br /&gt;
Bei MQTT findet die nachrichtenbasierte Kommunikation zwischen einzelnen Teilnehmern&amp;lt;ref&amp;gt;Teilnehmer in diesem Sinne kann ein Stück Hardware mit einer MQTT-fähigen firmware sein, ein auf einem Computer laufendes Script (einschließlich eines MQTT-Server-Dienstes wie &#039;&#039;mosquitto&#039;&#039; oder &#039;&#039;MQTT2_SERVER&#039;&#039;, kurz: alles mögliche sein. Dadurch kann auch ein einzelner Computer unter mehreren ClientID&#039;s am MQTT-Datenaustausch beteiligt sein.&amp;lt;/ref&amp;gt; in der Regel nicht direkt statt. Stattdessen werden alle Nachrichten von einem Teilnehmer an einen Serverdienst, den MQTT-Server (früher &#039;&#039;Broker&#039;&#039; genannt) übergeben, der dann dafür sorgt, dass die Nachricht an alle (berechtigten) anderen Teilnehmer verteilt wird, die sich für derartige Nachrichten &amp;quot;interessieren&amp;quot;. Wenn also ein Teilnehmer ohne Server-Funktion (Client) Daten von einem bestimmten anderen Teilnehmer (anderer Client) empfangen will, muss es vorher dem MQTT-Server (Broker) mitteilen, dass er die Nachrichten dieses anderen Teilnehmers abonniert (deshalb wird dieser Vorgang als &#039;&#039;subscribe&#039;&#039; bezeichnet). Im IoT ist besonders interessant, dass Sender und Empfänger von Nachrichten durch den MQTT-Server vollständig entkoppelt werden können - jemand, der Daten bereit stellt, muss sich also nicht darum kümmern, wer diese Daten empfängt&amp;lt;ref&amp;gt;Aufgrund dieser Funktionsweise sollte allerdings darauf geachtet werden, die Möglichkeiten des jeweiligen Servers zur Sicherung der Daten gegen unberechtigten Zugriff zu nutzen, insbesondere wenn die Art der Daten oder die sich hierdurch ergebenden Möglichkeiten, z.B. Schaltvorgänge in der realen Welt auszulösen, dies notwendig macht!&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht besteht im Wesentlichen aus den folgenden Elementen:&lt;br /&gt;
*&#039;&#039;&#039;ClientID&#039;&#039;&#039; -  das ist die Kennung des Senders einer Nachricht&amp;lt;ref&amp;gt;Diese kann sich bei der Weitergabe der Nachricht ändern: Zunächst sendet ein Client eine Nachricht unter seiner ClientID, der MQTT-Server wird diese dann in der Regel durch seine Kennung ersetzten, wenn er die Nachricht an einen Abonnenten - der auch ein weiterer MQTT-Server sein kann - weitergibt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
*Topic - das ist die Adresse, an die eine Nachricht gesendet wird, bzw. von wo sie abgeholt werden kann (so ähnlich wie ein Postfach in der realen Welt). Topics sind einfache Strings, die mit Schrägstrichen getrennt werden (keine Leerzeichen und nur sehr wenige Sonderzeichen erlaubt). Ein Topic könnte beispielhaft so lauten: &amp;lt;code&amp;gt;zuHause/1OG/Kueche/Licht/state&amp;lt;/code&amp;gt;. Diese Topics beinhalten also eine Hierarchie der Objekte - hier im Beispiel sind sie zuerst danach sortiert, ob sie sich zu Haus befinden, dann wird nach Stockwerken sortiert und im ersten Stock schaut man auf die Küche sowie das dort vorhandene Licht.  &lt;br /&gt;
*&#039;&#039;&#039;Payload&#039;&#039;&#039; - das ist der Inhalt der Nachricht, oft handelt es sich um Befehle oder Daten, gelegentlich auch &#039;&#039;message&#039;&#039; genannt.&lt;br /&gt;
*&#039;&#039;&#039;Quality of Service&#039;&#039;&#039; - soll geprüft werden, ob die Nachricht zugestellt wurde und wenn ja, mit welcher &amp;quot;Tiefe&amp;quot;?&lt;br /&gt;
*&#039;&#039;&#039;Retained Message&#039;&#039;&#039;. &lt;br /&gt;
Details bitte in der oben genannten Einführung nachlesen.&lt;br /&gt;
&lt;br /&gt;
Das Protokoll &#039;&#039;MQTT&#039;&#039; kommuniziert üblicherweise über Port 1883, es können aber unter derselben Netzwerkadresse an unterschiedlichen Ports auch mehrere Serverdienste bereitstehen. &lt;br /&gt;
&lt;br /&gt;
== Installation in FHEM ==&lt;br /&gt;
Um &#039;&#039;MQTT&#039;&#039; in FHEM zu nutzen, benötigt man (mindestens) einen MQTT-Server.  Es gibt zwei Möglichkeiten: man kann FHEM-externe Server-Software (oder auch einen oder mehrere im Internet bereitstehende MQTT-Server) verwenden oder man kann die MQTT-Serverkomponente aktivieren, die mit {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} in FHEM direkt bereitsteht. Hier werden kurz beide Installationswege erläutert, zwingend ist nur einer, da eben mindestens ein MQTT-Serverdienst aktiv sein muß.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Schaubilder zeigen schematisch die in FHEM zur Verfügung stehenden Wege der Einbindung von Hard- und/oder Softwarekomponenten, die über das MQTT-Protokoll Daten austauschen.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:Mqtt2 server.png|Datenaustausch mit MQTT-Geräten, wenn &#039;&#039;MQTT2_SERVER&#039;&#039; als internem MQTT-Serverdienst verwendet wird&lt;br /&gt;
Datei:Mqtt2 client v extern server.png|Datenaustausch mit MQTT-Geräten, wenn &#039;&#039;MQTT2_CLIENT&#039;&#039; iVm. mosquitto als externem MQTT-Serverdienst verwendet wird&lt;br /&gt;
Datei:00 mqtt pm.png|Datenaustausch mit MQTT-Geräten, wenn das Modul &#039;&#039;MQTT&#039;&#039; (00_MQTT.pm) iVm. &#039;&#039;mosquitto&#039;&#039; als externem MQTT-Serverdienst verwendet wird&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
{{Hinweis|Neueinsteigern in das MQTT-Protokoll wird &#039;&#039;&#039;dringend empfohlen&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;MQTT2_SERVER&#039;&#039;&#039;&#039;&#039;, oder - sofern unbedingt ein externer Server zum Einsatz kommen soll - &#039;&#039;MQTT2_CLIENT&#039;&#039; zu verwenden.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FHEM als MQTT-Server ===&lt;br /&gt;
Die mit dem Modul {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} bereitstehende Serverkomponente kann z.B. wie folgt aktiviert werden:&lt;br /&gt;
 defmod myBroker MQTT2_SERVER 1883 global&lt;br /&gt;
Dieses [[Gerät]] übernimmt dann die Kommunikation mit den externen Clients (und wird von diesen behandelt, wie jeder andere MQTT-Server auch&amp;lt;ref&amp;gt;Bitte beachten Sie, dass (Stand: Janar 2021) &#039;&#039;MQTT2_SERVER&#039;&#039; nicht alle features des MQTT-Protokolls unterstützt.&amp;lt;/ref&amp;gt;) und verteilt die eingehenden Nachrichten als IO-Device&amp;lt;ref&amp;gt;im Sinne des [[DevelopmentModuleIntro#Zweistufiges Modell für Module|2-stufigen Modulkonzepts]]&amp;lt;/ref&amp;gt; für die Client-Module [[MQTT2_DEVICE]]&amp;lt;ref&amp;gt;Die Zahl 2 in den Modulnamen verweist nur darauf, dass es sich um eine neuere Modulfamilie handelt; die Kommunikation mit den externen Komponenten unterscheidet sich nicht zu den älteren Modulen, die vor dem Jahr 2018 genutzt werden konnten.&amp;lt;/ref&amp;gt; und [[MQTT_GENERIC_BRIDGE]].&lt;br /&gt;
Ein weiterer Vorteil dieser Lösung besteht darin, dass man ein &#039;&#039;MQTT2_SERVER&#039;&#039;-Device mit Hilfe von [[allowed]] absichern kann, was auch SSL-verschlüsselte Kommunikation ermöglicht. &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In diesem Fall muss User bzw. Passwort auch in den entsprechenden Geräten eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Wenn Sie beabsichtigen, diese Variante zu verwenden, sollten Sie als nächstes die [[MQTT2-Module - Praxisbeispiele|Praxisbeispiele zu den MQTT2-Modulen]] lesen, und ggf. später wieder hierher zurückkehren. Dort findet sich auch ein Abschnitt zu dem auf den Grafiken zu den MQTT2-IO-Modulen enthaltenen [[MQTT2-Module_-_Praxisbeispiele#bridgeRegexp|bridgeRegexp]]-Attribut.}}&lt;br /&gt;
{{Hinweis|Falls Sie neben Anweisungen aus FHEM selbst heraus andere Software nutzen wollen, um Befehle über den &#039;&#039;MQTT2_SERVER&#039;&#039; an die darüber eingebundenen Geräte zu senden, beachten Sie bitte auch den Abschnitt zum [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp]]-Attribut bei &#039;&#039;MQTT2_CLIENT&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== FHEM-externer Broker ===&lt;br /&gt;
==== Beispiel: mosquitto ====&lt;br /&gt;
Eine gern verwendete MQTT-Server-Software ist [http://mosquitto.org Mosquitto]. Sie kann ohne weiteres auf dem Raspberry Pi, der bereits eine FHEM-Installation besitzt, installiert werden und wird keine größere CPU- oder Netzwerklast verursachen. &lt;br /&gt;
&lt;br /&gt;
Im wesentlichen beschränkt sich die Installation eines MQTT Servers aber auf wenige Arbeitsschritte. Seit &#039;&#039;stretch&#039;&#039; ist &#039;&#039;Mosquitto&#039;&#039; bereits in der Distribution enthalten und kann - zusammen mit dem client Befehl &#039;&#039;mosquito_sub&#039;&#039;, der weiter unten benötigt wird, wie folgt installiert und getestet werden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  sudo apt-get install mosquitto mosquitto-clients&lt;br /&gt;
 &lt;br /&gt;
 # MQTT Server Test&lt;br /&gt;
 sudo systemctl status mosquitto &lt;br /&gt;
&lt;br /&gt;
 # Start / Stop des Servers&lt;br /&gt;
 sudo systemctl stop mosquitto &lt;br /&gt;
 sudo systemctl start mosquitto &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Danach ist der RPi mit &amp;lt;nowiki&amp;gt;shutdown restart&amp;lt;/nowiki&amp;gt; neu zu starten. &lt;br /&gt;
&lt;br /&gt;
==== IO-Module für externe MQTT-Server ====&lt;br /&gt;
Damit FHEM mit dem MQTT-Server kommuniziert, muss noch ein IO-Device angelegt werden. Dabei stehen zwei Varianten zur Wahl, das Modul [[MQTT (Modul)|MQTT]] oder seit Ende 2018 [[MQTT2_CLIENT]].&lt;br /&gt;
&lt;br /&gt;
Beide Module können auch dazu genutzt werden, um Daten zwischen zwei FHEM-Installationen auszutauschen, insbesondere kann auch 00_MQTT.pm als Client für einen MQTT2_SERVER eingesetzt werden, der &#039;&#039;&#039;auf der anderen Installation&#039;&#039;&#039; als MQTT-Serverdienst eingerichtet ist. Darüber hinaus bestehen eine Vielzahl von Kombinationsmöglichkeiten der diversen IO-Module, wenn die Installation auf mehrere Server verteilt ist.&lt;br /&gt;
Auf einer FHEM-Installation wird jedoch in der Regel nur eines der IO-Module benötigt. &lt;br /&gt;
&lt;br /&gt;
===== MQTT2_CLIENT =====&lt;br /&gt;
Ein MQTT2_CLIENT-IO-Device wird z.B. angelegt mit&lt;br /&gt;
 define myBroker MQTT2_CLIENT 10.0.0.5:1883 ## bitte EIGENE IP-Adresse eintragen&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Wenn Sie beabsichtigen, MQTT2_CLIENT zu verwenden, sollten Sie zuerst die [[MQTT2-Module - Praxisbeispiele|Praxisbeispiele zu den MQTT2-Modulen]] lesen, und dabei die Hinweise im Artikel [[MQTT2_CLIENT]] beachten.}}&lt;br /&gt;
&lt;br /&gt;
Ein MQTT2_CLIENT-Device kann ebenfals mit Hilfe von [[allowed]] abgesichert werden, um z.B. SSL-verschlüsselte Kommunikation zu ermöglichem. Client-Module zu diesem IO-Typ sind wiederum [[MQTT2_DEVICE]] und [[MQTT_GENERIC_BRIDGE]].&lt;br /&gt;
&lt;br /&gt;
===== MQTT (Modul) ===== &lt;br /&gt;
Vorab werden für diese Variante weitere Perl-Pakete benötigt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 # Perl Version ausgeben&lt;br /&gt;
 perl -v&lt;br /&gt;
 # Perl MQTT Module nachinstallieren (läuft ein paar Minuten)&lt;br /&gt;
 sudo cpan install Net::MQTT::Constants&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dabei wird neben dem ausdrücklich aufgeführten Modul noch &#039;&#039;Module::Pluggable&#039;&#039; und &#039;&#039;Net::MQTT::Message&#039;&#039; (sowie ein weiteres, nicht für FHEM genutztes Paket) installiert.&lt;br /&gt;
&lt;br /&gt;
Ein IO-Device des Typs MQTT wird z.B. angelegt mit&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Sofern der Broker mit FHEM über localhost kommuniziert, kann als IP 127.0.0.1 verwendet werden.}}&lt;br /&gt;
 define myBroker MQTT 10.0.0.5:1883 ## bitte EIGENE IP-Adresse eintragen&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Außerhalb der offiziellen Quellen sind auch einige ältere Varianten des Moduls MQTT_DEVICE verfügbar, die jeweils spezielle Anforderungen (z.B. für Zigbee2mqtt) separat abbilden. Diese werden hier nicht gesondert behandelt, da solche Sonderfälle heute generischer und einfacher durch den Einsatz von MQTT2_DEVICE abzubilden sind.}}Client-Device-Module zum Modul [[MQTT (Modul)|MQTT]] sind [[MQTT_DEVICE]], &#039;&#039;MQTT_BRIDGE&#039;&#039; (veraltet!) und  [[MQTT_GENERIC_BRIDGE]]. Da &#039;&#039;MQTT_DEVICE&#039;&#039; payload im JSON-Format (im Unterschied zu MQTT2_DEVICE) nicht selbst verarbeiten kann wird hier zusätzlich das Modul {{Link2CmdRef|Anker=expandJSON|Lang=de|Label=expandJSON}} benötigt, um den {{Link2Forum|Topic=66761|LinkText=JSON String auszuwerten}}.&lt;br /&gt;
&lt;br /&gt;
===== Auswahl =====&lt;br /&gt;
Als Einsteiger sollte man &#039;&#039;MQTT2_CLIENT&#039;&#039; als Interface-Modul wählen. Dies hat folgende Vorteile:&lt;br /&gt;
* &#039;&#039;MQTT2_CLIENT&#039;&#039; kann verschlüsselte Verbindungen aufbauen.&lt;br /&gt;
* Es sind keine externen Perl-Module erforderlich.&lt;br /&gt;
* Als Client-Modul steht u.a. &#039;&#039;MQTT2_DEVICE&#039;&#039; zur Verfügung, das - im Vergleich zu &#039;&#039;MQTT_DEVICE&#039;&#039; direktere Möglichkeiten der Behandlung von heutzutage häufig verbreiteten JSON-Payloads bietet.&lt;br /&gt;
&lt;br /&gt;
=== Performancefragen... ===&lt;br /&gt;
...oder was sollte man unter Performance-Gesichtspunkten als Lösung wählen, wenn man in die MQTT-Welt einsteigt&amp;lt;ref&amp;gt;vgl. hierzu diesen {{Link2Forum|Topic=94768|Message=875714|LinkText=Beitrag}} von Rudolf König&amp;lt;/ref&amp;gt;?&lt;br /&gt;
Grundsätzlich sollte man davon ausgehen, dass innerhalb von FHEM die Verarbeitung derselben Daten näherungsweise denselben Aufwand bedeuten, unabhängig davon, welche der Implementierungen (&#039;&#039;MQTT2_CLIENT&#039;&#039;, &#039;&#039;MQTT&#039;&#039; oder &#039;&#039;MQTT2_SERVER&#039;&#039;) man konkret wählt.&lt;br /&gt;
Ein externer Broker hat daher vor allem dann Vorteile, wenn die MQTT Daten überwiegend für was anderes (nicht FHEM) verwendet werden, oder MQTT zweckentfremdet wird (wie z.Bsp. für Musikübertragung). Nutzt man das MQTT-Protokoll dagegen vorwiegend innerhalb von FHEM, ist eher der Einsatz von &#039;&#039;MQTT2_SERVER&#039;&#039; in Betracht zu ziehen. Dieser soll Anfängern die Anbindung von MQTT Geräten in FHEM einfacher machen. Wer später merkt, dass er doch einen externen Broker benötigt, kann dann immer noch auf &#039;&#039;MQTT2_CLIENT&#039;&#039; in Verbindung mit einem anderen Broker wechseln.&lt;br /&gt;
Dagegen ist der Weg von &#039;&#039;MQTT_DEVICE&#039;&#039; zu &#039;&#039;MQTT2_DEVICE&#039;&#039; mit erheblich mehr Aufwand verbunden.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation zu sonstigen FHEM-Geräten über MQTT  ===&lt;br /&gt;
&lt;br /&gt;
Möchte man Daten von einem [[Gerät]] (im FHEM-Sinn), das &#039;&#039;&#039;nicht&#039;&#039;&#039; vom Typ &#039;&#039;MQTT2_DEVICE&#039;&#039; oder &#039;&#039;MQTT_DEVICE&#039;&#039; (je nach IO-Modul) ist, per MQTT-Protokoll versenden (z.B. für eine andere Visualisierungslösung als FHEMWEB, oder als FHEM2FHEM-Ersatzlösung), oder diese sonstigen Geräte über MQTT-Anweisungen von außen steuern können, hat man mehrere Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
==== MQTT_GENERIC_BRIDGE ====&lt;br /&gt;
===== Allgemeines =====&lt;br /&gt;
Das Modul {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=en|Label=MQTT_GENERIC_BRIDGE}} ermöglicht es, sein jeweiliges IO-Modul-Gerät zu nutzen, um diesen Kommunikationsweg für beliebig viele andere FHEM-Geräte bereitzustellen. Dabei erfolgt am MQTT_GENERIC_BRIDGE-Gerät selbst nur eine Basiskonfiguration, im Übrigen durch Attribute an dem jeweiligen Gerät selbst. So kann z.B. ein Aktor des Typs [[CUL_HM]] an- oder ausgeschaltet werden oder auch einfach nur seinen aktuellen Schaltzustand per MQTT-Protokoll publizieren.&lt;br /&gt;
 &lt;br /&gt;
Dieses Modul kann seit November 2018 mit allen drei IO-Modul-Varianten zusammen eingesetzt werden, also sowohl mit &#039;&#039;MQTT2_SERVER&#039;&#039; bzw. &#039;&#039;MQTT2_CLIENT&#039;&#039; oder &#039;&#039;MQTT&#039;&#039; (00_MQTT.pm). Seit Rev. 23514 (Jan. 2021) wird für MQTT_GENERIC_BRIDGE iVm. den MQTT2-IO-Modulen &#039;&#039;&#039;keine zusätzliche Software mehr&#039;&#039;&#039; benötigt.  &lt;br /&gt;
&lt;br /&gt;
===== MQTT_GENERIC_BRIDGE und autocreate bei MQTT2-IO-Modulen =====&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Alternativ kann eine &#039;&#039;bridgeRegexp&#039;&#039; an einem beliebigen &#039;&#039;MQTT2_DEVICE&#039;&#039; existiert, die die betreffenden Nachrichten mit einer leeren CID zurückgibt.&lt;br /&gt;
&lt;br /&gt;
Die technischen Hintergründe bzgl. autocreate sind diesem {{Link2Forum|Topic=95341|LinkText=Thread}} zu entnehmen. &lt;br /&gt;
&lt;br /&gt;
Beispiel für die Erstellung einer passenden &#039;&#039;bridgeRegexp&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
Es existiert ein &amp;quot;Neben-FHEM&amp;quot; namens &#039;&#039;fhem2&#039;&#039;, das von einem &amp;quot;Haupt-FHEM&amp;quot; namens &#039;&#039;fhem&#039;&#039; aus Nachrichten empfangen soll, die dann an die an &#039;&#039;fhem2&#039;&#039; angeschlossene Hardware weitergegeben werden. Die Nachrichten kommen über ein MQTT2_CLIENT-IO mit der CID &#039;&#039;fhem2&#039;&#039; in &#039;&#039;fhem2&#039;&#039; an. Das Haupt-FHEM sendet mit der &#039;&#039;$base&#039;&#039; &#039;&#039;fhem/&#039;&#039;. Dann wäre in &#039;&#039;fhem2&#039;&#039; folgendes MQTT2_DEVICE anzulegen (der Name kann frei gewählt werden):&lt;br /&gt;
 define M_G_B_bridgeRegex_device MQTT2_DEVICE fhem2&lt;br /&gt;
 attr M_G_B_bridgeRegex_device bridgeRegexp [\b]fhem/.*:.* &amp;quot;&amp;quot;}}&lt;br /&gt;
Dabei sollte man jedoch beachten, dass eingehende MQTT-Nachrichten von den MQTT2-IO Modulen (&#039;&#039;MQTT2_SERVER&#039;&#039; oder &#039;&#039;MQTT2_CLIENT&#039;&#039;) nur dann an die &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; zur weiteren Auswertung übergeben werden, wenn &lt;br /&gt;
&lt;br /&gt;
- zum einen &#039;&#039;&#039;kein passender readingList-Eintrag&#039;&#039;&#039; an irgendeinem &#039;&#039;MQTT2_DEVICE&#039;&#039; exisitert &#039;&#039;&#039;und&#039;&#039;&#039; die &#039;&#039;autocreate&#039;&#039;-Funktion des betreffenden IOs ausgeschaltet wird und bleibt, &#039;&#039;&#039;oder&#039;&#039;&#039;&lt;br /&gt;
- die Priorität bei der Übergabe der Daten an die weiteren Module geändert wird. Hierfür stellen die Module &#039;&#039;MQTT2_SERVER&#039;&#039; oder &#039;&#039;MQTT2_CLIENT&#039;&#039; das Attribut &#039;&#039;clientOrder&#039;&#039; auf &#039;&#039;MQTT_GENERIC_BRIDGE MQTT2_DEVICE&#039;&#039; zu stellen:&lt;br /&gt;
 attr &amp;lt;mqtt2_server&amp;gt; clientOrder MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Die letztere Methode mit &#039;&#039;clientOrder&#039;&#039; wird zur Vermeidung von späteren Irritationen ausdrücklich empfohlen!&lt;br /&gt;
&lt;br /&gt;
===== Anwendungsbeispiele =====&lt;br /&gt;
Anwendungsfälle und -beispiele für das Modul sind diesem {{Link2Forum|Topic=91642|LinkText=Thread}} zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
==== MQTT_BRIDGE ====&lt;br /&gt;
Dieses früher in FHEM enthaltene Modul kann nur zusammen mit einem IO-Gerät des Typs [[MQTT (Modul)|MQTT]] verwendet werden. Dabei wird pro weiterzuleitendem anderen FHEM-Gerät eine eigene Instanz dieses Moduls verwendet. &#039;&#039;&#039;Auf den Einsatz dieser Option sollte in neuen Installationen zugunsten von &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; verzichtet werden!&#039;&#039;&#039;&lt;br /&gt;
{{Hinweis|&#039;&#039;MQTT_BRIGE&#039;&#039; wird seit FHEM-Version 6.1 nicht mehr direkt als Modul mit installiert. Es ist bei Bedarf in &#039;&#039;contrib&#039;&#039; zu finden.}}&lt;br /&gt;
&lt;br /&gt;
==== Per publish-Befehl am IO-Gerät ====&lt;br /&gt;
Alle drei IO-Module kennen direkte &#039;&#039;publish&#039;&#039;-Anweisungen, mit deren Hilfe beliebige &#039;&#039;payloads&#039;&#039; an beliebige &#039;&#039;topics&#039;&#039; gesendet werden können. Dies kann man z.B. in einem [[notify]] oder [[at]] nutzen, um einzelne Events zu publishen oder Werteanfragen abzusetzen.&lt;br /&gt;
&lt;br /&gt;
Hier eine regelmäßige Werteabfrage auf einen [[EBUS-MQTT2|ebus]]:&lt;br /&gt;
 defmod get_ebus_updates at +*00:15:00 set ebusMQTT publish ebusd/430/Hc1HeatCurve/get;&lt;br /&gt;
 set ebusMQTT publish ebusd/430/HwcTempDesired/get;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RAW-Events am IO-Gerät (MQTT2.*) ====&lt;br /&gt;
Bei beiden MQTT2-IO-Modulen (MQTT2_SERVER und MQTT2_CLIENT) kann per [[Regulärer Ausdruck|regulärem Ausdruck]] festgelegt werden, welche Nachrichten ein Event erzeugen sollen, auf das dann wieder z.B. mit einem [[notify]] reagiert werden kann, z.B. um beliebige Schaltaktionen auszulösen.&lt;br /&gt;
&lt;br /&gt;
== MQTT-Clients (Beispiele) ==&lt;br /&gt;
&lt;br /&gt;
===Arduino-library===&lt;br /&gt;
Zur Kommunikation mit dem Broker von Seiten eines [[Arduino|Arduinos]] mit selbst erstellten Sketches böte sich der PubSubClient an.&lt;br /&gt;
&lt;br /&gt;
===PC-Software===&lt;br /&gt;
Um die Funktionalität des Brokers zu testen kann z.B. ein Analyse-Tool wie MQTT.fx verwendet werden, oder die im Paket &#039;&#039;mosquitto-clients&#039;&#039; enthaltenen Linux-Kommandozeilen-Programme &#039;&#039;mosquitto_sub&#039;&#039; und &#039;&#039;mosquitto_pub&#039;&#039;. Letzterer könnte z.E. auch aus beliebigen &#039;&#039;shell-scripten&#039;&#039; heraus aufgerufen werden. Als Perl-Bibliothek steht alternativ z.B. [https://metacpan.org/pod/distribution/AnyEvent-MQTT/bin/anyevent-mqtt-pub anyevent-mqtt-pub] zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== Tasmota ===&lt;br /&gt;
Eine derzeit oft genutzte Möglichkeit für MQTT bilden die [[Sonoff]]-Geräte und weitere [[ESP8266]]-basierte Hardware, die unter vielen Handelsnamen erhältlich sind. Werden diese mit Tasmota (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) geflasht, so kommunizieren sie über MQTT. Um diese Geräte einzubinden, ist wie folgt vorzugehen. Zuerst ist ein Serverdienst (Broker) bereitzustellen, wie oben beschrieben.&lt;br /&gt;
&lt;br /&gt;
Unter Sonoff sind einige Topics voreingestellt. arendst stellt insbesondere drei Topic-Präfixe bereit, die seiner Meinung jedes Topic einleiten sollen (in den Eingabemasken als &amp;quot;%prefix%&amp;quot; notiert). Das sind einmal Kommandos (abgekürzt als cmnd), die dazu dienen, Befehle auszuführen. Daten werden mit tele und stat übertragen. Ein Topic besteht dann zuerst aus diesem Präfix und danach dem eigentlichen Topic. Wer also beispielsweise einem Sonoff_Switch einen Befehl senden will, sollte als Topic cmnd/Sonoff_Switch wählen. Wenn der Switch ein- und ausgeschaltet werden kann, muss der Topic noch das Wort POWER enthalten (in MQTT werden viele Kennworte komplett groß geschrieben). Der Topic lautet damit vollständig &amp;quot;cmnd/Sonoff_Switch/POWER/set&amp;quot; &lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Dabei ist darauf zu achten, dass für den Parameter &#039;&#039;topic = %topic% (sonoff)&#039;&#039; statt &#039;&#039;sonoff&#039;&#039; ein gerätespezifischer eigener Name eingetragen wird. Hierzu kann man z.B. auch die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; verwenden, indem man die unter &#039;&#039;client (DVES_8BABA9)&#039;&#039; zu findende Angabe kopiert. Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
&lt;br /&gt;
Link zum Forum: {{Link2Forum|Topic=27532|LinkText=MQTT FHEM Einrichtung}} (hier als &#039;&#039;MQTT_DEVICE&#039;&#039;!):&lt;br /&gt;
&lt;br /&gt;
 ### FHEM Device mit MQTT verbinden ###&lt;br /&gt;
 define Sonoff_Switch MQTT_DEVICE&lt;br /&gt;
 attr Sonoff_Switch IODev myBroker&lt;br /&gt;
 attr Sonoff_Switch devStateIcon ON:rc_GREEN:OFF OFF:rc_RED:ON&lt;br /&gt;
 attr Sonoff_Switch icon hue_filled_br30&lt;br /&gt;
 attr Sonoff_Switch publishSet ON OFF cmnd/TestSwitch/POWER&lt;br /&gt;
 attr Sonoff_Switch room MQTT&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Licht stat/Sonoff_Switch/POWER&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Sensor tele/Sonoff_Switch/SENSOR&lt;br /&gt;
 attr Sonoff_Switch subscribeReading_Status stat/Sonoff_Switch/STATUS&lt;br /&gt;
 attr Sonoff_Switch webCmd ON:OFF&lt;br /&gt;
&lt;br /&gt;
Der hier dargestellte Beispielcode realisiert die Kommunikation zwischen FHEM und dem sonoff Modul via MQTT Broker. Zu beachten ist hier, dass &#039;&#039;&#039;subscribeReading_Licht&#039;&#039;&#039; und &#039;&#039;&#039;subscribeReading_Status&#039;&#039;&#039; unterschiedliche Syntax des Topic Strings haben!&lt;br /&gt;
&lt;br /&gt;
=== OpenMQTTGateway ===&lt;br /&gt;
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich [https://github.com/1technophile/OpenMQTTGateway OpenMQTTGateway] an, z.B. wird für das Auslesen vieler BLE-Sensoren lediglich ein ESP32-Board ohne Zusatzhardware (ab ca. 5,- Euro in Fernost erhältlich) benötigt, auf das dann eine vorkompilierte Firmware geflasht wird (USB-seriell-Wandler erforderlich).&lt;br /&gt;
&lt;br /&gt;
Nähere Details sind im Artikel [[OpenMQTTGateway]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Sicherheit ==&lt;br /&gt;
Prinzipiell ist MQTT ebenso sicher wie eine Postkarte. Solange man es nicht extra absichert, kann jeder der, im eigenen LAN ist (und die Adresse vom Broker kennt) alle Topics mitlesen.&lt;br /&gt;
:&amp;lt;code&amp;gt;meinHaus/Flur/Haustuer:open / close&amp;lt;/code&amp;gt;&lt;br /&gt;
bietet unter diesen Umständen reichlich Raum für Verbesserungen! &lt;br /&gt;
&lt;br /&gt;
Abhilfe:&lt;br /&gt;
=== Username / Passwort ===&lt;br /&gt;
Zunächst kann man erst mal einen Username / Passwort vergeben, was alle IO-Device-Module unterstützen. Da ist zwar auch noch lange nicht sicher, aber zumindest steigert es den Aufwand schon mal. Jetzt muss man zumindest schon mal Pakete sniffen und verstehen, um unbefugt zu lesen oder gar zu publishen.&lt;br /&gt;
&lt;br /&gt;
=== TLS ===&lt;br /&gt;
Um wirklich sicher zu werden, führt kein Weg an TLS vorbei. &lt;br /&gt;
&lt;br /&gt;
Der MQTT-Client in [[#Tasmota|Tasmota]] (für ESP8266) kann mit TLS betrieben werden, vgl. [https://github.com/arendst/Tasmota/wiki/TLS Beschreibung im Tasmota-Wiki].&lt;br /&gt;
&lt;br /&gt;
Leider kann z.B. ein Arduino das schlicht nicht mehr, da die einfacheren Modelle nicht über ausreichend Speicher und die Rechenleistung verfügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;(Hier fehlt eine Anleitung für allowed usw.)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Probleme ==&lt;br /&gt;
=== Anweisung und Ergebnis weichen voneinander ab ===&lt;br /&gt;
In der Regel melden MQTT-fähige Geräte entweder den Erhalt einer Nachricht zurück oder den Status nach Durchführung der in der &#039;&#039;payload&#039;&#039; enthaltenen Anweisung. Dabei findet aber in der Regel beim Empfänger eine Verarbeitung der Nachricht statt, ggf. wird diese auch weitergesendet und nochmals verarbeitet, bevor dann ggf. eine Rückmeldung des neuen Status an den MQTT-Server erfolgt. Handelt es sich um einfache on/off-Befehle, bleibt Anweisung und Ergebnis in der Regel identisch. Bei anderen, namentlich bei Dimmer-Werten, kann es zu Rundungsdifferenzen bei nummerischen Werten kommen. So kann z.B. ein Dimm-Wert von 70% gesetzt werden, zürückgemeldet wird dann aber 72% (oder 67%). &lt;br /&gt;
Dies ist technisch bedingt, vermeiden kann das jedoch in aller Regel nur der Autor der jeweiligen software/firmware auf dem &amp;quot;rechnenden&amp;quot; Gerät.&lt;br /&gt;
&lt;br /&gt;
=== Unbeabsichtigte Schleifen ===&lt;br /&gt;
Durch Fehler in der topic-Struktur können unbeabsichtigte Schleifen entstehen, die FHEM komplett blockieren können. Es ist unbedingt darauf zu achten, dass die jeweiligen Sende- und Empfangs-topics andere sind!&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
=== Welche Infos sollten Anfragen im MQTT-Forum enthalten? ===&lt;br /&gt;
* Anfragen bitte nur zur aktuellsten FHEM-Version: Befehl &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; ergibt Ausgabe &amp;quot;nothing to do...&amp;quot;&lt;br /&gt;
* detaillierte Beschreibung des Problems&lt;br /&gt;
* Art der Einbindung&lt;br /&gt;
** eingesetzter MQTT-Server? (=&amp;gt; MQTT2_SERVER oder externer Serverdienst wie mosquitto?)&lt;br /&gt;
** Wenn externer Server: Interface-Modul: MQTT2_CLIENT oder 00_MQTT.pm?&lt;br /&gt;
** Wenn MQTT2_SERVER: &#039;&#039;list&#039;&#039; beifügen und klären, ob dieser von der jeweiligen Komponente aus im Netzwerk zu erreichen ist:&lt;br /&gt;
*** steht auf &amp;quot;global&amp;quot;?&lt;br /&gt;
*** ggf. passendes [[allowed]] definiert, falls weiter entferntes Netzwerk oder falls Zugangsbeschränkungen/Authentifizierungsverfahren eingestellt sind?&lt;br /&gt;
*** Modifikationen am &#039;&#039;autocreate&#039;&#039;-Attribut? &lt;br /&gt;
** Bitte einen Hinweis, falls MQTT_GENERIC_BRIDGE definiert ist bzw. auch ein &#039;&#039;list&#039;&#039; von der MQTT_GENERIC_BRIDGE.&lt;br /&gt;
** TYPE des eigentlichen MQTT-Devices (MQTT2_DEVICE, MQTT_DEVICE, TASMOTA_DEVICE, ...) &lt;br /&gt;
* Informationen zur eigentlichen Komponente:&lt;br /&gt;
** Hersteller, ggf. aktuell verwendete firmware incl. Version (Beispiel: ein Shelly-Gerät mit originaler firmware verhält sich anders als dasselbe Gerät mit Tasmota-, ESPEasy oder ESPurna-firmware!).&lt;br /&gt;
** Infos zur MQTT-Konfiguration auf dem Gerät selbst&lt;br /&gt;
** Bei weniger gängigen Komponenten oder Diensten:&lt;br /&gt;
*** (sofern vorhanden): Link zu Projektseiten, MQTT-API-Seiten usw..&lt;br /&gt;
*** Mittschnitte des MQTT-Verkehrs (z.B. durch Einschalten der rawEvents an den MQTT2-Interface-Modulen, s.o.).&lt;br /&gt;
** Ein &#039;&#039;list&#039;&#039; des eigentlichen Devices - bei MQTT2_DEVICE gerne in Form einer RAW-Definition (&#039;&#039;list -r &amp;lt;devicename&amp;gt;&#039;&#039;).&lt;br /&gt;
* Bei MQTT2-Einbindung und aktiviertem &#039;&#039;autocreate&#039;&#039; an den Interface-Modulen den Status des &#039;&#039;autocreate&#039;&#039;-&#039;Devices: &lt;br /&gt;
 list TYPE=autocreate&lt;br /&gt;
=== Älterer FAQ-Thread im Forum ===&lt;br /&gt;
Dieser ist {{Link2Forum|Topic=70119|LinkText=hier}} zu finden. Bitte beachten: es sind einige grundlegende Informationen und Links zu vielen Tools und Fundstellen enthalten, allerdings nur bis zum Stand des Jahres 2017. Die neue Modulgeneration MQTT2_.* wird dort nicht behandelt.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://mqtt.org Offizielle Homepage von MQTT, englisch]&lt;br /&gt;
* [http://www.hivemq.com/blog/mqtt-essentials-part-1-introducing-mqtt Sehr gute Einführung, englisch, sind 5 lesenswerte Teile]&lt;br /&gt;
* [https://www.heise.de/developer/artikel/MQTT-Protokoll-fuer-das-Internet-der-Dinge-2168152.html Ein Exkurs von Heise mit Beispielen, deutsch, sehr lesenswert]&lt;br /&gt;
* [http://www.mqttfx.org/ MQTT FX - ein sehr praktisches Analysetool]&lt;br /&gt;
* {{Link2Forum|Topic=69230|LinkText=Diskussionsthread im Forum}}&lt;br /&gt;
* {{Link2Forum|Topic=92888|LinkText=Thread, zur Entstehungsgeschichte von MQTT2_CLIENT}}&lt;br /&gt;
* {{Link2Forum|Topic=93255|LinkText=Ankündigungsthread zur MQTT2-Erweiterung der MQTT_GENERIC_BRIDGE}}&lt;br /&gt;
* [[MQTT_Einf%C3%BChrung_Teil_2|Teil 2 der MQTT Einführung]]: Detailaspekte (vorrangig zur Modulfamilie MQTT/MQTT_DEVICE)&lt;br /&gt;
* [[MQTT Einführung Teil 3|Teil 3 der MQTT Einführung]]: Arduino-Client selbst programmieren&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Glossary]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT|Einführung]]&lt;br /&gt;
[[Kategorie:MQTT| ]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesReadings&amp;diff=40019</id>
		<title>DevelopmentGuidelinesReadings</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesReadings&amp;diff=40019"/>
		<updated>2025-02-21T20:26:38Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Teilweise Übernahme aus Diskussionssthread&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Deutsch=&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Auf dieser Seite werden Richtlinien für Readings gesammelt, welche in mehreren Modulen auftauchen können um eine Vereinheitlichung zu erreichen. Dadurch soll es Hilfsmodulen und Anwendern leichter fallen, mit den Werten der Readings zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
== Batterie-Readings ==&lt;br /&gt;
Basierend auf dieser {{Link2Forum|Topic=87575|LinkText=Diskussion}} haben sich die Entwickler für Readings, welche in Zusammenhang mit Batterien stehen auf folgendes geeinigt:&lt;br /&gt;
Es gibt &#039;&#039;&#039;nur&#039;&#039;&#039; diese drei Readings für den Batteriestatus:&lt;br /&gt;
* batteryState&lt;br /&gt;
* batteryPercent&lt;br /&gt;
* batteryVoltage&lt;br /&gt;
&lt;br /&gt;
Wertebereich:&lt;br /&gt;
*batteryState: ok|low&lt;br /&gt;
*batteryPercent: \d{1,2}|100&lt;br /&gt;
*batteryVoltage: \d+.\d+&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
das jeweilige Modul setzt &#039;&#039;&#039;nur&#039;&#039;&#039; die Readings, die es aus den aktuellen Daten vom Gerät bestimmen kann. Konkret: niemand kann sich darauf verlassen, welche der drei battery Readings vorhanden sind (es gibt nicht überall ein batteryState). Wenn das Gerät früher ein Percent gemeldet hat, aber in der letzten Nachricht nur state, dann wird das Percent Reading nicht angefasst.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;####&amp;lt;/nowiki&amp;gt; ab hier Entwurf ##### &lt;br /&gt;
&lt;br /&gt;
== Energieflüsse ==&lt;br /&gt;
Siehe Thread {{Link2Forum|Topic=116747|LinkText=Frevel: Die Idee einheitlicher Devicenamen und Readings}}  &lt;br /&gt;
&lt;br /&gt;
== Diskussionsvorschläge für künftige Module ==&lt;br /&gt;
Quelle:  {{Link2Forum|Topic=117933|LinkText=Diskussion}} &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schaltbare Geräte (mehrkanalig=&amp;gt;erster Kanal, &amp;quot;Hauptschalter&amp;quot; oä.):&#039;&#039;&#039;&lt;br /&gt;
- &amp;quot;state&amp;quot; mit Werten &amp;quot;on&amp;quot; bzw. &amp;quot;off&amp;quot; (für laufende Schaltvorgänge auch &amp;quot;set_xx&amp;quot;, s.u.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Leuchtmittel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;state&amp;quot; wie &amp;quot;schaltbare Geräte&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;pct&amp;quot; für Helligkeit (Wertebereich: 0-100), alternativ &amp;quot;dim&amp;quot; (Wertebereich: 0-99) oder &amp;quot;brightness&amp;quot; (Wertebereich: 0-255 (bzw. 254))&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;ct&amp;quot; (alternativ: &amp;quot;colorTemp&amp;quot;) für die Farbtemperatur&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;hue&amp;quot; für den Farbwert (ohne Helligkeitsanteil)&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;rgb&amp;quot; (alternativ: &amp;quot;color&amp;quot; oder &amp;quot;hex&amp;quot;) für Farbwerte mit Helligkeitsanteil (rrggbb)&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;sat&amp;quot; (oder &amp;quot;saturation&amp;quot;) für die Farbsättigung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rollladen- und Jalousieaktoren:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wie Leuchtmittel, in der Regel sollte &amp;quot;offen&amp;quot; = &amp;quot;on&amp;quot; = &amp;quot;100&amp;quot; (pct) sein (komplett invertiert ist zulässig)&lt;br /&gt;
&lt;br /&gt;
Falls drehbare Lamellen (direkt) im Device einstellbar sind: &amp;quot;pctSlats&amp;quot; (0-100, 100= ganz nach oben gekippt) (to be verified!)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Thermostate (einstellbare Wunschtemperatur):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;desired-temp&amp;quot; für die Wunschtemperatur (typischerweise in °C)&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;temperature&amp;quot; für die gemessene Temperatur, alternativ auch &amp;quot;measured-temp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;valve&amp;quot; (oder &amp;quot;level&amp;quot;) für Stellgrößen (z.B. Ventilöffnung, &amp;quot;valve&amp;quot; typischerweise 0-100 (%))&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Thermometer:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Temperatur in Reading &amp;quot;temperature&amp;quot; oder &amp;quot;state&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Feuchtigkeitsmesser:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Luftfeuchte in &amp;quot;humidity&amp;quot;, Bodenfeuchte als &amp;quot;moisture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bewegungs- oder Präsenzmelder, Kontakte:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;motion&amp;quot; mit &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot; bzw. motion/noMotion&lt;br /&gt;
&lt;br /&gt;
&amp;quot;presence&amp;quot; mit &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot; bzw. present/absent&lt;br /&gt;
&lt;br /&gt;
&amp;quot;contact&amp;quot; mit &amp;quot;open&amp;quot; oder &amp;quot;closed&amp;quot; bzw. &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Füllstandssensoren:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;pct&amp;quot; oder &amp;quot;level&amp;quot; (typischerweise in %), bei Koexistenz mit &amp;quot;pct&amp;quot; ggf. &amp;quot;level&amp;quot; als absoluter Messwert (Einheit nicht festgelegt)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drucksensoren:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;pressure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Schlösser:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;state&amp;quot; für den Haupt-Schließzustand (locked / unlocked?)&lt;br /&gt;
&lt;br /&gt;
set-Befehle: &amp;quot;lock&amp;quot; und &amp;quot;unlock&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Geräte, die voreingestellte Szenarien einstellen können:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
set-Befehl mit &amp;quot;scene&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Allgemeiner Gerätestatus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;availability&amp;quot; (&amp;quot;online&amp;quot;/&amp;quot;offline&amp;quot; bzw. &amp;quot;present&amp;quot; / &amp;quot;absent&amp;quot;) (Für MQTT alternativer Readingname: &amp;quot;LWT&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;lastseen&amp;quot; (Zeitstempel in Sekunden)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Allgemeines:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Als &amp;quot;Transitstatus&amp;quot; darf (analog z.B. CUL_HM) auch ein &amp;quot;set_xx&amp;quot; in allen Readings stehen, bis (hoffentlich...) die Bestätigung vom Gerät zurückkommt, dass das ausgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
also Anweisung &amp;quot;set DEVICE brightness 77&amp;quot; ergibt übergangsweisen Readinginhalt für &amp;quot;brightness&amp;quot; mit &amp;quot;set_77&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#####&amp;lt;/nowiki&amp;gt; Ende Entwurf #####&lt;br /&gt;
&lt;br /&gt;
=English=&lt;br /&gt;
== Start ==&lt;br /&gt;
On this page you will find guidlines how to name common readings. These guidlines are for readings which are used in more than one module and should have the same possible values. This makes it helper modules and users easier, to work with the values from common readings.&lt;br /&gt;
&lt;br /&gt;
== Battery Reading ==&lt;br /&gt;
Based on this {{Link2Forum|Topic=87575|LinkText=discussion}} battery-readings should &#039;&#039;&#039;only&#039;&#039;&#039; be named like:&lt;br /&gt;
* batteryState&lt;br /&gt;
* batteryPercent&lt;br /&gt;
* batteryVoltage&lt;br /&gt;
&lt;br /&gt;
The values should only be:&lt;br /&gt;
*batteryState: ok|low&lt;br /&gt;
*batteryPercent: \d{1,2}|100&lt;br /&gt;
*batteryVoltage: \d+.\d+&lt;br /&gt;
&lt;br /&gt;
Important: The FHEM module will &#039;&#039;&#039;only&#039;&#039;&#039; report the values received from the device, i.e. not each module reports a batteryState reading. Additionally, if the device sent a batteryPercent value earlier but the last message from the device only contained a &#039;battery: low&#039;, the batteryPercent reading wont be changed. &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt&amp;diff=40006</id>
		<title>MQTT2 DEVICE - Schritt für Schritt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt&amp;diff=40006"/>
		<updated>2025-02-21T07:51:15Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: /* MQTT - Datenverkehr mitlesen */ Bild eingefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Das Protokoll [[MQTT]] ermöglicht einen flexiblen Datenaustausch zwischen unterschiedlichsten Geräten und FHEM und insbesondere auch bidirektionale Kommunikation von und zu FHEM. Es gibt dabei jedoch nur einen geringen Grad der Standardisierung des Datenaustauschs. In der Praxis sind daher relative viele unterschiedliche Wege aufzufinden, wie die Kommunikation via MQTT in den externen Geräten und Diensten konkret umgesetzt wurde - jeder Autor einer firmware oder Software kann dies so lösen, wie es ihm beliebt, und nicht jeder beherzigt dabei den Grundsatz, dass die Kommunikation via MQTT &amp;quot;leichtgewichtig&amp;quot; sein sollte.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Grundsätzlich stehen für viele Geräte-Typen bereits Vorlagen zur Verfügung, siehe [[AttrTemplate|attrTemplate]], die einem die wesentliche Konfigurationsarbeit abnehmen können, wie sie hier beschrieben ist. Die damit jeweils erzeugten Konfigurationen sind Einrichtungsbeispiele, die v.a. eine in sich konsistenze Zusammenstellung der verschiedenen Attribute enthalten. Es steht jedem User frei, diese Ausgangsbasis dann nach seinem Belieben zu ändern. Spätere Änderungen des verwendeten attrTemplate wirken sich nicht automatisch auf die durch frühere Versionen oder den User nachkonfigurierte Geräte aus! Da es vorkommen kann, dass sich die per MQTT übermittelten Daten und Topics ändern, wenn z.B. eine firmware aktualisiert wurden, kann dies Anpassungen am jeweiligen Template erforderlich machen. Grundsätzlich sollen die per attrTemplate für MQTT2_DEVICE verfügbaren attrTemplate jeweils für die aktuellste verfügbare stabile firmware-Version passen.}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[MQTT2_DEVICE]] bietet eine Vielzahl von Möglichkeiten, auf die verschiedensten Anforderungen einzugehen, und die ein- und ausgehenden Daten zu einem oder mehreren FHEM-[[Gerät|Gerät/en]] zusammenzufassen. Eine Übersicht häufig vorkommender MQTT-Geräte ist in [[MQTT2-Module - Praxisbeispiele]] zu finden.&lt;br /&gt;
 &lt;br /&gt;
Ziel dieses Artikels ist die Darstellung der Schritte, die sich als zweckmäßig erwiesen haben zur Einrichtung von &amp;quot;guten&amp;quot; FHEM-Geräten.&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Viele - teils komplexe Beispiele und weitere Verweise sind im {{Link2Forum|Topic=116162|LinkText=MQTT-Workshop für MQTT2-Module}} zu finden.}}Dabei soll am Ende erreicht werden:&lt;br /&gt;
* standardisierte set- (und ggf. get-)-Kommandos, insbesondere unter Beachtung der [[DevelopmentGuidelinesReadings| Developer Guidelines für Readings]]&lt;br /&gt;
* Schließen des Informationskreises von eventuellen Kommandos bis zur Rückmeldung des (externen) Gerätes oder Dienstes (im Folgenden: &amp;quot;Gegenstelle&amp;quot;)&lt;br /&gt;
* standardisierte Reading-Namen, damit möglichst Auswertungen nicht speziell an das jeweilige Gerät angepasst werden müssen&lt;br /&gt;
* Reduzierung und Vermeidung von unnötigen Datenpunkten und Events&lt;br /&gt;
* Einrichten von regelmäßigen Abfrage-Timern (falls erforderlich!).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung ==&lt;br /&gt;
=== MQTT2_SERVER ===&lt;br /&gt;
Selbst, wenn grundsätzlich ein externer MQTT-Server IO-Device zum Einsatz kommt, ist sehr zu empfehlen, für die Beschäftigung mit einem neuen, unbekannten Device zunächst einen {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} einzurichten. Ist der Port 1883 bereits belegt, nimmt man einfach einen anderen Port, z.B. 1884: &amp;lt;code&amp;gt;define m2server MQTT2_SERVER 1884 global&amp;lt;/code&amp;gt;. Sollte die Gegenstelle tiefer strukturierte Daten im JSON-Format über verschiedene Topics als Payload übermittelt, kann es ausnahmsweise hilfreich sein, &#039;&#039;&#039;in der Einrichtungsphase&#039;&#039;&#039; auch das Attribut &amp;quot;autocreate&amp;quot; am MQTT2_SERVER auf &amp;quot;complex&amp;quot; zu stellen: &amp;lt;code&amp;gt;attr m2server autocreate complex&amp;lt;/code&amp;gt;. Weiter muss die allgemeine [[Autocreate|autocreate-Instanz]] aktiv sein. Für den Regelbetrieb und für einfache, bekannte Devices (sowie für solche, für die bereits attrTemplate vorhanden sind), wird ausdrücklich empfohlen, das &#039;&#039;autocreate&#039;&#039;-Atribut am m2server gar nicht erst zu setzten, dann wird &#039;&#039;autocreate&#039;&#039; mit der (default) Einstellung &#039;&#039;simple&#039;&#039; verwendet. Die Hintergründe sind nachfolgend im Abschnitt zu &#039;&#039;json2nameValue()&#039;&#039; zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Begrifflichkeiten ===&lt;br /&gt;
Ein typisches, von &amp;quot;autocreate&amp;quot; erstelltes Gerät sieht dann z.b. (mit autocreate = simple am MQTT2_SERVER) so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wir unterscheiden bei jeder Zeile des readingList-Attributs vier Elemente, die ersten drei werden jeweils durch einen Doppelpunkt voneinander getrennt:&lt;br /&gt;
==== CID ====&lt;br /&gt;
Dies ist die Gerätekennung (hier: DVES_9B01BD). Diese ist auch Bestandteil des &#039;&#039;define&#039;&#039;, über diese wird ermittelt, zu welchem FHEM-Gerät via MQTT eingehende Informationen zugeordnet werden sollen. Diese Angabe ist weder im define noch in der readingList zwingend, aber in der Definition für den Hauptkanal eines Gerätes empfohlen. Es empfiehlt sich, die CID-Angaben bei eigenen readingList-Einträgen wegzulassen bzw. diese zu löschen. So kann einfacher zwischen automatisch generierten und eigenen Angaben unterschieden werden und die Geräte sind leichter zwischen verschiedenen IO-Modulen zu verschieben.&lt;br /&gt;
==== Topic ====&lt;br /&gt;
Datenpunkt, an den eine Information gesendet wird. Empfangsseitig sind dies hier z.B. &#039;&#039;tele/DVES_9B01BD/STATE&#039;&#039; oder &#039;&#039;tele/DVES_9B01BD/LWT&#039;&#039;.&lt;br /&gt;
Enthält der Topic Doppelpunkte oder Sonderzeichen, kann dies zu Problemen führen. Da der Topic intern als &#039;&#039;regex&#039;&#039; behandelt wird, kann man sich das in solchen Sonderfälle dadurch zu nutze machen, dass man z.B problematische Zeichen durch Punkte oder &amp;quot;beliebige Zeichenfolgen&amp;quot; ersetzt. So kann z.B. aus dem per autocreate erstellten &amp;lt;code&amp;gt;attr reader readingList SMLReader/Strom/sensor/1/obis/1-0:1.8.0/255/value:.* Strombezug_tariflos&amp;lt;/code&amp;gt; folgendes abgeleitet werden: &amp;lt;code&amp;gt;attr reader readingList SMLReader/Strom/sensor/1/obis/1-0.1.8.0/255/value:.* Strombezug_tariflos&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
==== Payload ====&lt;br /&gt;
Der jeweilige Nachrichteninhalt. Da dieser nicht im vorhinein bekannt ist, wird er in der readingList typischerweise als &amp;quot;beliebige Zeichenfolge&amp;quot; (&amp;quot;.*&amp;quot;) notiert.&lt;br /&gt;
&lt;br /&gt;
==== Auswertung ====&lt;br /&gt;
Dies kann entweder direkt der Reading-Name sein, dem die Payload zugeordnet werden soll, oder ein Perl-Ausdruck. Hier wird z.B. die eingehende Information für &#039;&#039;tele/DVES_9B01BD/LWT&#039;&#039; dem Reading &#039;&#039;LWT&#039;&#039; zugeordnet, während die Informationen aus &#039;&#039;tele/DVES_9B01BD/STATE&#039;&#039; an die Funktion &#039;&#039;json2nameValue()&#039;&#039; übergeben werden. &#039;&#039;$EVENT&#039;&#039; entspricht dabei der &#039;&#039;Payload&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== defaults ===&lt;br /&gt;
Für unbekannte Gegenstellen ist zunächst immer zu empfehlen, deren &amp;quot;Grundeinstellungen&amp;quot; zu verwenden, und Anpassungen erst und nur insoweit vorzunehmen, als es für ein besseres Zusammenspiel mit FHEM sinnvoll ist. Abzuraten ist insbesondere von:&lt;br /&gt;
* Änderungen der Topics und Topic-Sturkturen (ausgenommen den Fall, dass schon andere Gegenstellen im Einsatz sind, die identische Topics verwenden)&lt;br /&gt;
* Vergabe von &#039;&#039;friendly names&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Bestandsaufnahme ==&lt;br /&gt;
=== Projektseiten finden ===&lt;br /&gt;
Viele Geräte, die das MQTT-Protokoll verwenden, haben eigene Projektseiten oder API-Beschreibungen, denen man entnehmen kann, wie mit dieser Gegenstelle Daten ausgetauscht werden können. Diese sollte man bei allen weiteren Schritten stets zur Hand haben. Dabei kann es neben der allgemeinen Beschreibung auch ein oder mehrere Detail-Seiten geben, auf denen nähere Informationen zu den spezifischen Geräte zu finden sein können.&lt;br /&gt;
&lt;br /&gt;
=== MQTT - Datenverkehr mitlesen ===&lt;br /&gt;
[[Datei:Show MQTT traffic.png|mini|466x466px|Beispiel für einen erfolgreichen &#039;&#039;publish-&#039;&#039;Test mit MQTT2_CLIENT mit anschließender Rückübermittlung derselben Message vom MQTT-Server.]]&lt;br /&gt;
Sowohl MQTT2_SERVER wie MQTT2_CLIENT bieten in der Detailansicht die Option &#039;&#039;Show MQTT traffic&#039;&#039;. Darüber läßt sich der ein- und ausgehende Datenverkehr bequem mitlesen. Bei MQTT2_CLIENT wird dabei allerdings vorausgesetzt, dass er überhaupt Daten vom MQTT-Server erhält, also insbesondere die &#039;&#039;subscriptions&#039;&#039; korrekt gesetzt sind (falls per Attribut eingeschränkt).&lt;br /&gt;
 &lt;br /&gt;
=== readingList ===&lt;br /&gt;
Zunächst empfiehlt es sich, einfach die Gegenstelle neu zu starten und (ggf. über ein FileLog) aufzuzuzeichnen, was über welchen Topic wie oft an Informationen gesendet wird. Dabei kann und sollte durchaus - sofern dies möglich ist - der eine oder andere Schaltvorgang (z.B. über das Web-Interface der Gegenstelle) durchgeführt werden, sofern dies möglich ist (oder allgemeiner: möglichst viele bekannte Anweisungen   ausführen lassen). Am Ende sollte man eine möglichst vollständige Auflistung in der readingList erhalten haben.&lt;br /&gt;
Falls strukturierte Daten im JSON-Format als Payload verwendet werden, kann man diese auch zusätzlich ohne die Verarbeitung durch &#039;&#039;json2nameValue()&#039;&#039; aufzeichnen, z.B. indem man die betreffende Zeile in der readingList doppelt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    tele/DVES_9B01BD/STATE:.* json_STATE\&lt;br /&gt;
    tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    [...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So kann man mit Hilfe des betreffenden Logs ggf. auch über ein externes Tool wie mosquitto_pub MQTT-Nachrichten an FHEM generieren, ohne darauf warten zu müssen, dass diese von der Gegenstelle selbst erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
=== ignoreRegexp ===&lt;br /&gt;
Manche Gegenstellen senden beim Start Konfigurationsinformationen, die allerdings nicht durch FHEM ausgewertet werden können. Die betreffenden Topics sollte man (allgemein) so in die ignoreRegexp beim MQTT2_SERVER bzw. [[MQTT2_CLIENT]] aufnehmen, dass derartige Informationen künftig gar nicht mehr an MQTT2_DEVICE weitergereicht werden. Danach kann man die betreffenden Zeilen aus der readingList löschen! Entsprechendes gilt für die hierüber generierten Readings.&lt;br /&gt;
&lt;br /&gt;
Weiter ist zu empfehlen, in diese ignoreRegexp auch die Topics aufzunehmen, über die Gegenstellen typischerweise Kommandos entgegennehmen. Dies könnte z.B. so aussehen:&lt;br /&gt;
&amp;lt;code&amp;gt;attr m2server ignoreRegexp shellies/[^/]+/command|cmnd/[^/]+/|homeassistant/.*/config|tasmota/discovery&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Viele Geräte? ===&lt;br /&gt;
==== &amp;quot;split&amp;quot; ====&lt;br /&gt;
Sind auf einer Hardware mehrere &amp;quot;Hauptschalter&amp;quot; vorhanden (z.B. ein Relay-Board), ist sehr zu empfehlen, für jeden dieser &amp;quot;Hauptschalter&amp;quot; ein eigenes FHEM-Gerät anzulegen (für logische Einheiten wie Rollladenaktoren ggf. paarweise). MQTT2_DEVICE unterstützt [[DevelopmentModuleAPI#SetExtensions|SetExtensions]] und kann daher Kommandos wie &amp;quot;on-for-timer&amp;quot; über FHEM-interne Mechanismen gut umsetzen. Dies erfordert allerdings, dass die Kommandos &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; verfügbar sein müssen.&lt;br /&gt;
Wird ein Gerät gesplittet, sollten im Gerät, das den ersten (Haupt-) Kanal repräsentiert dann alle Kommunikationsdaten gebündelt werden, Querverweise zu den weiteren Kanälen kann man über das spezielle Readings &amp;quot;associatedWith&amp;quot; herstellen.&lt;br /&gt;
&lt;br /&gt;
==== bridgeRegexp ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Manche derartige Interfaces müssen zunächst entsprechend konfiguriert werden, dass die zu einem Sensor oder Aktor gehörenden Daten jeweils auf einem eigenen Topic ausgegeben werden. Insbesondere ist dies bei Tasmota (ZigBee oder Bluetooth) der Fall!}}&lt;br /&gt;
In eher seltenen Fällen kommt es vor, dass eine Gegenstelle eine Art &amp;quot;Brücke&amp;quot; zu einer Mehrzahl über diese Brücke anzusteuernder (oder zu empfangender) Aktoren oder Sensoren darstellt. In diesen Fällen kann es geboten sein, die eigentliche Gegenstelle als Hauptdevice darzustellen und für jede weitere Hardware (Sensor oder Aktor) dann ein oder mehrere Einzeldevices anzulegen. Dies kann mit Hilfe des Attributs bridgeRegexp automatisiert erfolgen, wenn sich der Sensor/Aktor aus der Topic-Struktur ablesen läßt. &lt;br /&gt;
&lt;br /&gt;
== readingList optimieren==&lt;br /&gt;
=== gute Reading-Namen - Klartext ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Beachte zur Vergabe von Reading-Namen v.a. auch [[DevelopmentGuidelinesReadings]] und [[DevelopmentGuidelinesAV]].}}&lt;br /&gt;
Viele Gegenstellen senden z.B. einen online/offline-Status als &amp;quot;last will and testament&amp;quot; unter einem Topic, der mit &amp;quot;LWT&amp;quot; endet. Dieses hier sendet zwar passende Daten, aber an einen anderen Topic. In solchen Fällen man kann den von autocreate erzeugten Eintrag einfach anpassen:&lt;br /&gt;
 attr DEVICE readingList /dingtian/DEVNAME/out/lwt_availability:.* LWT&lt;br /&gt;
&lt;br /&gt;
=== Bedingte Hash-Rückgaben ===&lt;br /&gt;
Manchmal erfolgt zwar die Übergabe eines Klartextes als $EVENT - allerdings nicht in der Form, wie man das in FHEM gerne hätte. Hier als &amp;quot;0&amp;quot; oder &amp;quot;1&amp;quot;. Mit etwas Perl und der Rückgabe eines Hashes kann man so etwas beliebig umformen:&lt;br /&gt;
 attr DEVICE readingList DEVNAME/relay/0:.* { $EVENT ? {state=&amp;gt;&#039;on&#039;} : {state=&amp;gt;&#039;off&#039;} }\&lt;br /&gt;
  DEVNAME/status:.* { $EVENT ? {LWT=&amp;gt;&#039;Online&#039;} : {LWT=&amp;gt;&#039;Offline&#039;} }&lt;br /&gt;
Weiteres Beispiel: Der &amp;quot;state&amp;quot; kommt in Großschreibung und soll in Kleinschreibung geändert werden:&lt;br /&gt;
 attr DEVICE readingList switchbot/esp32_2/bot/switchbottwo/state:.* { { state =&amp;gt; lc $EVENT } }&lt;br /&gt;
&lt;br /&gt;
=== json2nameValue() ===&lt;br /&gt;
Mit Hilfe der Funktion json2nameValue() (in Verbindung mit dem attribut &#039;&#039;jsonMap&#039;&#039;) lassen sich &lt;br /&gt;
* &amp;quot;gute Reading-Namen&amp;quot; auch aus JSON-Payloads erzeugen (2. und 3. Argument)&lt;br /&gt;
* unnötige Readings vorab ausfiltern (3., 4. und 5. Argument)&lt;br /&gt;
Beispiele für die Verwendung der Argumente 1 bis 3 sind der commandref in der Erläuterung des Attributs &#039;&#039;jsonMap&#039;&#039; bei MQTT2_DEVICE zu entnehmen, die (wie die Argumente 2 und 3 optionalen) Argumente 4 und 5 entsprechen einem Positiv- bzw.- Negativ-Filter.&lt;br /&gt;
Wird (übergangsweise!) &#039;&#039;autocreate&#039;&#039; in der &#039;&#039;complex&#039;&#039;-Variante eingestellt, werden für alle (bisher nicht bekannten) Topics Einträge wie dieser erzeugt:&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT,&#039;STATE_&#039;,$JSONMAP) }&lt;br /&gt;
* Das zweite Argument (&#039;&#039;STATE_&#039;&#039;) ist ein &amp;quot;Präfix&amp;quot;, der allen aus dem JSON erzeugten Readings aus diesem Topic (zunächst) vorangestellt wird. Mit dessen Hilfe läßt sich rekonsturieren, aus welchem Topic die betreffende Information ursprünglich kam. In der Regel ist dies nach der Einrichtung nicht mehr wichtig, und dieses Argument kann auf &amp;quot;nichts&amp;quot; (zwei einfache Quotes) gestellt werden. Allerdings kann es in Einzelfällen sinnvoll sein, Präfixe zu verwenden, um zwischen scheinbar gleichen Werte aus unterschiedlichen Quellen zu unterscheiden. Dies kann man erst abschließend entscheiden, wenn alle von der Gegenstelle gelieferten Daten bekannt sind.&lt;br /&gt;
* Das dritte Argument &#039;&#039;$JSONMAP&#039;&#039; kann in der Regel so belassen werden. Dann kann mit Hilfe des Attributs &#039;&#039;jsonMap&#039;&#039; eine Zuordnungstabelle für Namensänderungen für die zu generierenden Readingnamen erzeugt und/oder Werte schlicht gelöscht werden. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl6&amp;quot;&amp;gt;&lt;br /&gt;
json2nameValue($EVENT,&#039;STATE_&#039;,$JSONMAP,&#039;positiv&#039;)&lt;br /&gt;
json2nameValue($EVENT,&#039;STATE_&#039;,$JSONMAP,&#039;&#039;,&#039;negativ&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Das vierte Argument ist optional. Es ist ein (Positiv) Filter, der nur Readings in der Liste erscheinen lässt, die diesem Argument entsprechen, im Beispiel oben wären das alle Readings, die den Ausdruck &amp;quot;positiv&amp;quot; enthalten. Das Argument selber ist eine regexp. &#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird dieses Argument zusammen mit dem Attribut jsonMap benutzt, so wird zuerst das Mapping auf die neuen Readings-Bezeichnungen ausgeführt und erst dann dieser Filter ausgeführt, d. h. es muss auf die ersetzten Readings-Bezeichnungen gefiltert werden! &lt;br /&gt;
* Das fünfte Argument ist ebenfalls optional. Es ist ein (Negativ) Filter. Im obigen Beispiel werden alle Readings, die den Ausdruck &amp;quot;negativ&amp;quot; enthalten, aus den Readings ausgefiltert. Ebenso wie das 4. Argument ist es eine regexp. Im Zusammenspiel mit jsonMap wird hier zuerst der Filter ausgewertet und erst anschließend erfolgt das Mapping auf die neuen Readings-Namen.&lt;br /&gt;
&lt;br /&gt;
=== Auswertung unterbinden ===&lt;br /&gt;
Indem man einen Perl-Aufruf festlegt (geschweifte Klammern), dieser aber nichts zurückgibt, kann man bestimmte unerwünschte Readings ausfiltern. Im einfachsten Fall wäre dies:&lt;br /&gt;
  shellies/DEVNAME/temperature_f:.* {}&lt;br /&gt;
&lt;br /&gt;
Komplexer mit Auswertung der Payload:&lt;br /&gt;
  STATTOPIC/RESULT:.* { $EVENT =~ m{HSBColor...(\d+),(\d+),(\d+)} ? $2 eq ReadingsVal($NAME,&#039;saturation&#039;,&#039;unknown&#039;) ? return : { saturation=&amp;gt;$2 } : return }&lt;br /&gt;
&lt;br /&gt;
=== Perl ===&lt;br /&gt;
Wie am Beispiel der speziellen Funktion &amp;lt;code&amp;gt;json2nameValue()&amp;lt;/code&amp;gt; sowie der Hash-Rückgabe bereits dargestellt, ist es möglich, bei der Auswertung auch Perl-Funktionen einzusetzen, und diverse Variablen an diese zu übergeben. Ebenso ist es möglich, eigenen Perl-Code zu verwenden, der z.B. dann längere Zuordnungstabellen, Event-Reduzierungsmechanismen, ... enthalten kann.&lt;br /&gt;
&lt;br /&gt;
== Events optimieren==&lt;br /&gt;
Leider senden relativ viele Gegenstellen in ihren Standardeinstellungen sehr viele Daten, auch ohne dass sich etwas geändert hätte. Dies erzeugt uU. in FHEM eine erhebliche Last, so dass es dringend zu empfehlen ist, alle Maßnahmen zu prüfen, durch die dieses Verhalten unterbunden oder vermindert werden kann. Dabei sollte möglichst frühzeitig eingegriffen werden, entsprechend den folgenden Handlungsoptionen: Daten, die die firmware gar nicht erst sendet, muss FHEM nicht am Interface-Modul entgegennehmen. Daten, die direkt am Interface-Modul verworfen werden (ignoreRegexp), muss das Client-Modul nicht auswerten. Readings, die man (an einem bestimmten Device) nicht benötigt, sollte man nicht erzeugen, damit keine [[Eventhandler]] aktiv werden müssen, unveränderte, aber gewünschte Daten müssen nicht unbedingt (immer) Events erzeugen.&lt;br /&gt;
&lt;br /&gt;
=== firmware-Einstellungen ===&lt;br /&gt;
Bei manchen firmwares kann man einstellen, ob bzw. wie oft oder aus welchem Anlass Daten gesendet werden sollen. Es wird dringlich empfohlen, bei &amp;quot;gesprächigen&amp;quot; Gegenstellen zu recherchieren, ob und in welcher Weise diese derartige Möglichkeiten bietet. Falls solche nicht vorhanden sind, lohnt es sich, auf den betreffenden Projektseiten nachzufragen, ob es diese Optionen gibt - nicht selten hat sich ein firmware-Autor darüber schlicht noch keine Gedanken gemacht und baut in der nächsten Version ggf. entsprechende Optionen ein?&lt;br /&gt;
&lt;br /&gt;
=== Auswertung unterbinden ===&lt;br /&gt;
(s.o. für Topics/Readings, die gar nicht benötigt werden). Dies ist insbesondere auch zu empfehlen, wenn identische Daten zum gleichen Zeitpunkt sowohl als Klartext wie auch in einem JSON-Format übermittelt werden. In solchen Fällen ist es eher zu empfehlen, die JSON-Zweige zu abonnieren und den Rest (ggf. über einen ignoreRegexp-Eintrag) gar nicht auszuwerten.&lt;br /&gt;
Doppelungen sollten in jedem Fall vermieden werden!&lt;br /&gt;
Grundsätzlich erzeugt jeder Topic eine eigene Event-Loop, mehrere Readings-updates, die aus einer einzigen JSON-Payload abgeleitet werden, erzeugen dagegen eine gemeinsame Event-Loop. Durch solche Maßnahmen läßt sich die Systembelastung deutlich reduzieren.&lt;br /&gt;
Für Daten aus JSON-Payloads besteht darüber hinaus die Möglichkeit, diese komplett auszufiltern (siehe jsonMap weiter oben)&lt;br /&gt;
&lt;br /&gt;
=== event-on-change-reading und Co. ===&lt;br /&gt;
Da die firmwares häufig recht gesprächig programmiert sind, sollte man auf eine sinnvolle Begrenzung der durch Aktualisierungen verursachten Events besonderen Wert legen. Dazu ist in erster Linie das Attribut [[Event-on-change-reading|event-on-change-reading]] zu bearbeiten und ggf. passende threshold-Werte zu setzen, es empfiehlt sich allerdings, dabei auch zu untersuchen, inwieweit die weiteren, funktional ergänzenden Attribute zu setzen sind:&lt;br /&gt;
* [[Event-min-interval|event-min-interval]]&lt;br /&gt;
* [[Event-on-update-reading|event-on-update-reading]]&lt;br /&gt;
* timestamp-on-change-reading und&lt;br /&gt;
* [[Event-aggregator|event-aggregator]]&lt;br /&gt;
&lt;br /&gt;
=== gute Reading-Namen - userReadings ===&lt;br /&gt;
Manchmal werden per MQTT Werte übersendet, die so nicht direkt verwendbar sind. Beispiele hierfür wären:&lt;br /&gt;
* Batteriespannungen in mV (z.B. bei zigbee2mqtt)&lt;br /&gt;
* Farbwerte als Einzelreading (für die Anzeige in FHEM wird aber ein RGB-Wert benötigt)&lt;br /&gt;
In diesen Fällen kann man zwar nicht ohne weiteres den Ausgangswert umrechnen lassen, (über externe Module wie readingsChange sehr wohl), aber es ist über den Weg &amp;quot;userReadings&amp;quot; ohne weiteres möglich, passende Readings zu generieren. Dabei sollte aber zur Verringerung der Systembelastung allgemein sowie ggf. falscher Ergebnisse unbedingt darauf geachtet werden, dass diese auch mit einer &#039;&#039;trigger&#039;&#039;-Angabe versehen sind!&lt;br /&gt;
&lt;br /&gt;
== setList ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeines ===&lt;br /&gt;
Die setList ist dazu gedacht, Kommandos zu definieren, welche an die Gegenstelle gesendet werden können. &lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
In der Regel besteht jede Zeile aus folgenden, per Leerzeichen getrennten Argumenten: &lt;br /&gt;
* einem setter-Namen, ggf. ergänzt durch ein widget (s.u.)&lt;br /&gt;
* einem Topic, unter dem die Payload gesendet werden soll und&lt;br /&gt;
* der Payload.&lt;br /&gt;
Es können diverse Variablen genutzt werden, u.A. auch $EVENT und $EVTPARTx-Elemente, die der Rückgabe (setter-Name und ggf. gesetzter Wert) aus dem jeweiligen &amp;quot;widget&amp;quot; entsprechen.&lt;br /&gt;
&lt;br /&gt;
=== on und off ===&lt;br /&gt;
Damit die weitergehenden Befehle wie &#039;&#039;on-for-timer&#039;&#039; aus den [[DevelopmentModuleIntro#X_Set|SetExtensions]] funktionieren, muss ein MQTT2_DEVICE die Befehle &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; kennen. Diese sollten also - wenn es eine Art &amp;quot;Hauptschalter&amp;quot; gibt - gesondert für diesen Hauptschalter angegeben werden.&lt;br /&gt;
Hat ein Gerät mehrerer solcher &amp;quot;Hauptschalter&amp;quot;, empfiehlt es sich, für jeden dieser Schalter eine eigene MQTT2_DEVICE-Instanz anzulegen.&lt;br /&gt;
&lt;br /&gt;
==== setStateList ====&lt;br /&gt;
Gibt es in einem Device neben dem &amp;quot;Hauptschalter&amp;quot; weitere setzbare Readings (z.B. für Helligkeit und Farbe oder eine Temperatur), empfiehlt es sich v.a. dann, wenn das Gerät den Empfang (bzw. die Ausführung) von Befehlen bestätigt, nur die auf den jeweiligen Hauptschalter bezogenen &#039;&#039;set&#039;&#039;-Anweisungen in &#039;&#039;state&#039;&#039; zu schreiben. Diese (z.B. on, off und toggle) wären dann in das &#039;&#039;setStateList&#039;&#039;-Attribut aufzunehmen.&lt;br /&gt;
&lt;br /&gt;
==== setExtensionsEvent ====&lt;br /&gt;
Will man per SetExtensions realisierte laufende Timer visualisieren, empfiehlt es sich, dieses Attribut zu setzen. &lt;br /&gt;
&lt;br /&gt;
=== widgets ===&lt;br /&gt;
In der setList können prinzipiell alle in [[FHEMWEB/Widgets|Widgets]] dargestellten Eingabemöglichkeiten verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Perl-Kommandos ===&lt;br /&gt;
Eigentlich ist die setList dazu gedacht, eine publish-Anweisungen über das IODev abzusetzen. Da aber generisch auch Perl-Code aufgerufen werden kann, ist dies nicht zwingend, so dass zum einen aus Perl heraus auch mehrfach-Publishes ebenso möglich sind wie beliebige &amp;quot;fhem&amp;quot;-Kommandos, die gar nichts mit MQTT zu tun haben müssen (z.B. das regelmäßige Löschen von evtl. veralteten Readings am betreffenden Gerät). Wird Text zurückgegeben, wird dies als &amp;quot;&amp;lt;topic&amp;gt; &amp;lt;payload&amp;gt;&amp;quot; interpretiert und dies gepublisht, erfolgt gar keine Rückgabe, unterbleibt dies.&lt;br /&gt;
&lt;br /&gt;
== getList ==&lt;br /&gt;
Die getList ist dazu gedacht, asynchrone Abfragen an die Gegenstelle zu ermöglichen. &lt;br /&gt;
Die Syntax dabei ist&lt;br /&gt;
* einem getter-Namen, ggf. ergänzt durch ein widget (s.u.)&lt;br /&gt;
* Reading-Name, unter dem die Antwort erwartet wird&lt;br /&gt;
* einem Topic, unter dem die Payload gesendet werden soll und&lt;br /&gt;
* (optional) der Payload.&lt;br /&gt;
Auch hier können diverse Variablen genutzt werden, und/oder das ganze für die Ausführung von Perl-Code genutzt werden.&lt;br /&gt;
&lt;br /&gt;
== periodicCmd ==&lt;br /&gt;
Für regelmäßige Aufgaben (mit mind. minütlicher Frequenz) kann eine Liste von get- oder set-Kommandos angegeben werden. Dies kann für regelmäßige Abfragen ebenso genutzt werden wie z.B. zum Löschen veralteter Informationen/Readings.&lt;br /&gt;
&lt;br /&gt;
== Abschließende Aufgaben ==&lt;br /&gt;
Um das finale Aussehen des Gerätes zu beeinflussen, stehen dann noch die weiteren allgemeinen Attribute zur Verfügung, die in [[DeviceOverview anpassen]] beschrieben sind.&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:Show_MQTT_traffic.png&amp;diff=40004</id>
		<title>Datei:Show MQTT traffic.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:Show_MQTT_traffic.png&amp;diff=40004"/>
		<updated>2025-02-21T07:48:23Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispiel für einen erfolgreichen publish-Test mit anschließender Rückübermittlung der Daten durch den MQTT-Server&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt&amp;diff=39618</id>
		<title>MQTT2 DEVICE - Schritt für Schritt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt&amp;diff=39618"/>
		<updated>2024-10-28T05:19:06Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: /* gute Reading-Namen - Klartext */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Das Protokoll [[MQTT]] ermöglicht einen flexiblen Datenaustausch zwischen unterschiedlichsten Geräten und FHEM und insbesondere auch bidirektionale Kommunikation von und zu FHEM. Es gibt dabei jedoch nur einen geringen Grad der Standardisierung des Datenaustauschs. In der Praxis sind daher relative viele unterschiedliche Wege aufzufinden, wie die Kommunikation via MQTT in den externen Geräten und Diensten konkret umgesetzt wurde - jeder Autor einer firmware oder Software kann dies so lösen, wie es ihm beliebt, und nicht jeder beherzigt dabei den Grundsatz, dass die Kommunikation via MQTT &amp;quot;leichtgewichtig&amp;quot; sein sollte.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Grundsätzlich stehen für viele Geräte-Typen bereits Vorlagen zur Verfügung, siehe [[AttrTemplate|attrTemplate]], die einem die wesentliche Konfigurationsarbeit abnehmen können, wie sie hier beschrieben ist. Die damit jeweils erzeugten Konfigurationen sind Einrichtungsbeispiele, die v.a. eine in sich konsistenze Zusammenstellung der verschiedenen Attribute enthalten. Es steht jedem User frei, diese Ausgangsbasis dann nach seinem Belieben zu ändern. Spätere Änderungen des verwendeten attrTemplate wirken sich nicht automatisch auf die durch frühere Versionen oder den User nachkonfigurierte Geräte aus! Da es vorkommen kann, dass sich die per MQTT übermittelten Daten und Topics ändern, wenn z.B. eine firmware aktualisiert wurden, kann dies Anpassungen am jeweiligen Template erforderlich machen. Grundsätzlich sollen die per attrTemplate für MQTT2_DEVICE verfügbaren attrTemplate jeweils für die aktuellste verfügbare stabile firmware-Version passen.}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[MQTT2_DEVICE]] bietet eine Vielzahl von Möglichkeiten, auf die verschiedensten Anforderungen einzugehen, und die ein- und ausgehenden Daten zu einem oder mehreren FHEM-[[Gerät|Gerät/en]] zusammenzufassen. Eine Übersicht häufig vorkommender MQTT-Geräte ist in [[MQTT2-Module - Praxisbeispiele]] zu finden.&lt;br /&gt;
 &lt;br /&gt;
Ziel dieses Artikels ist die Darstellung der Schritte, die sich als zweckmäßig erwiesen haben zur Einrichtung von &amp;quot;guten&amp;quot; FHEM-Geräten.&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Viele - teils komplexe Beispiele und weitere Verweise sind im {{Link2Forum|Topic=116162|LinkText=MQTT-Workshop für MQTT2-Module}} zu finden.}}Dabei soll am Ende erreicht werden:&lt;br /&gt;
* standardisierte set- (und ggf. get-)-Kommandos, insbesondere unter Beachtung der [[DevelopmentGuidelinesReadings| Developer Guidelines für Readings]]&lt;br /&gt;
* Schließen des Informationskreises von eventuellen Kommandos bis zur Rückmeldung des (externen) Gerätes oder Dienstes (im Folgenden: &amp;quot;Gegenstelle&amp;quot;)&lt;br /&gt;
* standardisierte Reading-Namen, damit möglichst Auswertungen nicht speziell an das jeweilige Gerät angepasst werden müssen&lt;br /&gt;
* Reduzierung und Vermeidung von unnötigen Datenpunkten und Events&lt;br /&gt;
* Einrichten von regelmäßigen Abfrage-Timern (falls erforderlich!).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung ==&lt;br /&gt;
=== MQTT2_SERVER ===&lt;br /&gt;
Selbst, wenn grundsätzlich ein externer MQTT-Server IO-Device zum Einsatz kommt, ist sehr zu empfehlen, für die Beschäftigung mit einem neuen, unbekannten Device zunächst einen {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} einzurichten. Ist der Port 1883 bereits belegt, nimmt man einfach einen anderen Port, z.B. 1884: &amp;lt;code&amp;gt;define m2server MQTT2_SERVER 1884 global&amp;lt;/code&amp;gt;. Sollte die Gegenstelle tiefer strukturierte Daten im JSON-Format über verschiedene Topics als Payload übermittelt, kann es ausnahmsweise hilfreich sein, &#039;&#039;&#039;in der Einrichtungsphase&#039;&#039;&#039; auch das Attribut &amp;quot;autocreate&amp;quot; am MQTT2_SERVER auf &amp;quot;complex&amp;quot; zu stellen: &amp;lt;code&amp;gt;attr m2server autocreate complex&amp;lt;/code&amp;gt;. Weiter muss die allgemeine [[Autocreate|autocreate-Instanz]] aktiv sein. Für den Regelbetrieb und für einfache, bekannte Devices (sowie für solche, für die bereits attrTemplate vorhanden sind), wird ausdrücklich empfohlen, das &#039;&#039;autocreate&#039;&#039;-Atribut am m2server gar nicht erst zu setzten, dann wird &#039;&#039;autocreate&#039;&#039; mit der (default) Einstellung &#039;&#039;simple&#039;&#039; verwendet. Die Hintergründe sind nachfolgend im Abschnitt zu &#039;&#039;json2nameValue()&#039;&#039; zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Begrifflichkeiten ===&lt;br /&gt;
Ein typisches, von &amp;quot;autocreate&amp;quot; erstelltes Gerät sieht dann z.b. (mit autocreate = simple am MQTT2_SERVER) so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wir unterscheiden bei jeder Zeile des readingList-Attributs vier Elemente, die ersten drei werden jeweils durch einen Doppelpunkt voneinander getrennt:&lt;br /&gt;
==== CID ====&lt;br /&gt;
Dies ist die Gerätekennung (hier: DVES_9B01BD). Diese ist auch Bestandteil des &#039;&#039;define&#039;&#039;, über diese wird ermittelt, zu welchem FHEM-Gerät via MQTT eingehende Informationen zugeordnet werden sollen. Diese Angabe ist weder im define noch in der readingList zwingend, aber in der Definition für den Hauptkanal eines Gerätes empfohlen. Es empfiehlt sich, die CID-Angaben bei eigenen readingList-Einträgen wegzulassen bzw. diese zu löschen. So kann einfacher zwischen automatisch generierten und eigenen Angaben unterschieden werden und die Geräte sind leichter zwischen verschiedenen IO-Modulen zu verschieben.&lt;br /&gt;
==== Topic ====&lt;br /&gt;
Datenpunkt, an den eine Information gesendet wird. Empfangsseitig sind dies hier z.B. &#039;&#039;tele/DVES_9B01BD/STATE&#039;&#039; oder &#039;&#039;tele/DVES_9B01BD/LWT&#039;&#039;.&lt;br /&gt;
Enthält der Topic Doppelpunkte oder Sonderzeichen, kann dies zu Problemen führen. Da der Topic intern als &#039;&#039;regex&#039;&#039; behandelt wird, kann man sich das in solchen Sonderfälle dadurch zu nutze machen, dass man z.B problematische Zeichen durch Punkte oder &amp;quot;beliebige Zeichenfolgen&amp;quot; ersetzt. So kann z.B. aus dem per autocreate erstellten &amp;lt;code&amp;gt;attr reader readingList SMLReader/Strom/sensor/1/obis/1-0:1.8.0/255/value:.* Strombezug_tariflos&amp;lt;/code&amp;gt; folgendes abgeleitet werden: &amp;lt;code&amp;gt;attr reader readingList SMLReader/Strom/sensor/1/obis/1-0.1.8.0/255/value:.* Strombezug_tariflos&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
==== Payload ====&lt;br /&gt;
Der jeweilige Nachrichteninhalt. Da dieser nicht im vorhinein bekannt ist, wird er in der readingList typischerweise als &amp;quot;beliebige Zeichenfolge&amp;quot; (&amp;quot;.*&amp;quot;) notiert.&lt;br /&gt;
&lt;br /&gt;
==== Auswertung ====&lt;br /&gt;
Dies kann entweder direkt der Reading-Name sein, dem die Payload zugeordnet werden soll, oder ein Perl-Ausdruck. Hier wird z.B. die eingehende Information für &#039;&#039;tele/DVES_9B01BD/LWT&#039;&#039; dem Reading &#039;&#039;LWT&#039;&#039; zugeordnet, während die Informationen aus &#039;&#039;tele/DVES_9B01BD/STATE&#039;&#039; an die Funktion &#039;&#039;json2nameValue()&#039;&#039; übergeben werden. &#039;&#039;$EVENT&#039;&#039; entspricht dabei der &#039;&#039;Payload&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== defaults ===&lt;br /&gt;
Für unbekannte Gegenstellen ist zunächst immer zu empfehlen, deren &amp;quot;Grundeinstellungen&amp;quot; zu verwenden, und Anpassungen erst und nur insoweit vorzunehmen, als es für ein besseres Zusammenspiel mit FHEM sinnvoll ist. Abzuraten ist insbesondere von:&lt;br /&gt;
* Änderungen der Topics und Topic-Sturkturen (ausgenommen den Fall, dass schon andere Gegenstellen im Einsatz sind, die identische Topics verwenden)&lt;br /&gt;
* Vergabe von &#039;&#039;friendly names&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Bestandsaufnahme ==&lt;br /&gt;
=== Projektseiten finden ===&lt;br /&gt;
Viele Geräte, die das MQTT-Protokoll verwenden, haben eigene Projektseiten oder API-Beschreibungen, denen man entnehmen kann, wie mit dieser Gegenstelle Daten ausgetauscht werden können. Diese sollte man bei allen weiteren Schritten stets zur Hand haben. Dabei kann es neben der allgemeinen Beschreibung auch ein oder mehrere Detail-Seiten geben, auf denen nähere Informationen zu den spezifischen Geräte zu finden sein können.&lt;br /&gt;
&lt;br /&gt;
=== MQTT - Datenverkehr mitlesen ===&lt;br /&gt;
Sowohl MQTT2_SERVER wie MQTT2_CLIENT bieten in der Detailansicht die Option &#039;&#039;Show MQTT traffic&#039;&#039;. Darüber läßt sich der ein- und ausgehende Datenverkehr bequem mitlesen. Bei MQTT2_CLIENT wird dabei allerdings vorausgesetzt, dass er überhaupt Daten vom MQTT-Server erhält, also insbesondere die &#039;&#039;subscriptions&#039;&#039; korrekt gesetzt sind (falls per Attribut eingeschränkt).&lt;br /&gt;
 &lt;br /&gt;
=== readingList ===&lt;br /&gt;
Zunächst empfiehlt es sich, einfach die Gegenstelle neu zu starten und (ggf. über ein FileLog) aufzuzuzeichnen, was über welchen Topic wie oft an Informationen gesendet wird. Dabei kann und sollte durchaus - sofern dies möglich ist - der eine oder andere Schaltvorgang (z.B. über das Web-Interface der Gegenstelle) durchgeführt werden, sofern dies möglich ist (oder allgemeiner: möglichst viele bekannte Anweisungen   ausführen lassen). Am Ende sollte man eine möglichst vollständige Auflistung in der readingList erhalten haben.&lt;br /&gt;
Falls strukturierte Daten im JSON-Format als Payload verwendet werden, kann man diese auch zusätzlich ohne die Verarbeitung durch &#039;&#039;json2nameValue()&#039;&#039; aufzeichnen, z.B. indem man die betreffende Zeile in der readingList doppelt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    tele/DVES_9B01BD/STATE:.* json_STATE\&lt;br /&gt;
    tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    [...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So kann man mit Hilfe des betreffenden Logs ggf. auch über ein externes Tool wie mosquitto_pub MQTT-Nachrichten an FHEM generieren, ohne darauf warten zu müssen, dass diese von der Gegenstelle selbst erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
=== ignoreRegexp ===&lt;br /&gt;
Manche Gegenstellen senden beim Start Konfigurationsinformationen, die allerdings nicht durch FHEM ausgewertet werden können. Die betreffenden Topics sollte man (allgemein) so in die ignoreRegexp beim MQTT2_SERVER bzw. [[MQTT2_CLIENT]] aufnehmen, dass derartige Informationen künftig gar nicht mehr an MQTT2_DEVICE weitergereicht werden. Danach kann man die betreffenden Zeilen aus der readingList löschen! Entsprechendes gilt für die hierüber generierten Readings.&lt;br /&gt;
&lt;br /&gt;
Weiter ist zu empfehlen, in diese ignoreRegexp auch die Topics aufzunehmen, über die Gegenstellen typischerweise Kommandos entgegennehmen. Dies könnte z.B. so aussehen:&lt;br /&gt;
&amp;lt;code&amp;gt;attr m2server ignoreRegexp shellies/[^/]+/command|cmnd/[^/]+/|homeassistant/.*/config|tasmota/discovery&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Viele Geräte? ===&lt;br /&gt;
==== &amp;quot;split&amp;quot; ====&lt;br /&gt;
Sind auf einer Hardware mehrere &amp;quot;Hauptschalter&amp;quot; vorhanden (z.B. ein Relay-Board), ist sehr zu empfehlen, für jeden dieser &amp;quot;Hauptschalter&amp;quot; ein eigenes FHEM-Gerät anzulegen (für logische Einheiten wie Rollladenaktoren ggf. paarweise). MQTT2_DEVICE unterstützt [[DevelopmentModuleAPI#SetExtensions|SetExtensions]] und kann daher Kommandos wie &amp;quot;on-for-timer&amp;quot; über FHEM-interne Mechanismen gut umsetzen. Dies erfordert allerdings, dass die Kommandos &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; verfügbar sein müssen.&lt;br /&gt;
Wird ein Gerät gesplittet, sollten im Gerät, das den ersten (Haupt-) Kanal repräsentiert dann alle Kommunikationsdaten gebündelt werden, Querverweise zu den weiteren Kanälen kann man über das spezielle Readings &amp;quot;associatedWith&amp;quot; herstellen.&lt;br /&gt;
&lt;br /&gt;
==== bridgeRegexp ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Manche derartige Interfaces müssen zunächst entsprechend konfiguriert werden, dass die zu einem Sensor oder Aktor gehörenden Daten jeweils auf einem eigenen Topic ausgegeben werden. Insbesondere ist dies bei Tasmota (ZigBee oder Bluetooth) der Fall!}}&lt;br /&gt;
In eher seltenen Fällen kommt es vor, dass eine Gegenstelle eine Art &amp;quot;Brücke&amp;quot; zu einer Mehrzahl über diese Brücke anzusteuernder (oder zu empfangender) Aktoren oder Sensoren darstellt. In diesen Fällen kann es geboten sein, die eigentliche Gegenstelle als Hauptdevice darzustellen und für jede weitere Hardware (Sensor oder Aktor) dann ein oder mehrere Einzeldevices anzulegen. Dies kann mit Hilfe des Attributs bridgeRegexp automatisiert erfolgen, wenn sich der Sensor/Aktor aus der Topic-Struktur ablesen läßt. &lt;br /&gt;
&lt;br /&gt;
== readingList optimieren==&lt;br /&gt;
=== gute Reading-Namen - Klartext ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Beachte zur Vergabe von Reading-Namen v.a. auch [[DevelopmentGuidelinesReadings]] und [[DevelopmentGuidelinesAV]].}}&lt;br /&gt;
Viele Gegenstellen senden z.B. einen online/offline-Status als &amp;quot;last will and testament&amp;quot; unter einem Topic, der mit &amp;quot;LWT&amp;quot; endet. Dieses hier sendet zwar passende Daten, aber an einen anderen Topic. In solchen Fällen man kann den von autocreate erzeugten Eintrag einfach anpassen:&lt;br /&gt;
 attr DEVICE readingList /dingtian/DEVNAME/out/lwt_availability:.* LWT&lt;br /&gt;
&lt;br /&gt;
=== Bedingte Hash-Rückgaben ===&lt;br /&gt;
Manchmal erfolgt zwar die Übergabe eines Klartextes als $EVENT - allerdings nicht in der Form, wie man das in FHEM gerne hätte. Hier als &amp;quot;0&amp;quot; oder &amp;quot;1&amp;quot;. Mit etwas Perl und der Rückgabe eines Hashes kann man so etwas beliebig umformen:&lt;br /&gt;
 attr DEVICE readingList DEVNAME/relay/0:.* { $EVENT ? {state=&amp;gt;&#039;on&#039;} : {state=&amp;gt;&#039;off&#039;} }\&lt;br /&gt;
  DEVNAME/status:.* { $EVENT ? {LWT=&amp;gt;&#039;Online&#039;} : {LWT=&amp;gt;&#039;Offline&#039;} }&lt;br /&gt;
Weiteres Beispiel: Der &amp;quot;state&amp;quot; kommt in Großschreibung und soll in Kleinschreibung geändert werden:&lt;br /&gt;
 attr DEVICE readingList switchbot/esp32_2/bot/switchbottwo/state:.* { { state =&amp;gt; lc $EVENT } }&lt;br /&gt;
&lt;br /&gt;
=== json2nameValue() ===&lt;br /&gt;
Mit Hilfe der Funktion json2nameValue() (in Verbindung mit dem attribut &#039;&#039;jsonMap&#039;&#039;) lassen sich &lt;br /&gt;
* &amp;quot;gute Reading-Namen&amp;quot; auch aus JSON-Payloads erzeugen (2. und 3. Argument)&lt;br /&gt;
* unnötige Readings vorab ausfiltern (3., 4. und 5. Argument)&lt;br /&gt;
Beispiele für die Verwendung der Argumente 1 bis 3 sind der commandref in der Erläuterung des Attributs &#039;&#039;jsonMap&#039;&#039; bei MQTT2_DEVICE zu entnehmen, die (wie die Argumente 2 und 3 optionalen) Argumente 4 und 5 entsprechen einem Positiv- bzw.- Negativ-Filter.&lt;br /&gt;
Wird (übergangsweise!) &#039;&#039;autocreate&#039;&#039; in der &#039;&#039;complex&#039;&#039;-Variante eingestellt, werden für alle (bisher nicht bekannten) Topics Einträge wie dieser erzeugt:&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT,&#039;STATE_&#039;,$JSONMAP) }&lt;br /&gt;
* Das zweite Argument (&#039;&#039;STATE_&#039;&#039;) ist ein &amp;quot;Präfix&amp;quot;, der allen aus dem JSON erzeugten Readings aus diesem Topic (zunächst) vorangestellt wird. Mit dessen Hilfe läßt sich rekonsturieren, aus welchem Topic die betreffende Information ursprünglich kam. In der Regel ist dies nach der Einrichtung nicht mehr wichtig, und dieses Argument kann auf &amp;quot;nichts&amp;quot; (zwei einfache Quotes) gestellt werden. Allerdings kann es in Einzelfällen sinnvoll sein, Präfixe zu verwenden, um zwischen scheinbar gleichen Werte aus unterschiedlichen Quellen zu unterscheiden. Dies kann man erst abschließend entscheiden, wenn alle von der Gegenstelle gelieferten Daten bekannt sind.&lt;br /&gt;
* Das dritte Argument &#039;&#039;$JSONMAP&#039;&#039; kann in der Regel so belassen werden. Dann kann mit Hilfe des Attributs &#039;&#039;jsonMap&#039;&#039; eine Zuordnungstabelle für Namensänderungen für die zu generierenden Readingnamen erzeugt und/oder Werte schlicht gelöscht werden. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl6&amp;quot;&amp;gt;&lt;br /&gt;
json2nameValue($EVENT,&#039;STATE_&#039;,$JSONMAP,&#039;positiv&#039;)&lt;br /&gt;
json2nameValue($EVENT,&#039;STATE_&#039;,$JSONMAP,&#039;&#039;,&#039;negativ&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Das vierte Argument ist optional. Es ist ein (Positiv) Filter, der nur Readings in der Liste erscheinen lässt, die diesem Argument entsprechen, im Beispiel oben wären das alle Readings, die den Ausdruck &amp;quot;positiv&amp;quot; enthalten. Das Argument selber ist eine regexp. &#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird dieses Argument zusammen mit dem Attribut jsonMap benutzt, so wird zuerst das Mapping auf die neuen Readings-Bezeichnungen ausgeführt und erst dann dieser Filter ausgeführt, d. h. es muss auf die ersetzten Readings-Bezeichnungen gefiltert werden! &lt;br /&gt;
* Das fünfte Argument ist ebenfalls optional. Es ist ein (Negativ) Filter. Im obigen Beispiel werden alle Readings, die den Ausdruck &amp;quot;negativ&amp;quot; enthalten, aus den Readings ausgefiltert. Ebenso wie das 4. Argument ist es eine regexp. Im Zusammenspiel mit jsonMap wird hier zuerst der Filter ausgewertet und erst anschließend erfolgt das Mapping auf die neuen Readings-Namen.&lt;br /&gt;
&lt;br /&gt;
=== Auswertung unterbinden ===&lt;br /&gt;
Indem man einen Perl-Aufruf festlegt (geschweifte Klammern), dieser aber nichts zurückgibt, kann man bestimmte unerwünschte Readings ausfiltern. Im einfachsten Fall wäre dies:&lt;br /&gt;
  shellies/DEVNAME/temperature_f:.* {}&lt;br /&gt;
&lt;br /&gt;
Komplexer mit Auswertung der Payload:&lt;br /&gt;
  STATTOPIC/RESULT:.* { $EVENT =~ m{HSBColor...(\d+),(\d+),(\d+)} ? $2 eq ReadingsVal($NAME,&#039;saturation&#039;,&#039;unknown&#039;) ? return : { saturation=&amp;gt;$2 } : return }&lt;br /&gt;
&lt;br /&gt;
=== Perl ===&lt;br /&gt;
Wie am Beispiel der speziellen Funktion &amp;lt;code&amp;gt;json2nameValue()&amp;lt;/code&amp;gt; sowie der Hash-Rückgabe bereits dargestellt, ist es möglich, bei der Auswertung auch Perl-Funktionen einzusetzen, und diverse Variablen an diese zu übergeben. Ebenso ist es möglich, eigenen Perl-Code zu verwenden, der z.B. dann längere Zuordnungstabellen, Event-Reduzierungsmechanismen, ... enthalten kann.&lt;br /&gt;
&lt;br /&gt;
== Events optimieren==&lt;br /&gt;
Leider senden relativ viele Gegenstellen in ihren Standardeinstellungen sehr viele Daten, auch ohne dass sich etwas geändert hätte. Dies erzeugt uU. in FHEM eine erhebliche Last, so dass es dringend zu empfehlen ist, alle Maßnahmen zu prüfen, durch die dieses Verhalten unterbunden oder vermindert werden kann. Dabei sollte möglichst frühzeitig eingegriffen werden, entsprechend den folgenden Handlungsoptionen: Daten, die die firmware gar nicht erst sendet, muss FHEM nicht am Interface-Modul entgegennehmen. Daten, die direkt am Interface-Modul verworfen werden (ignoreRegexp), muss das Client-Modul nicht auswerten. Readings, die man (an einem bestimmten Device) nicht benötigt, sollte man nicht erzeugen, damit keine [[Eventhandler]] aktiv werden müssen, unveränderte, aber gewünschte Daten müssen nicht unbedingt (immer) Events erzeugen.&lt;br /&gt;
&lt;br /&gt;
=== firmware-Einstellungen ===&lt;br /&gt;
Bei manchen firmwares kann man einstellen, ob bzw. wie oft oder aus welchem Anlass Daten gesendet werden sollen. Es wird dringlich empfohlen, bei &amp;quot;gesprächigen&amp;quot; Gegenstellen zu recherchieren, ob und in welcher Weise diese derartige Möglichkeiten bietet. Falls solche nicht vorhanden sind, lohnt es sich, auf den betreffenden Projektseiten nachzufragen, ob es diese Optionen gibt - nicht selten hat sich ein firmware-Autor darüber schlicht noch keine Gedanken gemacht und baut in der nächsten Version ggf. entsprechende Optionen ein?&lt;br /&gt;
&lt;br /&gt;
=== Auswertung unterbinden ===&lt;br /&gt;
(s.o. für Topics/Readings, die gar nicht benötigt werden). Dies ist insbesondere auch zu empfehlen, wenn identische Daten zum gleichen Zeitpunkt sowohl als Klartext wie auch in einem JSON-Format übermittelt werden. In solchen Fällen ist es eher zu empfehlen, die JSON-Zweige zu abonnieren und den Rest (ggf. über einen ignoreRegexp-Eintrag) gar nicht auszuwerten.&lt;br /&gt;
Doppelungen sollten in jedem Fall vermieden werden!&lt;br /&gt;
Grundsätzlich erzeugt jeder Topic eine eigene Event-Loop, mehrere Readings-updates, die aus einer einzigen JSON-Payload abgeleitet werden, erzeugen dagegen eine gemeinsame Event-Loop. Durch solche Maßnahmen läßt sich die Systembelastung deutlich reduzieren.&lt;br /&gt;
Für Daten aus JSON-Payloads besteht darüber hinaus die Möglichkeit, diese komplett auszufiltern (siehe jsonMap weiter oben)&lt;br /&gt;
&lt;br /&gt;
=== event-on-change-reading und Co. ===&lt;br /&gt;
Da die firmwares häufig recht gesprächig programmiert sind, sollte man auf eine sinnvolle Begrenzung der durch Aktualisierungen verursachten Events besonderen Wert legen. Dazu ist in erster Linie das Attribut [[Event-on-change-reading|event-on-change-reading]] zu bearbeiten und ggf. passende threshold-Werte zu setzen, es empfiehlt sich allerdings, dabei auch zu untersuchen, inwieweit die weiteren, funktional ergänzenden Attribute zu setzen sind:&lt;br /&gt;
* [[Event-min-interval|event-min-interval]]&lt;br /&gt;
* [[Event-on-update-reading|event-on-update-reading]]&lt;br /&gt;
* timestamp-on-change-reading und&lt;br /&gt;
* [[Event-aggregator|event-aggregator]]&lt;br /&gt;
&lt;br /&gt;
=== gute Reading-Namen - userReadings ===&lt;br /&gt;
Manchmal werden per MQTT Werte übersendet, die so nicht direkt verwendbar sind. Beispiele hierfür wären:&lt;br /&gt;
* Batteriespannungen in mV (z.B. bei zigbee2mqtt)&lt;br /&gt;
* Farbwerte als Einzelreading (für die Anzeige in FHEM wird aber ein RGB-Wert benötigt)&lt;br /&gt;
In diesen Fällen kann man zwar nicht ohne weiteres den Ausgangswert umrechnen lassen, (über externe Module wie readingsChange sehr wohl), aber es ist über den Weg &amp;quot;userReadings&amp;quot; ohne weiteres möglich, passende Readings zu generieren. Dabei sollte aber zur Verringerung der Systembelastung allgemein sowie ggf. falscher Ergebnisse unbedingt darauf geachtet werden, dass diese auch mit einer &#039;&#039;trigger&#039;&#039;-Angabe versehen sind!&lt;br /&gt;
&lt;br /&gt;
== setList ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeines ===&lt;br /&gt;
Die setList ist dazu gedacht, Kommandos zu definieren, welche an die Gegenstelle gesendet werden können. &lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
In der Regel besteht jede Zeile aus folgenden, per Leerzeichen getrennten Argumenten: &lt;br /&gt;
* einem setter-Namen, ggf. ergänzt durch ein widget (s.u.)&lt;br /&gt;
* einem Topic, unter dem die Payload gesendet werden soll und&lt;br /&gt;
* der Payload.&lt;br /&gt;
Es können diverse Variablen genutzt werden, u.A. auch $EVENT und $EVTPARTx-Elemente, die der Rückgabe (setter-Name und ggf. gesetzter Wert) aus dem jeweiligen &amp;quot;widget&amp;quot; entsprechen.&lt;br /&gt;
&lt;br /&gt;
=== on und off ===&lt;br /&gt;
Damit die weitergehenden Befehle wie &#039;&#039;on-for-timer&#039;&#039; aus den [[DevelopmentModuleIntro#X_Set|SetExtensions]] funktionieren, muss ein MQTT2_DEVICE die Befehle &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; kennen. Diese sollten also - wenn es eine Art &amp;quot;Hauptschalter&amp;quot; gibt - gesondert für diesen Hauptschalter angegeben werden.&lt;br /&gt;
Hat ein Gerät mehrerer solcher &amp;quot;Hauptschalter&amp;quot;, empfiehlt es sich, für jeden dieser Schalter eine eigene MQTT2_DEVICE-Instanz anzulegen.&lt;br /&gt;
&lt;br /&gt;
==== setStateList ====&lt;br /&gt;
Gibt es in einem Device neben dem &amp;quot;Hauptschalter&amp;quot; weitere setzbare Readings (z.B. für Helligkeit und Farbe oder eine Temperatur), empfiehlt es sich v.a. dann, wenn das Gerät den Empfang (bzw. die Ausführung) von Befehlen bestätigt, nur die auf den jeweiligen Hauptschalter bezogenen &#039;&#039;set&#039;&#039;-Anweisungen in &#039;&#039;state&#039;&#039; zu schreiben. Diese (z.B. on, off und toggle) wären dann in das &#039;&#039;setStateList&#039;&#039;-Attribut aufzunehmen.&lt;br /&gt;
&lt;br /&gt;
==== setExtensionsEvent ====&lt;br /&gt;
Will man per SetExtensions realisierte laufende Timer visualisieren, empfiehlt es sich, dieses Attribut zu setzen. &lt;br /&gt;
&lt;br /&gt;
=== widgets ===&lt;br /&gt;
In der setList können prinzipiell alle in [[FHEMWEB/Widgets|Widgets]] dargestellten Eingabemöglichkeiten verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Perl-Kommandos ===&lt;br /&gt;
Eigentlich ist die setList dazu gedacht, eine publish-Anweisungen über das IODev abzusetzen. Da aber generisch auch Perl-Code aufgerufen werden kann, ist dies nicht zwingend, so dass zum einen aus Perl heraus auch mehrfach-Publishes ebenso möglich sind wie beliebige &amp;quot;fhem&amp;quot;-Kommandos, die gar nichts mit MQTT zu tun haben müssen (z.B. das regelmäßige Löschen von evtl. veralteten Readings am betreffenden Gerät). Wird Text zurückgegeben, wird dies als &amp;quot;&amp;lt;topic&amp;gt; &amp;lt;payload&amp;gt;&amp;quot; interpretiert und dies gepublisht, erfolgt gar keine Rückgabe, unterbleibt dies.&lt;br /&gt;
&lt;br /&gt;
== getList ==&lt;br /&gt;
Die getList ist dazu gedacht, asynchrone Abfragen an die Gegenstelle zu ermöglichen. &lt;br /&gt;
Die Syntax dabei ist&lt;br /&gt;
* einem getter-Namen, ggf. ergänzt durch ein widget (s.u.)&lt;br /&gt;
* Reading-Name, unter dem die Antwort erwartet wird&lt;br /&gt;
* einem Topic, unter dem die Payload gesendet werden soll und&lt;br /&gt;
* (optional) der Payload.&lt;br /&gt;
Auch hier können diverse Variablen genutzt werden, und/oder das ganze für die Ausführung von Perl-Code genutzt werden.&lt;br /&gt;
&lt;br /&gt;
== periodicCmd ==&lt;br /&gt;
Für regelmäßige Aufgaben (mit mind. minütlicher Frequenz) kann eine Liste von get- oder set-Kommandos angegeben werden. Dies kann für regelmäßige Abfragen ebenso genutzt werden wie z.B. zum Löschen veralteter Informationen/Readings.&lt;br /&gt;
&lt;br /&gt;
== Abschließende Aufgaben ==&lt;br /&gt;
Um das finale Aussehen des Gerätes zu beeinflussen, stehen dann noch die weiteren allgemeinen Attribute zur Verfügung, die in [[DeviceOverview anpassen]] beschrieben sind.&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt&amp;diff=39617</id>
		<title>MQTT2 DEVICE - Schritt für Schritt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt&amp;diff=39617"/>
		<updated>2024-10-28T05:18:40Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: /* gute Reading-Namen - Klartext */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung ==&lt;br /&gt;
Das Protokoll [[MQTT]] ermöglicht einen flexiblen Datenaustausch zwischen unterschiedlichsten Geräten und FHEM und insbesondere auch bidirektionale Kommunikation von und zu FHEM. Es gibt dabei jedoch nur einen geringen Grad der Standardisierung des Datenaustauschs. In der Praxis sind daher relative viele unterschiedliche Wege aufzufinden, wie die Kommunikation via MQTT in den externen Geräten und Diensten konkret umgesetzt wurde - jeder Autor einer firmware oder Software kann dies so lösen, wie es ihm beliebt, und nicht jeder beherzigt dabei den Grundsatz, dass die Kommunikation via MQTT &amp;quot;leichtgewichtig&amp;quot; sein sollte.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Grundsätzlich stehen für viele Geräte-Typen bereits Vorlagen zur Verfügung, siehe [[AttrTemplate|attrTemplate]], die einem die wesentliche Konfigurationsarbeit abnehmen können, wie sie hier beschrieben ist. Die damit jeweils erzeugten Konfigurationen sind Einrichtungsbeispiele, die v.a. eine in sich konsistenze Zusammenstellung der verschiedenen Attribute enthalten. Es steht jedem User frei, diese Ausgangsbasis dann nach seinem Belieben zu ändern. Spätere Änderungen des verwendeten attrTemplate wirken sich nicht automatisch auf die durch frühere Versionen oder den User nachkonfigurierte Geräte aus! Da es vorkommen kann, dass sich die per MQTT übermittelten Daten und Topics ändern, wenn z.B. eine firmware aktualisiert wurden, kann dies Anpassungen am jeweiligen Template erforderlich machen. Grundsätzlich sollen die per attrTemplate für MQTT2_DEVICE verfügbaren attrTemplate jeweils für die aktuellste verfügbare stabile firmware-Version passen.}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[MQTT2_DEVICE]] bietet eine Vielzahl von Möglichkeiten, auf die verschiedensten Anforderungen einzugehen, und die ein- und ausgehenden Daten zu einem oder mehreren FHEM-[[Gerät|Gerät/en]] zusammenzufassen. Eine Übersicht häufig vorkommender MQTT-Geräte ist in [[MQTT2-Module - Praxisbeispiele]] zu finden.&lt;br /&gt;
 &lt;br /&gt;
Ziel dieses Artikels ist die Darstellung der Schritte, die sich als zweckmäßig erwiesen haben zur Einrichtung von &amp;quot;guten&amp;quot; FHEM-Geräten.&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Viele - teils komplexe Beispiele und weitere Verweise sind im {{Link2Forum|Topic=116162|LinkText=MQTT-Workshop für MQTT2-Module}} zu finden.}}Dabei soll am Ende erreicht werden:&lt;br /&gt;
* standardisierte set- (und ggf. get-)-Kommandos, insbesondere unter Beachtung der [[DevelopmentGuidelinesReadings| Developer Guidelines für Readings]]&lt;br /&gt;
* Schließen des Informationskreises von eventuellen Kommandos bis zur Rückmeldung des (externen) Gerätes oder Dienstes (im Folgenden: &amp;quot;Gegenstelle&amp;quot;)&lt;br /&gt;
* standardisierte Reading-Namen, damit möglichst Auswertungen nicht speziell an das jeweilige Gerät angepasst werden müssen&lt;br /&gt;
* Reduzierung und Vermeidung von unnötigen Datenpunkten und Events&lt;br /&gt;
* Einrichten von regelmäßigen Abfrage-Timern (falls erforderlich!).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung ==&lt;br /&gt;
=== MQTT2_SERVER ===&lt;br /&gt;
Selbst, wenn grundsätzlich ein externer MQTT-Server IO-Device zum Einsatz kommt, ist sehr zu empfehlen, für die Beschäftigung mit einem neuen, unbekannten Device zunächst einen {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} einzurichten. Ist der Port 1883 bereits belegt, nimmt man einfach einen anderen Port, z.B. 1884: &amp;lt;code&amp;gt;define m2server MQTT2_SERVER 1884 global&amp;lt;/code&amp;gt;. Sollte die Gegenstelle tiefer strukturierte Daten im JSON-Format über verschiedene Topics als Payload übermittelt, kann es ausnahmsweise hilfreich sein, &#039;&#039;&#039;in der Einrichtungsphase&#039;&#039;&#039; auch das Attribut &amp;quot;autocreate&amp;quot; am MQTT2_SERVER auf &amp;quot;complex&amp;quot; zu stellen: &amp;lt;code&amp;gt;attr m2server autocreate complex&amp;lt;/code&amp;gt;. Weiter muss die allgemeine [[Autocreate|autocreate-Instanz]] aktiv sein. Für den Regelbetrieb und für einfache, bekannte Devices (sowie für solche, für die bereits attrTemplate vorhanden sind), wird ausdrücklich empfohlen, das &#039;&#039;autocreate&#039;&#039;-Atribut am m2server gar nicht erst zu setzten, dann wird &#039;&#039;autocreate&#039;&#039; mit der (default) Einstellung &#039;&#039;simple&#039;&#039; verwendet. Die Hintergründe sind nachfolgend im Abschnitt zu &#039;&#039;json2nameValue()&#039;&#039; zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Begrifflichkeiten ===&lt;br /&gt;
Ein typisches, von &amp;quot;autocreate&amp;quot; erstelltes Gerät sieht dann z.b. (mit autocreate = simple am MQTT2_SERVER) so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wir unterscheiden bei jeder Zeile des readingList-Attributs vier Elemente, die ersten drei werden jeweils durch einen Doppelpunkt voneinander getrennt:&lt;br /&gt;
==== CID ====&lt;br /&gt;
Dies ist die Gerätekennung (hier: DVES_9B01BD). Diese ist auch Bestandteil des &#039;&#039;define&#039;&#039;, über diese wird ermittelt, zu welchem FHEM-Gerät via MQTT eingehende Informationen zugeordnet werden sollen. Diese Angabe ist weder im define noch in der readingList zwingend, aber in der Definition für den Hauptkanal eines Gerätes empfohlen. Es empfiehlt sich, die CID-Angaben bei eigenen readingList-Einträgen wegzulassen bzw. diese zu löschen. So kann einfacher zwischen automatisch generierten und eigenen Angaben unterschieden werden und die Geräte sind leichter zwischen verschiedenen IO-Modulen zu verschieben.&lt;br /&gt;
==== Topic ====&lt;br /&gt;
Datenpunkt, an den eine Information gesendet wird. Empfangsseitig sind dies hier z.B. &#039;&#039;tele/DVES_9B01BD/STATE&#039;&#039; oder &#039;&#039;tele/DVES_9B01BD/LWT&#039;&#039;.&lt;br /&gt;
Enthält der Topic Doppelpunkte oder Sonderzeichen, kann dies zu Problemen führen. Da der Topic intern als &#039;&#039;regex&#039;&#039; behandelt wird, kann man sich das in solchen Sonderfälle dadurch zu nutze machen, dass man z.B problematische Zeichen durch Punkte oder &amp;quot;beliebige Zeichenfolgen&amp;quot; ersetzt. So kann z.B. aus dem per autocreate erstellten &amp;lt;code&amp;gt;attr reader readingList SMLReader/Strom/sensor/1/obis/1-0:1.8.0/255/value:.* Strombezug_tariflos&amp;lt;/code&amp;gt; folgendes abgeleitet werden: &amp;lt;code&amp;gt;attr reader readingList SMLReader/Strom/sensor/1/obis/1-0.1.8.0/255/value:.* Strombezug_tariflos&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
==== Payload ====&lt;br /&gt;
Der jeweilige Nachrichteninhalt. Da dieser nicht im vorhinein bekannt ist, wird er in der readingList typischerweise als &amp;quot;beliebige Zeichenfolge&amp;quot; (&amp;quot;.*&amp;quot;) notiert.&lt;br /&gt;
&lt;br /&gt;
==== Auswertung ====&lt;br /&gt;
Dies kann entweder direkt der Reading-Name sein, dem die Payload zugeordnet werden soll, oder ein Perl-Ausdruck. Hier wird z.B. die eingehende Information für &#039;&#039;tele/DVES_9B01BD/LWT&#039;&#039; dem Reading &#039;&#039;LWT&#039;&#039; zugeordnet, während die Informationen aus &#039;&#039;tele/DVES_9B01BD/STATE&#039;&#039; an die Funktion &#039;&#039;json2nameValue()&#039;&#039; übergeben werden. &#039;&#039;$EVENT&#039;&#039; entspricht dabei der &#039;&#039;Payload&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== defaults ===&lt;br /&gt;
Für unbekannte Gegenstellen ist zunächst immer zu empfehlen, deren &amp;quot;Grundeinstellungen&amp;quot; zu verwenden, und Anpassungen erst und nur insoweit vorzunehmen, als es für ein besseres Zusammenspiel mit FHEM sinnvoll ist. Abzuraten ist insbesondere von:&lt;br /&gt;
* Änderungen der Topics und Topic-Sturkturen (ausgenommen den Fall, dass schon andere Gegenstellen im Einsatz sind, die identische Topics verwenden)&lt;br /&gt;
* Vergabe von &#039;&#039;friendly names&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Bestandsaufnahme ==&lt;br /&gt;
=== Projektseiten finden ===&lt;br /&gt;
Viele Geräte, die das MQTT-Protokoll verwenden, haben eigene Projektseiten oder API-Beschreibungen, denen man entnehmen kann, wie mit dieser Gegenstelle Daten ausgetauscht werden können. Diese sollte man bei allen weiteren Schritten stets zur Hand haben. Dabei kann es neben der allgemeinen Beschreibung auch ein oder mehrere Detail-Seiten geben, auf denen nähere Informationen zu den spezifischen Geräte zu finden sein können.&lt;br /&gt;
&lt;br /&gt;
=== MQTT - Datenverkehr mitlesen ===&lt;br /&gt;
Sowohl MQTT2_SERVER wie MQTT2_CLIENT bieten in der Detailansicht die Option &#039;&#039;Show MQTT traffic&#039;&#039;. Darüber läßt sich der ein- und ausgehende Datenverkehr bequem mitlesen. Bei MQTT2_CLIENT wird dabei allerdings vorausgesetzt, dass er überhaupt Daten vom MQTT-Server erhält, also insbesondere die &#039;&#039;subscriptions&#039;&#039; korrekt gesetzt sind (falls per Attribut eingeschränkt).&lt;br /&gt;
 &lt;br /&gt;
=== readingList ===&lt;br /&gt;
Zunächst empfiehlt es sich, einfach die Gegenstelle neu zu starten und (ggf. über ein FileLog) aufzuzuzeichnen, was über welchen Topic wie oft an Informationen gesendet wird. Dabei kann und sollte durchaus - sofern dies möglich ist - der eine oder andere Schaltvorgang (z.B. über das Web-Interface der Gegenstelle) durchgeführt werden, sofern dies möglich ist (oder allgemeiner: möglichst viele bekannte Anweisungen   ausführen lassen). Am Ende sollte man eine möglichst vollständige Auflistung in der readingList erhalten haben.&lt;br /&gt;
Falls strukturierte Daten im JSON-Format als Payload verwendet werden, kann man diese auch zusätzlich ohne die Verarbeitung durch &#039;&#039;json2nameValue()&#039;&#039; aufzeichnen, z.B. indem man die betreffende Zeile in der readingList doppelt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    tele/DVES_9B01BD/STATE:.* json_STATE\&lt;br /&gt;
    tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    [...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So kann man mit Hilfe des betreffenden Logs ggf. auch über ein externes Tool wie mosquitto_pub MQTT-Nachrichten an FHEM generieren, ohne darauf warten zu müssen, dass diese von der Gegenstelle selbst erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
=== ignoreRegexp ===&lt;br /&gt;
Manche Gegenstellen senden beim Start Konfigurationsinformationen, die allerdings nicht durch FHEM ausgewertet werden können. Die betreffenden Topics sollte man (allgemein) so in die ignoreRegexp beim MQTT2_SERVER bzw. [[MQTT2_CLIENT]] aufnehmen, dass derartige Informationen künftig gar nicht mehr an MQTT2_DEVICE weitergereicht werden. Danach kann man die betreffenden Zeilen aus der readingList löschen! Entsprechendes gilt für die hierüber generierten Readings.&lt;br /&gt;
&lt;br /&gt;
Weiter ist zu empfehlen, in diese ignoreRegexp auch die Topics aufzunehmen, über die Gegenstellen typischerweise Kommandos entgegennehmen. Dies könnte z.B. so aussehen:&lt;br /&gt;
&amp;lt;code&amp;gt;attr m2server ignoreRegexp shellies/[^/]+/command|cmnd/[^/]+/|homeassistant/.*/config|tasmota/discovery&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Viele Geräte? ===&lt;br /&gt;
==== &amp;quot;split&amp;quot; ====&lt;br /&gt;
Sind auf einer Hardware mehrere &amp;quot;Hauptschalter&amp;quot; vorhanden (z.B. ein Relay-Board), ist sehr zu empfehlen, für jeden dieser &amp;quot;Hauptschalter&amp;quot; ein eigenes FHEM-Gerät anzulegen (für logische Einheiten wie Rollladenaktoren ggf. paarweise). MQTT2_DEVICE unterstützt [[DevelopmentModuleAPI#SetExtensions|SetExtensions]] und kann daher Kommandos wie &amp;quot;on-for-timer&amp;quot; über FHEM-interne Mechanismen gut umsetzen. Dies erfordert allerdings, dass die Kommandos &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; verfügbar sein müssen.&lt;br /&gt;
Wird ein Gerät gesplittet, sollten im Gerät, das den ersten (Haupt-) Kanal repräsentiert dann alle Kommunikationsdaten gebündelt werden, Querverweise zu den weiteren Kanälen kann man über das spezielle Readings &amp;quot;associatedWith&amp;quot; herstellen.&lt;br /&gt;
&lt;br /&gt;
==== bridgeRegexp ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Manche derartige Interfaces müssen zunächst entsprechend konfiguriert werden, dass die zu einem Sensor oder Aktor gehörenden Daten jeweils auf einem eigenen Topic ausgegeben werden. Insbesondere ist dies bei Tasmota (ZigBee oder Bluetooth) der Fall!}}&lt;br /&gt;
In eher seltenen Fällen kommt es vor, dass eine Gegenstelle eine Art &amp;quot;Brücke&amp;quot; zu einer Mehrzahl über diese Brücke anzusteuernder (oder zu empfangender) Aktoren oder Sensoren darstellt. In diesen Fällen kann es geboten sein, die eigentliche Gegenstelle als Hauptdevice darzustellen und für jede weitere Hardware (Sensor oder Aktor) dann ein oder mehrere Einzeldevices anzulegen. Dies kann mit Hilfe des Attributs bridgeRegexp automatisiert erfolgen, wenn sich der Sensor/Aktor aus der Topic-Struktur ablesen läßt. &lt;br /&gt;
&lt;br /&gt;
== readingList optimieren==&lt;br /&gt;
=== gute Reading-Namen - Klartext ===&lt;br /&gt;
Viele Gegenstellen senden z.B. einen online/offline-Status als &amp;quot;last will and testament&amp;quot; unter einem Topic, der mit &amp;quot;LWT&amp;quot; endet. Dieses hier sendet zwar passende Daten, aber an einen anderen Topic. In solchen Fällen man kann den von autocreate erzeugten Eintrag einfach anpassen:&lt;br /&gt;
 attr DEVICE readingList /dingtian/DEVNAME/out/lwt_availability:.* LWT&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Beachte zur Vergabe von Reading-Namen v.a. auch [[DevelopmentGuidelinesReadings]] und [[DevelopmentGuidelinesAV]].}}&lt;br /&gt;
&lt;br /&gt;
=== Bedingte Hash-Rückgaben ===&lt;br /&gt;
Manchmal erfolgt zwar die Übergabe eines Klartextes als $EVENT - allerdings nicht in der Form, wie man das in FHEM gerne hätte. Hier als &amp;quot;0&amp;quot; oder &amp;quot;1&amp;quot;. Mit etwas Perl und der Rückgabe eines Hashes kann man so etwas beliebig umformen:&lt;br /&gt;
 attr DEVICE readingList DEVNAME/relay/0:.* { $EVENT ? {state=&amp;gt;&#039;on&#039;} : {state=&amp;gt;&#039;off&#039;} }\&lt;br /&gt;
  DEVNAME/status:.* { $EVENT ? {LWT=&amp;gt;&#039;Online&#039;} : {LWT=&amp;gt;&#039;Offline&#039;} }&lt;br /&gt;
Weiteres Beispiel: Der &amp;quot;state&amp;quot; kommt in Großschreibung und soll in Kleinschreibung geändert werden:&lt;br /&gt;
 attr DEVICE readingList switchbot/esp32_2/bot/switchbottwo/state:.* { { state =&amp;gt; lc $EVENT } }&lt;br /&gt;
&lt;br /&gt;
=== json2nameValue() ===&lt;br /&gt;
Mit Hilfe der Funktion json2nameValue() (in Verbindung mit dem attribut &#039;&#039;jsonMap&#039;&#039;) lassen sich &lt;br /&gt;
* &amp;quot;gute Reading-Namen&amp;quot; auch aus JSON-Payloads erzeugen (2. und 3. Argument)&lt;br /&gt;
* unnötige Readings vorab ausfiltern (3., 4. und 5. Argument)&lt;br /&gt;
Beispiele für die Verwendung der Argumente 1 bis 3 sind der commandref in der Erläuterung des Attributs &#039;&#039;jsonMap&#039;&#039; bei MQTT2_DEVICE zu entnehmen, die (wie die Argumente 2 und 3 optionalen) Argumente 4 und 5 entsprechen einem Positiv- bzw.- Negativ-Filter.&lt;br /&gt;
Wird (übergangsweise!) &#039;&#039;autocreate&#039;&#039; in der &#039;&#039;complex&#039;&#039;-Variante eingestellt, werden für alle (bisher nicht bekannten) Topics Einträge wie dieser erzeugt:&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT,&#039;STATE_&#039;,$JSONMAP) }&lt;br /&gt;
* Das zweite Argument (&#039;&#039;STATE_&#039;&#039;) ist ein &amp;quot;Präfix&amp;quot;, der allen aus dem JSON erzeugten Readings aus diesem Topic (zunächst) vorangestellt wird. Mit dessen Hilfe läßt sich rekonsturieren, aus welchem Topic die betreffende Information ursprünglich kam. In der Regel ist dies nach der Einrichtung nicht mehr wichtig, und dieses Argument kann auf &amp;quot;nichts&amp;quot; (zwei einfache Quotes) gestellt werden. Allerdings kann es in Einzelfällen sinnvoll sein, Präfixe zu verwenden, um zwischen scheinbar gleichen Werte aus unterschiedlichen Quellen zu unterscheiden. Dies kann man erst abschließend entscheiden, wenn alle von der Gegenstelle gelieferten Daten bekannt sind.&lt;br /&gt;
* Das dritte Argument &#039;&#039;$JSONMAP&#039;&#039; kann in der Regel so belassen werden. Dann kann mit Hilfe des Attributs &#039;&#039;jsonMap&#039;&#039; eine Zuordnungstabelle für Namensänderungen für die zu generierenden Readingnamen erzeugt und/oder Werte schlicht gelöscht werden. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl6&amp;quot;&amp;gt;&lt;br /&gt;
json2nameValue($EVENT,&#039;STATE_&#039;,$JSONMAP,&#039;positiv&#039;)&lt;br /&gt;
json2nameValue($EVENT,&#039;STATE_&#039;,$JSONMAP,&#039;&#039;,&#039;negativ&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Das vierte Argument ist optional. Es ist ein (Positiv) Filter, der nur Readings in der Liste erscheinen lässt, die diesem Argument entsprechen, im Beispiel oben wären das alle Readings, die den Ausdruck &amp;quot;positiv&amp;quot; enthalten. Das Argument selber ist eine regexp. &#039;&#039;&#039;Achtung:&#039;&#039;&#039; Wird dieses Argument zusammen mit dem Attribut jsonMap benutzt, so wird zuerst das Mapping auf die neuen Readings-Bezeichnungen ausgeführt und erst dann dieser Filter ausgeführt, d. h. es muss auf die ersetzten Readings-Bezeichnungen gefiltert werden! &lt;br /&gt;
* Das fünfte Argument ist ebenfalls optional. Es ist ein (Negativ) Filter. Im obigen Beispiel werden alle Readings, die den Ausdruck &amp;quot;negativ&amp;quot; enthalten, aus den Readings ausgefiltert. Ebenso wie das 4. Argument ist es eine regexp. Im Zusammenspiel mit jsonMap wird hier zuerst der Filter ausgewertet und erst anschließend erfolgt das Mapping auf die neuen Readings-Namen.&lt;br /&gt;
&lt;br /&gt;
=== Auswertung unterbinden ===&lt;br /&gt;
Indem man einen Perl-Aufruf festlegt (geschweifte Klammern), dieser aber nichts zurückgibt, kann man bestimmte unerwünschte Readings ausfiltern. Im einfachsten Fall wäre dies:&lt;br /&gt;
  shellies/DEVNAME/temperature_f:.* {}&lt;br /&gt;
&lt;br /&gt;
Komplexer mit Auswertung der Payload:&lt;br /&gt;
  STATTOPIC/RESULT:.* { $EVENT =~ m{HSBColor...(\d+),(\d+),(\d+)} ? $2 eq ReadingsVal($NAME,&#039;saturation&#039;,&#039;unknown&#039;) ? return : { saturation=&amp;gt;$2 } : return }&lt;br /&gt;
&lt;br /&gt;
=== Perl ===&lt;br /&gt;
Wie am Beispiel der speziellen Funktion &amp;lt;code&amp;gt;json2nameValue()&amp;lt;/code&amp;gt; sowie der Hash-Rückgabe bereits dargestellt, ist es möglich, bei der Auswertung auch Perl-Funktionen einzusetzen, und diverse Variablen an diese zu übergeben. Ebenso ist es möglich, eigenen Perl-Code zu verwenden, der z.B. dann längere Zuordnungstabellen, Event-Reduzierungsmechanismen, ... enthalten kann.&lt;br /&gt;
&lt;br /&gt;
== Events optimieren==&lt;br /&gt;
Leider senden relativ viele Gegenstellen in ihren Standardeinstellungen sehr viele Daten, auch ohne dass sich etwas geändert hätte. Dies erzeugt uU. in FHEM eine erhebliche Last, so dass es dringend zu empfehlen ist, alle Maßnahmen zu prüfen, durch die dieses Verhalten unterbunden oder vermindert werden kann. Dabei sollte möglichst frühzeitig eingegriffen werden, entsprechend den folgenden Handlungsoptionen: Daten, die die firmware gar nicht erst sendet, muss FHEM nicht am Interface-Modul entgegennehmen. Daten, die direkt am Interface-Modul verworfen werden (ignoreRegexp), muss das Client-Modul nicht auswerten. Readings, die man (an einem bestimmten Device) nicht benötigt, sollte man nicht erzeugen, damit keine [[Eventhandler]] aktiv werden müssen, unveränderte, aber gewünschte Daten müssen nicht unbedingt (immer) Events erzeugen.&lt;br /&gt;
&lt;br /&gt;
=== firmware-Einstellungen ===&lt;br /&gt;
Bei manchen firmwares kann man einstellen, ob bzw. wie oft oder aus welchem Anlass Daten gesendet werden sollen. Es wird dringlich empfohlen, bei &amp;quot;gesprächigen&amp;quot; Gegenstellen zu recherchieren, ob und in welcher Weise diese derartige Möglichkeiten bietet. Falls solche nicht vorhanden sind, lohnt es sich, auf den betreffenden Projektseiten nachzufragen, ob es diese Optionen gibt - nicht selten hat sich ein firmware-Autor darüber schlicht noch keine Gedanken gemacht und baut in der nächsten Version ggf. entsprechende Optionen ein?&lt;br /&gt;
&lt;br /&gt;
=== Auswertung unterbinden ===&lt;br /&gt;
(s.o. für Topics/Readings, die gar nicht benötigt werden). Dies ist insbesondere auch zu empfehlen, wenn identische Daten zum gleichen Zeitpunkt sowohl als Klartext wie auch in einem JSON-Format übermittelt werden. In solchen Fällen ist es eher zu empfehlen, die JSON-Zweige zu abonnieren und den Rest (ggf. über einen ignoreRegexp-Eintrag) gar nicht auszuwerten.&lt;br /&gt;
Doppelungen sollten in jedem Fall vermieden werden!&lt;br /&gt;
Grundsätzlich erzeugt jeder Topic eine eigene Event-Loop, mehrere Readings-updates, die aus einer einzigen JSON-Payload abgeleitet werden, erzeugen dagegen eine gemeinsame Event-Loop. Durch solche Maßnahmen läßt sich die Systembelastung deutlich reduzieren.&lt;br /&gt;
Für Daten aus JSON-Payloads besteht darüber hinaus die Möglichkeit, diese komplett auszufiltern (siehe jsonMap weiter oben)&lt;br /&gt;
&lt;br /&gt;
=== event-on-change-reading und Co. ===&lt;br /&gt;
Da die firmwares häufig recht gesprächig programmiert sind, sollte man auf eine sinnvolle Begrenzung der durch Aktualisierungen verursachten Events besonderen Wert legen. Dazu ist in erster Linie das Attribut [[Event-on-change-reading|event-on-change-reading]] zu bearbeiten und ggf. passende threshold-Werte zu setzen, es empfiehlt sich allerdings, dabei auch zu untersuchen, inwieweit die weiteren, funktional ergänzenden Attribute zu setzen sind:&lt;br /&gt;
* [[Event-min-interval|event-min-interval]]&lt;br /&gt;
* [[Event-on-update-reading|event-on-update-reading]]&lt;br /&gt;
* timestamp-on-change-reading und&lt;br /&gt;
* [[Event-aggregator|event-aggregator]]&lt;br /&gt;
&lt;br /&gt;
=== gute Reading-Namen - userReadings ===&lt;br /&gt;
Manchmal werden per MQTT Werte übersendet, die so nicht direkt verwendbar sind. Beispiele hierfür wären:&lt;br /&gt;
* Batteriespannungen in mV (z.B. bei zigbee2mqtt)&lt;br /&gt;
* Farbwerte als Einzelreading (für die Anzeige in FHEM wird aber ein RGB-Wert benötigt)&lt;br /&gt;
In diesen Fällen kann man zwar nicht ohne weiteres den Ausgangswert umrechnen lassen, (über externe Module wie readingsChange sehr wohl), aber es ist über den Weg &amp;quot;userReadings&amp;quot; ohne weiteres möglich, passende Readings zu generieren. Dabei sollte aber zur Verringerung der Systembelastung allgemein sowie ggf. falscher Ergebnisse unbedingt darauf geachtet werden, dass diese auch mit einer &#039;&#039;trigger&#039;&#039;-Angabe versehen sind!&lt;br /&gt;
&lt;br /&gt;
== setList ==&lt;br /&gt;
&lt;br /&gt;
=== Allgemeines ===&lt;br /&gt;
Die setList ist dazu gedacht, Kommandos zu definieren, welche an die Gegenstelle gesendet werden können. &lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
In der Regel besteht jede Zeile aus folgenden, per Leerzeichen getrennten Argumenten: &lt;br /&gt;
* einem setter-Namen, ggf. ergänzt durch ein widget (s.u.)&lt;br /&gt;
* einem Topic, unter dem die Payload gesendet werden soll und&lt;br /&gt;
* der Payload.&lt;br /&gt;
Es können diverse Variablen genutzt werden, u.A. auch $EVENT und $EVTPARTx-Elemente, die der Rückgabe (setter-Name und ggf. gesetzter Wert) aus dem jeweiligen &amp;quot;widget&amp;quot; entsprechen.&lt;br /&gt;
&lt;br /&gt;
=== on und off ===&lt;br /&gt;
Damit die weitergehenden Befehle wie &#039;&#039;on-for-timer&#039;&#039; aus den [[DevelopmentModuleIntro#X_Set|SetExtensions]] funktionieren, muss ein MQTT2_DEVICE die Befehle &amp;quot;on&amp;quot; und &amp;quot;off&amp;quot; kennen. Diese sollten also - wenn es eine Art &amp;quot;Hauptschalter&amp;quot; gibt - gesondert für diesen Hauptschalter angegeben werden.&lt;br /&gt;
Hat ein Gerät mehrerer solcher &amp;quot;Hauptschalter&amp;quot;, empfiehlt es sich, für jeden dieser Schalter eine eigene MQTT2_DEVICE-Instanz anzulegen.&lt;br /&gt;
&lt;br /&gt;
==== setStateList ====&lt;br /&gt;
Gibt es in einem Device neben dem &amp;quot;Hauptschalter&amp;quot; weitere setzbare Readings (z.B. für Helligkeit und Farbe oder eine Temperatur), empfiehlt es sich v.a. dann, wenn das Gerät den Empfang (bzw. die Ausführung) von Befehlen bestätigt, nur die auf den jeweiligen Hauptschalter bezogenen &#039;&#039;set&#039;&#039;-Anweisungen in &#039;&#039;state&#039;&#039; zu schreiben. Diese (z.B. on, off und toggle) wären dann in das &#039;&#039;setStateList&#039;&#039;-Attribut aufzunehmen.&lt;br /&gt;
&lt;br /&gt;
==== setExtensionsEvent ====&lt;br /&gt;
Will man per SetExtensions realisierte laufende Timer visualisieren, empfiehlt es sich, dieses Attribut zu setzen. &lt;br /&gt;
&lt;br /&gt;
=== widgets ===&lt;br /&gt;
In der setList können prinzipiell alle in [[FHEMWEB/Widgets|Widgets]] dargestellten Eingabemöglichkeiten verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Perl-Kommandos ===&lt;br /&gt;
Eigentlich ist die setList dazu gedacht, eine publish-Anweisungen über das IODev abzusetzen. Da aber generisch auch Perl-Code aufgerufen werden kann, ist dies nicht zwingend, so dass zum einen aus Perl heraus auch mehrfach-Publishes ebenso möglich sind wie beliebige &amp;quot;fhem&amp;quot;-Kommandos, die gar nichts mit MQTT zu tun haben müssen (z.B. das regelmäßige Löschen von evtl. veralteten Readings am betreffenden Gerät). Wird Text zurückgegeben, wird dies als &amp;quot;&amp;lt;topic&amp;gt; &amp;lt;payload&amp;gt;&amp;quot; interpretiert und dies gepublisht, erfolgt gar keine Rückgabe, unterbleibt dies.&lt;br /&gt;
&lt;br /&gt;
== getList ==&lt;br /&gt;
Die getList ist dazu gedacht, asynchrone Abfragen an die Gegenstelle zu ermöglichen. &lt;br /&gt;
Die Syntax dabei ist&lt;br /&gt;
* einem getter-Namen, ggf. ergänzt durch ein widget (s.u.)&lt;br /&gt;
* Reading-Name, unter dem die Antwort erwartet wird&lt;br /&gt;
* einem Topic, unter dem die Payload gesendet werden soll und&lt;br /&gt;
* (optional) der Payload.&lt;br /&gt;
Auch hier können diverse Variablen genutzt werden, und/oder das ganze für die Ausführung von Perl-Code genutzt werden.&lt;br /&gt;
&lt;br /&gt;
== periodicCmd ==&lt;br /&gt;
Für regelmäßige Aufgaben (mit mind. minütlicher Frequenz) kann eine Liste von get- oder set-Kommandos angegeben werden. Dies kann für regelmäßige Abfragen ebenso genutzt werden wie z.B. zum Löschen veralteter Informationen/Readings.&lt;br /&gt;
&lt;br /&gt;
== Abschließende Aufgaben ==&lt;br /&gt;
Um das finale Aussehen des Gerätes zu beeinflussen, stehen dann noch die weiteren allgemeinen Attribute zur Verfügung, die in [[DeviceOverview anpassen]] beschrieben sind.&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=39616</id>
		<title>MQTT2-Module - Praxisbeispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=39616"/>
		<updated>2024-10-27T06:23:33Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Typo korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung: MQTT bzw. MQTT2 in FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht&amp;lt;ref&amp;gt;Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden&amp;lt;/ref&amp;gt;. MQTT2_DEVICE unterstützt u.a. auch die &#039;&#039;setExtensions&#039;&#039; direkt, also z.B. &#039;&#039;on-for-timer&amp;lt;ref&amp;gt;Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die &#039;&#039;split&#039;&#039;-Varianten der attrTemplate-Einrichtung zu verwenden.&amp;lt;/ref&amp;gt;&#039;&#039; sowie &#039;&#039;[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]&#039;&#039;&amp;lt;ref&amp;gt;Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muss dies dort per Attribut eingeschaltet werden&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Einstellungen und Hinweise ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für [[autocreate]] in Verbindung mit MQTT2_SERVER &#039;&#039;&#039;zwingend&#039;&#039;&#039; jeder über MQTT kommunizierende Client eine ClientID angeben muss. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch &amp;quot;Wegwerf&amp;quot;-ClientID&#039;s. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit &#039;&#039;&#039;MQTT2_SERVER als Server (&amp;quot;Broker&amp;quot;)&#039;&#039;&#039;, für diesen sollte dabei &#039;&#039;autocreate&#039;&#039; &#039;&#039;&#039;nicht deaktiviert&#039;&#039;&#039; sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden&amp;lt;ref&amp;gt;Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) ebenfalls aktiv ist.&amp;lt;/ref&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Beispiel&amp;lt;ref&amp;gt;MQTT2_SERVER verwendet als default-Einstellung für &#039;&#039;autocreate&#039;&#039; &#039;&#039;simple&#039;&#039;, ohne dass ein entsprechendes Attribut gesetzt werden müsste. Die Einstellung &#039;&#039;complex&#039;&#039; empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 define MQTT2_FHEM_Server MQTT2_SERVER 1883 global&lt;br /&gt;
&lt;br /&gt;
Falls der MQTT Broker mit Hilfe von [[allowed]] abgesichert wurde, muss in den Geräten ebenfalls User bzw. Passwort eingetragen werden, damit eine MQTT Kommunikation möglich ist.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muss ggf. die &amp;quot;\&amp;quot; entfernen!}}&lt;br /&gt;
&lt;br /&gt;
=== MQTT-Einstellungen in den Geräten ===&lt;br /&gt;
Die Beispiele gehen davon aus, dass die einzubindenden Geräte &#039;&#039;&#039;&#039;&#039;mit den default-Einstellungen&#039;&#039;&#039;&#039;&#039; für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere &#039;&#039;&#039;keine Veränderungen der topic-Pfade&#039;&#039;&#039; vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen.  }}&lt;br /&gt;
&lt;br /&gt;
=== auto-Konfigurations-features ===&lt;br /&gt;
Viele firmwares und Dienste bieten Möglichkeiten an, einer Controller-Software (insbesondere homeassistant) Hilfsdaten zur automatisierten Konfiguration bereitzustellen. Da FHEM diese Daten nicht zu ihrem ursprünglichen Zweck verwenden kann, werden hierdurch lediglich zusätzliche Readings erzeugt, mit denen man als User in der Regel wenig anfangen kann. Es wird daher empfohlen, derartige features &#039;&#039;&#039;abzuschalten&#039;&#039;&#039;. Wo dies nicht möglich ist, sollte man eine passende [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp]] setzen bzw. diese passend erweitern!&lt;br /&gt;
&lt;br /&gt;
=== Schritt für Schritt ===&lt;br /&gt;
Hier werden in der Regel fertige Konfigurationen für häufige Anwendungsfälle (beispielhaft) dargestellt. In [[MQTT2_DEVICE - Schritt für Schritt]] ist etwas mehr über die Vorgehensweise bei der Zusammenstellung der verschiedenen Attribute und deren Zusammenwirken zu erfahren.&lt;br /&gt;
&lt;br /&gt;
== zigbee2mqtt ==&lt;br /&gt;
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]&lt;br /&gt;
[https://www.zigbee2mqtt.io zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.&lt;br /&gt;
&lt;br /&gt;
Einzelheiten zur Vorgehensweise sind auf der Detailseite [[Zigbee2mqtt|zigbee2mqtt]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Tasmota ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. &lt;br /&gt;
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter &#039;&#039;&amp;lt;nowiki&amp;gt;topic = %topic% (tasmota)&amp;lt;/nowiki&amp;gt;&#039;&#039; ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem  Eingabefeld für &#039;&#039;&amp;quot;client ...&amp;quot;&#039;&#039;, siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
=== MQTT2_DEVICE ===&lt;br /&gt;
Dieses sollte bei aktiviertem &#039;&#039;autocreate&#039;&#039; am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen - Schalter ===&lt;br /&gt;
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD IODev m2server&lt;br /&gt;
 attr MQTT2_DVES_9B01BD devStateIcon on:FS20.on:off off:FS20.off:on&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
 attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\&lt;br /&gt;
    off cmnd/DVES_9B01BD/POWER off\&lt;br /&gt;
    reboot cmnd/DVES_9B01BD/Restart 1&lt;br /&gt;
 attr MQTT2_DVES_9B01BD webCmd on:off:reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen - Dimmer ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Dieses Beispiel ist nur bedingt zur Nachahmung zu empfehlen: Prinzipiell kann man Readings und setter in MQTT2_DEVICE fast nach Belieben benennen. Wählt man allerdings &amp;lt;i&amp;gt;FHEM-typische&amp;lt;/i&amp;gt; Namen, kann dies sehr zur Vereinfachung beitragen. Z.B. wird eine Sprachssteuerung bei einem Dimmer üblicherweise automatisch korrekt eingestellt werden, wenn der für die Helligkeit zuständige setter z.B. &amp;lt;i&amp;gt;pct&amp;lt;/i&amp;gt; (oder &amp;lt;i&amp;gt;brightness&amp;lt;/i&amp;gt;) heißt, oder eine abzufragende Temperatur &amp;lt;i&amp;gt;temperature&amp;lt;/i&amp;gt;. Entsprechendes gilt im Rahmen von &amp;lt;i&amp;gt;devspec-Abfragen&amp;lt;/i&amp;gt;.}}Bei einem Dimmer sind einige zusätzliche Anpassungen vorzunehmen. Ein Dimmer wird über &#039;&#039;&#039;POWER&#039;&#039;&#039; geschaltet und über &#039;&#039;&#039;Dimmer&#039;&#039;&#039; gedimmt. Damit das funktioniert, müssen ein stateFormat und devStateIcon zusammenarbeiten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr MQTT2_DVES_2DF34D devStateIcon 10\d.*:dim100%@orange:off 1\d.*:dim12%@orange:off 2\d.*:dim18%@orange:off 3\d.*:dim31%@orange:off 4\d.*:dim43%@orange:off 5\d.*:dim50%@orange:off 6\d.*:dim62%@orange:off 7\d.*:dim68%@orange:off 8\d.*:dim81%@orange:off 9\d.*:dim93%@orange:off 0:FS20.off:on .*:FS20.off@orange:off&lt;br /&gt;
 attr MQTT2_DVES_2DF34D stateFormat {if(ReadingsVal($name,&amp;quot;POWER&amp;quot;,0)eq&amp;quot;off&amp;quot;){0}else{ReadingsVal($name,&amp;quot;Dimmer&amp;quot;,0)}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nun kann man über das Icon ein- und ausschalten und der Zustand des Dimmers wird korrekt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Es fehlt noch ein Slider, um auch dimmen zu können. Zusätzlich muss setList noch um Dimmer erweitert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 attr MQTT2_DVES_2DF34D setList on cmnd/dimmer/POWER on\&lt;br /&gt;
 off cmnd/dimmer/POWER off\&lt;br /&gt;
 Dimmer cmnd/dimmer/Dimmer&lt;br /&gt;
 attr MQTT2_DVES_2DF34D webCmd Dimmer&lt;br /&gt;
 attr MQTT2_DVES_2DF34D widgetOverride Dimmer:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
===== Allgemeines =====&lt;br /&gt;
Für gängige Tasmota-Geräte stehen &#039;&#039;templates&#039;&#039; bereit, mit denen sich diese schnell konfigurieren lassen. &lt;br /&gt;
Beachten Sie dazu den Abschnitt &#039;&#039;attrTemplate&#039;&#039; in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}&lt;br /&gt;
&lt;br /&gt;
===== Kein passendes attrTemplate vorhanden? =====&lt;br /&gt;
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das &amp;quot;&#039;&#039;tasmota_basic&#039;&#039;&amp;quot; anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults &amp;quot;ON&amp;quot; bzw. &amp;quot;OFF&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Allerdings stellt dieses das &#039;&#039;autocreate&#039;&#039; an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das &#039;&#039;autocreate&#039;&#039;-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im &#039;&#039;jsonMap&#039;&#039;-Attribut nur die Angabe &amp;quot;&#039;&#039;POWER1:state&#039;&#039;&amp;quot; zu belassen.&lt;br /&gt;
&lt;br /&gt;
=== on-for-timer ===&lt;br /&gt;
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen &#039;&#039;setter&#039;&#039; in der &#039;&#039;setList&#039;&#039; werden die &#039;&#039;&#039;SetExtensions&#039;&#039;&#039; verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:&lt;br /&gt;
&lt;br /&gt;
==== delay ==== &lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (Attributeingabe via FHEMWEB!):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1*10; &#039;cmnd/DVES_575127/Backlog POWER1 1; delay &#039;.$duration.&#039;; POWER1 0&#039;}&lt;br /&gt;
&lt;br /&gt;
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe [https://tasmota.github.io/docs/Commands/#delay Commands - Tasmota Delay]), also 6 Minuten.&lt;br /&gt;
&lt;br /&gt;
====pulseTime ====&lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (s.o.):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1 &amp;lt; 11.2 ? $EVTPART1*10 : $EVTPART1+100; &#039;CMNDTOPIC/Backlog pulseTime1 &#039;.$duration.&#039;; POWER1 1&#039;}&lt;br /&gt;
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit &#039;&#039;delay&#039;&#039;. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren &amp;quot;normalen&amp;quot; Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites &#039;&#039;save&#039;&#039; nur bis zum nächsten reboot des Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Da nach dem ersten pulseTime setzten, diese immer benutzt wird, kann man mit einem kleine Workaround das Device normal arbeiten lassen. Dafür wird bei jedem anderem Befehl, aus der PulseTime, der Timer deaktiviert.&lt;br /&gt;
Hierfür machen wir uns zu nutzen, dass man mehrere Befehle gleichzeitig an Tasmota senden kann (backlog). Ob diese Lösung auch mit anderen MQTT Firmwares funktioniert, kann ich nicht sagen. Es wurde lediglich mit Tasmota getestet.&lt;br /&gt;
Wir senden also, bevor wir den eigentlich Tasmota Befehl zum Ein- oder Ausschalten schicken, einen Befehl zum deaktivieren des Timers: &amp;quot;pulseTime 0&amp;quot;&lt;br /&gt;
Hier ein Beispiel: (das entsprechende device &amp;quot;DEV_611F3E&amp;quot; muss gegen das eigene ersetzt werden)&lt;br /&gt;
 off:noArg    cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 0&lt;br /&gt;
 on:noArg     cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 1 &lt;br /&gt;
 toggle:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 2&lt;br /&gt;
&lt;br /&gt;
=== zigbee2tasmota ===&lt;br /&gt;
[https://tasmota.github.io/docs/Zigbee/ zigbee2tasmota] ist eine Erweiterung der Tasmota-firmware für Microcontroller, insbesondere dem ESP8266 (und ESP32)(link), über die einige ZigBee-Chipsätze (insbesondere TI CC2530) als [[ZigBee#Koordinator_.28ZigBee_coordinator.2C_ZC.29|Coordinator]] eingebunden werden können, um ein ZigBee-Netzwerk aufzubauen.&lt;br /&gt;
{{Hinweis|Stand 08/2020 war die Einbindung anderer Chipsätze erst in einem Alpha-Stadium; die Zahl der über einen CC2530 einbindbaren ZigBee-Geräte ist daher derzeit relativ begrenzt (ca. 16)!}}&lt;br /&gt;
Auch für diese Lösung stehen einige &#039;&#039;attrTemplate&#039;&#039; zur Verfügung. Nähere Informationen hierzu sind dem Artikel [[Zigbee2Tasmota-MQTT]] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
== ESPurna ==&lt;br /&gt;
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool&#039;sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot; oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.&lt;br /&gt;
&lt;br /&gt;
== Shelly ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.&lt;br /&gt;
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen weitere Geräte angelegt und konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Standardmäßig senden die Shelly-Geräte ihren kompletten Status alle 30 Sekunden. Dies kann man über den Parameter &#039;&#039;mqtt_update_period&#039;&#039; in den &#039;&#039;settings&#039;&#039; ändern, allerdings ist dieser nur über die HTTP-Schnittstelle des Shelly verfügbar. Um diese Statusupdates abzustellen, kann über den Browser folgender Befehl verwendet werden:&lt;br /&gt;
 http://&amp;lt;ip-des-shelly&amp;gt;/settings?mqtt_update_period=0, &lt;br /&gt;
Soweit bekannt, werden dann nur statische updates ausgeschaltet, z.B. für das Relay bzw. angeschlossene Taster oder Schalter; insbesondere Verbrauchswerte werden dennoch aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Shelly1 ===&lt;br /&gt;
&lt;br /&gt;
=== Shellybulb ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate  angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
 Internals:&lt;br /&gt;
   CFGFN     &lt;br /&gt;
   CID        shellybulb_3CC533&lt;br /&gt;
   DEF        shellybulb_3CC533&lt;br /&gt;
   DEVICETOPIC MQTT2_shellybulb_3CC533&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   NAME       MQTT2_shellybulb_3CC533&lt;br /&gt;
   NR         246&lt;br /&gt;
   STATE      ???&lt;br /&gt;
   TYPE       MQTT2_DEVICE&lt;br /&gt;
   READINGS:&lt;br /&gt;
     2018-12-12 19:28:08   status_blue     0&lt;br /&gt;
     2018-12-12 19:28:08   status_brightness 61&lt;br /&gt;
     2018-12-12 19:28:08   status_effect   0&lt;br /&gt;
     2018-12-12 19:28:08   status_gain     26&lt;br /&gt;
     2018-12-12 19:28:08   status_green    0&lt;br /&gt;
     2018-12-12 19:28:08   status_ison     true&lt;br /&gt;
     2018-12-12 19:28:08   status_mode     color&lt;br /&gt;
     2018-12-12 19:28:08   status_red      255&lt;br /&gt;
     2018-12-12 19:28:08   status_temp     3250&lt;br /&gt;
     2018-12-12 19:28:08   status_white    0&lt;br /&gt;
 Attributes:&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, &#039;status_&#039;) }&lt;br /&gt;
   room       MQTT2_DEVICE&lt;br /&gt;
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate &amp;quot;shellybulb&amp;quot; auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly Plug S ===&lt;br /&gt;
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb &amp;gt; 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:&lt;br /&gt;
  attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state =&amp;gt; $EVTPART0&amp;lt;100?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot; } }&lt;br /&gt;
Der Status des MQTT2 Devices zeigt dann bei &amp;lt;100W &amp;quot;off&amp;quot; und sonst &amp;quot;on&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
=== HTTP-Commands ===&lt;br /&gt;
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.&lt;br /&gt;
&lt;br /&gt;
== Shelly Gen2 ==&lt;br /&gt;
=== Vorbereitung ===&lt;br /&gt;
Shelly mit dem WLAN verbinden, entweder über die Shelly APP oder per Laptop auf den Offenen AP des Shelly verbinden und dann übers WebUI des Shelly mit dem Heimischen WLAN verbinden. Über die APP geht dies meist etwas einfach und schneller, besonders wenn man mehrere Shelly Geräte hinzufügen möchte. Durch die BT Unterstützung der Gen2 Geräte, klappt dies meist auch deutlich schneller und zuverlässiger als noch bei Gen 1 Geräten. &lt;br /&gt;
Nachdem der Shelly mit dem WLAN verbunden ist, sollte die Firmware überprüft und gegebenenfalls aktualisiert werden (Stand Anfang 2022 scheint die firmware noch nicht voll ausgereift gewesen zu sein, da dass insbesondere die MQTT-Schnittstelle immer wieder überarbeitet wurde). Bitte KEINE BETA Versionen installieren, wenn nicht dazu aufgefordert wurde.&lt;br /&gt;
Nach dem, durch das Update ausgelösten, Neustart kurz Prüfen ob die Uhrzeit passt, wenn trotz richtiger Zeitzone die Uhrzeit nicht stimmt hilft ein weiterer Neustart.&lt;br /&gt;
Nun auf Networks| Internet (leider in APP und WebUI unterschiedlich), hier auf MQTT und die Einstellungen für den verwendeten MQTT Server treffen. Diese Einstellungen werden auch wieder durch Neustart übernommen.&lt;br /&gt;
=== Shelly Plus 1 ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shelly erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod MQTT2_shellyplus1_441793a34044 MQTT2_DEVICE shellyplus1_441793a34044&lt;br /&gt;
attr MQTT2_shellyplus1_441793a34044 readingList shellyplus1_441793a34044:shellyplus1-441793a34044/online:.* online\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/status/mqtt:.* { json2nameValue($EVENT) }\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/events/rpc:.* { json2nameValue($EVENT) }\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/status/sys:.* { json2nameValue($EVENT) }\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/status/switch_0:.* { json2nameValue($EVENT) }&lt;br /&gt;
attr MQTT2_shellyplus1_441793a34044 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 IODev m2s&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 available_updates_beta_version 0.10.0-beta6&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 cfg_rev 7&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 connected true&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 dst shellyplus1-441793a34044/events&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_free 237568&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_size 458752&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 id 0&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 mac 441793A34044&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 method NotifyStatus&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 online true&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 output false&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_mqtt_connected true&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_id 0&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_output false&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_source WS_in&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tC 39.88&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tF 103.78&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 params_sys_available_updates_beta_version 0.10.0-beta6&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_ts 1646474952.66&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_rssi -57&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_ssid WLAN-Alex&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_sta_ip 192.168.177.167&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_status got ip&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_free 179764&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_size 249456&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 restart_required false&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 source WS_in&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 src shellyplus1-441793a34044&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tC 39.9&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tF 103.9&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 time 11:08&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 unixtime 1646474911&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 uptime 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über die set Anweisung unterhalb der Device Übersicht können wir ein attrTemplate wählen; shellyPlus_1&lt;br /&gt;
Es erscheint eine kurze Übersicht was im Template enthalten ist, dieses befindet sich noch im Aufbau und wird aktuell von der Community aufgebaut und weiterentwickelt. Mit einem Klick auf „set“ laden wir das Template und übernehmen die Einstellungen für den Shelly Plus 1.&lt;br /&gt;
Damit ist der Shelly bereit, im Status wird neben dem Namen auch der Onlinestatus des Shellys (grüner | roter Punkt) so wie eine Lampe mit Toggle (on | off) Funktion und die Temperatur des Shellys angezeigt. Darüber hinaus verschwindet die Lampe und wird durch einen klickbaren Hinweis ersetzt, wenn ein Neustart des Shellys nötig ist.&lt;br /&gt;
&lt;br /&gt;
=== Tipps ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=So nimmt man bei Verwendung eines normalen Schalters (eine Stellung EIN eine AUS) gerne den „Flip“ Mode – damit wird der Shelly IMMER umgeschaltet, egal in welche Stellung der Schalter sich bewegt („Kreuzschaltung“). Diese Einstellungen trifft man grundlegend im WebUI des Shelly (oder  APP) unter „Channel settings“.&lt;br /&gt;
Für den „Flip“ müssen wir die Grundeinstellung des „Power on default“ auch ändern (gleiche Seite) - persönlich wähle ich „Restore last“, also: nach Stromausfall wird der letzte Zustand wieder hergestellt; grundsätzlich gehen alle Modi außer „Match input“.&lt;br /&gt;
}}&lt;br /&gt;
Das aktuelle Template wurde um die Funktion erweitert, den Button Mode umzuschalten. In den meisten Fällen legt man sich auf eine Schaltmethode fest, welche zum Hardware Setup passt.&lt;br /&gt;
&lt;br /&gt;
Manchmal will man aber vielleicht den Hardware Schalter deaktivieren, nennen wir es „Kindersicherung“. Bei Shelly heißt das „detached“.&lt;br /&gt;
Diese Funktion wurde ins Template als „in_mode“ Übernommen. Mögliche set Befehle sind „flip“, „detached“ „toggle“. Bedingung zur Verwendung ist: „relay power on default“ darf NICHT „Match input“ sein. Sollte Follow statt Flip bevorzugt werden, müsste entsprechende Zeile in der setList von „flip“ auf „follow“ angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Der Befehlt lässt sich mit dem webCmd in_mode auch schnell zugänglich in die Übersicht vom Shelly setzen, so erhält man neben dem Status ein Dropdown mit flip detached  und toggle zum schnellen umschalten. Mit webCmdLabel kann man noch einen Namen für das Dropdown setzen.&lt;br /&gt;
&lt;br /&gt;
== OpenMQTTGateway ==&lt;br /&gt;
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich [https://github.com/1technophile/OpenMQTTGateway OpenMQTTGateway] an, z.B. wird für das Auslesen vieler BLE-Seonsoren lediglich ein ESP32-Board ohne Zusatzhardware (ab ca. 5,- Euro in Fernost erhältlich) benötigt, auf das dann eine vorkompilierte firmware geflasht wird (hierfür wird ein USB-seriell-Wandler benötigt).&lt;br /&gt;
&lt;br /&gt;
Nähere Details sind im Artikel [[OpenMQTTGateway]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== 8-Port-Ethernet Board ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse&lt;br /&gt;
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
In diesem {{Link2Forum|Topic=107536|Message=1016379|LinkText=Forenbeitrag}} bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.&lt;br /&gt;
&lt;br /&gt;
== Milight-Bridge ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von &#039;&#039;openmili&#039;&#039; eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel. Allerdings lassen sich manche MiLight-Geräte nicht an die Bridge anlernen, und es werden auch nicht alle Fernbedienungs-Typen voll unterstützt.&lt;br /&gt;
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway&amp;lt;ref&amp;gt;Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist und die zu steuernden Leuchtmittel mit dem Hub bereits verbunden (gepairt) sind bzw. entsprechende Fernbedienungs-Signale empfangen werden können (bei vorhandenem pairing eines Leuchtmittels an die Fernbedienung).&lt;br /&gt;
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen am MiLight-Hub ===&lt;br /&gt;
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.&lt;br /&gt;
Die Einstellungen für &#039;&#039;MQTT topic pattern&#039;&#039; usw. können auf den default-Werten&amp;lt;ref&amp;gt;Diese sind: &amp;lt;br&amp;gt;&#039;&#039;milight/:device_id/:device_type/:group_id&#039;&#039; für &amp;quot;topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/updates/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;update topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/states/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;state topic pattern&amp;quot;. Der Autor hat derzeit folgende Infotypen zum Senden markiert: &amp;quot;status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color&amp;quot; (enthält eventuell zu viele Angaben. Bei einem Eventhandler muss man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).&amp;lt;/ref&amp;gt; belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (&#039;&#039;MQTT Client Status Topic&#039;&#039;), tragen Sie &#039;&#039;milight/LWT&#039;&#039; ein und aktivieren &#039;&#039;Detailed&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Devices ===&lt;br /&gt;
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]&lt;br /&gt;
==== Bridge ====&lt;br /&gt;
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:&lt;br /&gt;
 defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses Device wird nun das &#039;&#039;template&#039;&#039; &#039;&#039;&#039;esp_milight_hub_bridge&#039;&#039;&#039; angewandt.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Leuchtmittel ====&lt;br /&gt;
&lt;br /&gt;
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:&lt;br /&gt;
 defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Devices werden genauso erstellt. &lt;br /&gt;
&lt;br /&gt;
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template &#039;&#039;X_01a_esp_milight_hub_make_rgbw_group&#039;&#039; verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt &#039;&#039;&#039;eine Kopie&#039;&#039;&#039;, die dann modifiziert wird. Diese Kopie ist unter dem Namen &#039;&#039;milight_&amp;lt;RemoteID&amp;gt;_0&#039;&#039; im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele:&lt;br /&gt;
Beispiel für ein RGB-CCT-Device:&lt;br /&gt;
 defmod Licht_Wz_all MQTT2_DEVICE&lt;br /&gt;
 attr Licht_Wz_all IODev MQTT2_Broker&lt;br /&gt;
 attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/&lt;br /&gt;
 attr Licht_Wz_all group Licht&lt;br /&gt;
 attr Licht_Wz_all icon light_control&lt;br /&gt;
 attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 &lt;br /&gt;
 attr Licht_Wz_all room Wohnzimmer&lt;br /&gt;
 attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
 off milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
 level milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 next_mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_up milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 device_id milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 effect milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 commands milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr Licht_Wz_all sortby 1&lt;br /&gt;
 attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue&lt;br /&gt;
 attr Licht_Wz_all webCmdLabel command\ &lt;br /&gt;
 :brightness:saturation\&lt;br /&gt;
 :color_temp:hue&lt;br /&gt;
==== Ein Leuchtmittel, mehrere Fernbedienungen ====&lt;br /&gt;
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen &amp;quot;hört&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }&lt;br /&gt;
&lt;br /&gt;
==== Fernbedienung als Input-Device nutzen ====&lt;br /&gt;
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.&lt;br /&gt;
Um hier nur Differenz-Meldungen direkt an die betreffende myUtils-Funktion zu übergeben und doppelte Events zu verhindern, sollte hier die readingList so angepasst werden, dass nur Messages aus dem &amp;quot;updates&amp;quot;-Zweig ausgewertet werden: &lt;br /&gt;
 defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0&lt;br /&gt;
 attr MiLight_RC1_0 readingList milight/states/0xABCD/fut089/[0-8]:.* {}&lt;br /&gt;
 milight/updates/0xABCD/fut089/0:.* { FHEM::attrT_MiLight_Utils::MPDcontrol(&#039;myMPD&#039;,$EVENT, &#039;Yamaha_Main&#039;) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/1:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW(&#039;Licht_Stehlampe_links&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/2:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW(&#039;Licht_Stehlampe_rechts&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/3:.* { FHEM::attrT_MiLight_Utils::four_Lights_matrix($EVENT, &#039;Licht_WoZi_Vorn_Aussen&#039;, &#039;Licht_WoZi_Vorn_Mitte&#039;, &#039;Licht_WoZi_Hinten_Aussen&#039;, &#039;Licht_WoZi_Hinten_Mitte&#039;) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/4:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Jalousie_WZ&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/5:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Rollladen_WZ_SSO&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/6:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Rollladen_WZ_SSW&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/7:.* {}\&lt;br /&gt;
 milight/updates/0x5D47/fut089/8:.* {}&lt;br /&gt;
 attr MiLight_RC_WZ stateFormat CommandSet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== eBus ==&lt;br /&gt;
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition am eBus ===&lt;br /&gt;
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.&lt;br /&gt;
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. &#039;&#039;ebusd/%circuit/%name&#039;&#039;.&lt;br /&gt;
 --accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name&lt;br /&gt;
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic &#039;&#039;ebusd&#039;&#039; verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit &#039;&#039;ebus...&#039;&#039; zu beginnen!}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition  in FHEM ===&lt;br /&gt;
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem &#039;&#039;&#039;&#039;&#039;vor&#039;&#039;&#039;&#039;&#039; den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der &#039;&#039;readingList&#039;&#039; enthalten, die vom ebus stammen. Da wir die &#039;&#039;readingList&#039;&#039; anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche &#039;&#039;readingList&#039;&#039;-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-&amp;quot;Sammeldevices&amp;quot; genutzt werden, und dessen &#039;&#039;CID&#039;&#039; auf &#039;&#039;ebusd&#039;&#039; geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der &#039;&#039;readingList&#039;&#039; des &amp;quot;Sammeldevices&amp;quot; gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. &lt;br /&gt;
&lt;br /&gt;
Sind die Vorbereitungen abgeschlossen, aktivieren wir &#039;&#039;autocreate&#039;&#039; wieder, allerdings wählen wir als autocreate-Methode &#039;&#039;complex&#039;&#039; aus, da der eBus-Dämon teilweise&amp;lt;ref&amp;gt;Dies betrifft vorrangig die Statusmeldungen&amp;lt;/ref&amp;gt; eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt&amp;lt;ref&amp;gt;Bei Verwendung des MQTT2_CLIENT wird dann die &#039;&#039;readingList&#039;&#039; am bereits definierten MQTT2_DEVICE aus der Kopie des &amp;quot;Sammeldevice&amp;quot; automatisch wieder erstellt bzw. gefüllt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;ebus-Bridge&amp;quot; ====&lt;br /&gt;
Auf das von &#039;&#039;autocreate&#039;&#039; erstellte MQTT2_DEVICE wird nunmehr das template &#039;&#039;eBus_daemon_splitter&#039;&#039; angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. &lt;br /&gt;
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen &#039;&#039;uptime&#039;&#039;, alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;attrTemplate&#039;&#039; läd eine weitere &#039;&#039;attrTemplate&#039;&#039;-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. &lt;br /&gt;
==== &amp;quot;ebusd_bai&amp;quot; und weitere Geräte ====&lt;br /&gt;
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}&lt;br /&gt;
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens &#039;&#039;MQTT2_ebus_bai&#039;&#039; angelegt worden sein.&lt;br /&gt;
&lt;br /&gt;
== Sonos2Mqtt ==&lt;br /&gt;
Aus einem Versuch heraus ist ein {{Link2Forum|Topic=111711|LinkText=kleines Projekt}} geworden: Die Sonos Umgebung mit Hilfe von sonos2mqtt als generisches MQTT2_DEVICE komfortabel in FHEM einzubinden.&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von ein paar Templates ist die grundlegende Einbindung in FHEM nach einer kleinen Installation auf Systemebene schnell erledigt. Es läuft derzeit noch zahlreiche Entwicklung und Ideenfindung, die Fortschritte sind live im Thread oder [[Sonos2mqtt|konsolidiert im Wiki]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Setup im System ===&lt;br /&gt;
Für dies Funktion wird der nodejs Server [https://github.com/svrooij/sonos2mqtt sonos2mqtt] benötigt. Entweder installiert man den lokal, irgendwo im Netzwerk oder nutzt den [[MQTT2-Module - Praxisbeispiele#Verwendung des Docker Containers|Docker Container.]]&lt;br /&gt;
&lt;br /&gt;
Der nodejs Server sonos2mqtt kann aus Sicht von FHEM irgendwo im Netzwerk stehen - aber er muss im gleichen Netzwerk wie die Sonosplayer stehen. Das UPNP Sonosnetzwerk funktioniert nicht über Netzwerksegmente hinweg.&lt;br /&gt;
&lt;br /&gt;
Eine Beschreibung aller Startparameter für sonos2mqtt findet man [https://svrooij.github.io/sonos2mqtt in der offiziellen Doku].&lt;br /&gt;
&lt;br /&gt;
Erreicht der nodejs Server sonos2mqtt den MQTT Server nicht über - default: localhost, Port 1883, keine Anmeldung&amp;quot; - muss der Parameter --mqtt  gesetzt werden! &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800&amp;lt;/code&amp;gt;            # alles gesetzt&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://192.168.0.3:1800&amp;lt;/code&amp;gt;                                                                 # IP Adresse und Port gesetzt, keine Anmeldung am MQTT Server&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://192.168.0.3&amp;lt;/code&amp;gt;                                                                           # IP Adresse gesetzt, Port ist Standard 1883&lt;br /&gt;
&lt;br /&gt;
Erfolgt der Start mit pm2, werden die Parameter mit einem &#039;&#039;zusätzlichen&#039;&#039; doppelten Bindestrich (--) hinter dem nodejs Modul übergeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
pm2 start sonos2mqtt -- --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lokales Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: nodejs und pm2 ist installiert und für alle Benutzer verfügbar. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo npm install -g sonos2mqtt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Je nach Entwicklungsstand sind auch Betaversionen verfügbar. Für aktuelle Betaversionen wird dieser Zusatz beim Setup verwendet. -&amp;gt; sonosmqtt@3.1.0-beta.1&lt;br /&gt;
&lt;br /&gt;
Wird der sonos2mqtt Server auf einer anderen Maschine eingerichtet, ist der Start entsprechend diesem Absatz [[MQTT2-Module - Praxisbeispiele#Autostart von sonos2mqtt im System mit pm2 .28Alternative.29|Autostart von Sonos2mqtt im System mit pm2]] einzurichten.&lt;br /&gt;
&lt;br /&gt;
=== Setup in FHEM ===&lt;br /&gt;
Man definiert lediglich ein Bridge Device, der Rest wird automatisch erledigt.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: &lt;br /&gt;
* autocreate im System ist aktiv. &lt;br /&gt;
* Der verwendete MQTT2_SERVER steht auf &#039;&#039;&#039;autocreate simple&#039;&#039;&#039; (default/Standard).&lt;br /&gt;
* Templates aktuell - FHEM uptodate oder bei Bedarf in der FHEM Kommandozeile aktualisieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ Svn_GetFile(&amp;quot;FHEM/lib/AttrTemplate/mqtt2.template&amp;quot;, &amp;quot;FHEM/lib/AttrTemplate/mqtt2.template&amp;quot;, sub(){ AttrTemplate_Initialize() }) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei der Anwendung des Templates für die Bridge wird das Attribut devicetopic ausgelesen oder auf default sonos gesetzt! &lt;br /&gt;
&lt;br /&gt;
Wird ein anderer Devicetopic verwendet, muss der bei der Anlage der Bridge gesetzt werden!&lt;br /&gt;
&lt;br /&gt;
Diese Zeilen einzeln in der FHEM Kommandozeile oder als Block in der Raw Definition. &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define SonosBridge MQTT2_DEVICE&lt;br /&gt;
attr SonosBridge room MQTT2_DEVICE&lt;br /&gt;
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Template sonos2mqtt_bridge_comfort:&lt;br /&gt;
* setzt das Template sonos2mqtt_bridge auf das Device,&lt;br /&gt;
* lädt die Datei 99_sonos2mqttUtils.pm aus dem contrib Ordner nach,&lt;br /&gt;
* definiert ein notify, dies erledigt im weiteren Betrieb die automatische Konfiguration der automatisch erzeugten MQTT2_DEVICEs. &lt;br /&gt;
** mit dem Template sonos2mqtt_speaker (das Template kann auch manuell auf vorhandene Player angewendet werden, die automatische Erzeugung der Player wird aber empfohlen)&lt;br /&gt;
** Ermittelt Detailinformation des jeweiligen Players (vor allem IP Adresse und Modelnumber)&lt;br /&gt;
** Lädt die Sonosgeräte Icons von den UPNP Devices herunter&lt;br /&gt;
** erweitert das setList input Kommando um den TV Eingang (HDMI, spdif) bzw. Line_IN Eingang falls vorhanden (Modelnumber)&lt;br /&gt;
* Die Player werden automatisch einzeln erzeugt wenn sie mqtt Nachrichten senden (Play/Stop) oder (alle sofort) wenn der sonos2mqtt Server gestartet wird. &lt;br /&gt;
&lt;br /&gt;
==== Wozu dient die Bridge? ====&lt;br /&gt;
Sie stellt ein paar wesentliche Funktionen zu Verfügung&lt;br /&gt;
# Auffangen von nicht benötigten MQTT Nachrichten.&lt;br /&gt;
# Erzeugung/Weiterleitung von Nachrichten für die einzelnen Player - damit auch die Erzeugung von separaten Playern nach dem Schema MQTT2_RINCON12345678901234567.&lt;br /&gt;
# Statusanzeige sonos2mqtt als Reading connected (0 offline, 1 connected, 2 Player connected).&lt;br /&gt;
Sie kann zusätzlich als zentrales Device verwendet werden, um die Sonos Umgebung abzubilden, z.B. Readings für Favoriten  u.ä.&lt;br /&gt;
&lt;br /&gt;
==== Start sonos2mqtt lokal ====&lt;br /&gt;
Der Start / Stop des sonos2mqtt Servers innerhalb von FHEM ist nur lokal simpel möglich. Ist der Server irgendwo im Netzwerk oder im Docker Container, muss man andere Möglichkeiten finden. Der Neustart aus FHEM ist zwar praktisch, aber nicht erforderlich. &lt;br /&gt;
&lt;br /&gt;
Wird eine existierenden Sonos Landschaft inhaltlich verändert (Player dazu/weg), muss der Server neu gestartet werden. Werden Player temporär abgeschaltet, merkt das der Server nach einer Zeit selbst, oder man forciert dies mit einem CheckSubscription an der Bridge.&lt;br /&gt;
&lt;br /&gt;
Soll das Modul sonos2mqtt mit seinen default Einstellungen gestartet werden, genügt dieser kurze Befehl (in der FHEM Kommandozeile):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;pm2 start sonos2mqtt&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Tipp: Verwendet man anstatt &amp;quot;Befehl&amp;quot; den Syntax {qx(Befehl)} in der FHEM Kommandozeile, wirkt der Befehl zwar blockierend aber die Ausgabe erfolgt im Browser und nicht im Logfile. Mit dem Parameter -s erfolgt keine Ausgabe.&lt;br /&gt;
&lt;br /&gt;
==== Autostart von sonos2mqtt mit FHEM ====&lt;br /&gt;
Der Code startet sowohl das sonso2mqtt Modul sofort und implementiert ein notify für den zukünftigen automatischen Start beim Start von FHEM.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start &amp;quot;pm2 -s start sonos2mqtt&amp;quot;&lt;br /&gt;
trigger n_pm2_sonos start&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Autostart von sonos2mqtt im System mit pm2 (Alternative) ===&lt;br /&gt;
Der obige Code startet das sonos2mqtt nodejs Modul mit pm2 beim Start von FHEM. Sollte das nicht funktionieren oder nicht ins gesamte Konzept passen (weil z.B. mehrere nodejs Module geladen werden) kann der automatische Start direkt im System erfolgen. Zunächst dafür das oben eventuell schon definierte notify löschen!&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
delete n_pm2_sonos&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Start des Modul muss nicht mit erhöhten Rechten geschehen! Im Terminal folgendes eingeben (unter dem angemeldeten Benutzer wird sonos2mqtt später immer gestartet):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pm2 start sonos2mqtt&lt;br /&gt;
pm2 startup&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der letzte Befehl &amp;quot;redet&amp;quot;, d.h. es gibt eine Ausgabe in der Art:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[PM2] To setup the Startup Script, copy/paste the following command:&lt;br /&gt;
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man tut einfach genau das, was dasteht: die letzte Zeile kopieren und wieder einfügen und ausführen. Danach muss man die Konfiguration von pm2 noch sichern:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pm2 save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verwendung des Docker Containers ===&lt;br /&gt;
Ergänzend zur [https://svrooij.io/sonos2mqtt/getting-started.html#run-sonos2mqtt-in-docker Original Doku:]&lt;br /&gt;
&lt;br /&gt;
Beim Container findet die Konfiguration der Verbindung zum FHEM in den Environment Variablen statt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
environment:&lt;br /&gt;
  - SONOS2MQTT_DEVICE=192.168.56.207 # hier muss einer der Sonos Lautsprecher stehen&lt;br /&gt;
  - SONOS2MQTT_MQTT=mqtt://192.168.56.121:1883 # mqtt2_server FHEM, erweiterter Syntax siehe oben&lt;br /&gt;
  - SONOS_LISTENER_HOST=192.168.56.121 # Docker host IP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sonos2mqtt mit mehr Komfort ===&lt;br /&gt;
Im Wiki Artikel [[Sonos2mqtt]] geht es weiter.&lt;br /&gt;
&lt;br /&gt;
== Owntracks GPS Tracking in FHEM über MQTT - Cloud ==&lt;br /&gt;
Das hier gezeiget Beispiel verwendet eine MQTT Instanz im Internet, die mit einem MQTT2_CLIENT angebunden wird. Da wenig Traffic benötigt wird, genügt z.B. eine kostenfreie Instanz z.B. bei myqtthub (Stand. Dezember 2020)&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man einen MQTT2_SERVER auch direkt verfügbar machen, wenn man sich sicher ist was man da tut! Siehe {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}}. Das Bridge Device wird dabei genau so benötigt, nur der IODev ist dann der MQTT2_SERVER.&lt;br /&gt;
&lt;br /&gt;
=== owntracks auf dem Smartphone konfigurieren ===&lt;br /&gt;
Menü / Einstellung / Verbindung &lt;br /&gt;
&lt;br /&gt;
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):&lt;br /&gt;
* Modus -&amp;gt; MQTT&lt;br /&gt;
* Hostname  -&amp;gt; &lt;br /&gt;
** Hostnamen: host.cloud.com &lt;br /&gt;
** Port: 8883 &lt;br /&gt;
** ClientID: ID vom Provider &lt;br /&gt;
** WebSockets (nicht nutzen)&lt;br /&gt;
* Identifikation -&amp;gt; &lt;br /&gt;
** Benutzername: user-name &lt;br /&gt;
** Passwort: user-password &lt;br /&gt;
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)&lt;br /&gt;
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte)&lt;br /&gt;
* Sicherheit -&amp;gt; &lt;br /&gt;
** TLS aktivieren&lt;br /&gt;
=== Definition in FHEM ===&lt;br /&gt;
Der MQTT2_CLIENT wird so eingerichtet, man braucht eine andere ClientID als auf dem Smartphone! Stimmt alles sollte das Gerät sofort open anzeigen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MQTT2_CLIENT einrichten, autocreate simpel&lt;br /&gt;
define mqtt2Cloud MQTT2_CLIENT host.cloud.com:8883&lt;br /&gt;
attr mqtt2Cloud SSL 1&lt;br /&gt;
attr mqtt2Cloud autocreate simple&lt;br /&gt;
attr mqtt2Cloud clientId fhem1&lt;br /&gt;
attr mqtt2Cloud room MQTT2_IO&lt;br /&gt;
attr mqtt2Cloud username user-name&lt;br /&gt;
set mqtt2Cloud password user-password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die automatische Erzeugung der Trackergeräte in FHEM richtig man zuerst ein Bridge Device ein:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define MQTT2_Cloud_bridge MQTT2_DEVICE&lt;br /&gt;
attr MQTT2_Cloud_bridge IODev mqtt2Cloud&lt;br /&gt;
attr MQTT2_Cloud_bridge autocreate 1&lt;br /&gt;
attr MQTT2_Cloud_bridge room MQTT2_DEVICE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dies wird entweder mit dem Template allgemein  konfiguriert&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set MQTT2_Cloud_bridge attrTemplate MQTT2_CLIENT_general_bridge&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;oder manuell nur für owntracks eingerichtet&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr MQTT2_Cloud_bridge bridgeRegexp owntracks/[^/]+/([^/:]+).* &amp;quot;owntracks_$1&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;MQTT2 Geräte für owntracks werden jetzt automatisch mit dem Namen MQTT2_owntracks_&amp;lt;GeräteID&amp;gt; erzeugt. Diese werden einfach mit dem Template owntracks_device fertig konfiguriert. Bei einem IOS Gerät kann man danach noch das Template owntracks_device_IOS als Erweiterung anwenden.&lt;br /&gt;
&lt;br /&gt;
==== Anwesenheitserkennung ====&lt;br /&gt;
Die Anwesenheit kann im owntracks Device direkt für die selbst definierten Plätze abgelesen werden: entweder steht im reading place der jeweilige Ort oder away. Um hier noch eine gewisse Einheitlichkeit in der Verwendung zu bekommen kann man ein PRESENCE Device verwenden: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define OT_Mi6 PRESENCE event MQTT2_owntracks_mi6:place:.away MQTT2_owntracks_mi6:place:.&amp;lt;Home&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Im Move Modus erfolgt die Erkennung sehr schnell und damit einige Sekunden eher als eine BT Erkennung im Haus - der Akkuverbrauch steigt enorm. Im Significant Modus kann es schon mal ein paar Minuten dauern - ein relevanter Akku Verbrauch ist nicht erkennbar.&lt;br /&gt;
&lt;br /&gt;
== Owntracks GPS Tracking in FHEM direkt an den eigenen Fhem-Server ==&lt;br /&gt;
Dieses Beispiel beschreibt den direkten MQTT2 Zugang wobei das IODev dann der MQTT2_SERVER ist. Hierzu bitte {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}} lesen.&lt;br /&gt;
&lt;br /&gt;
=== SSL - Zertifikate fuer fhem erstellen. ===&lt;br /&gt;
Zunächst erstellen wir fuer den MQTT - Server CA zertifizierte SSL Zertifikate. Diese sind identisch mit den SSL - Zertifikaten, welche man evtl. schon fuer den SSL - Zugang seines FHEMWEB - Device erstellt hat. &lt;br /&gt;
&lt;br /&gt;
Hat man den FHEMWEB schon mit eiem SSL Zertifikat (http&#039;&#039;&#039;&amp;lt;u&amp;gt;s&amp;lt;/u&amp;gt;&#039;&#039;&#039;://) abgesichert, muss man daraus nur noch den .p12 - Container erstellen. &lt;br /&gt;
&lt;br /&gt;
Hat man den FHEMWEB noch nicht abgesichert (http://), dann wir es höchste Zeit! &lt;br /&gt;
&lt;br /&gt;
Für die Erstellung dieser SSL Zertifikate folgt dem Wiki-Beitrag [[FHEM mit HTTPS SSL-Zertifikat und eine eigene Zertifizierungsstelle]]. &lt;br /&gt;
&lt;br /&gt;
Die darin beschriebenen Dateien, das cacert.pem sowie den server.p12 - Container müsst ihr nun an euer Mobiltelefon senden.&lt;br /&gt;
&lt;br /&gt;
=== Definition in FHEM ===&lt;br /&gt;
Der MQTT2_Server wird wie folgt eingerichtet.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define myMQTT2Server_extern MQTT2_SERVER IPV6:1884 global&lt;br /&gt;
attr MQTTBroker_extern SSL 1&lt;br /&gt;
attr MQTTBroker_extern autocreate complex&lt;br /&gt;
attr MQTTBroker_extern event-on-change-reading .*&lt;br /&gt;
attr MQTTBroker_extern group MQTT2&lt;br /&gt;
attr MQTTBroker_extern icon mqtt_broker&lt;br /&gt;
attr MQTTBroker_extern room MQTT2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der MQTT2_Server wird zusätzlich über &amp;quot;allowed&amp;quot; abgesichert:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define allowed_MQTT2Server_extern allowed&lt;br /&gt;
attr allowed_MQTT2Server_extern DbLogExclude .*&lt;br /&gt;
attr allowed_MQTT2Server_extern group MQTT2&lt;br /&gt;
attr allowed_MQTT2Server_extern room  MQTT2&lt;br /&gt;
attr allowed_MQTT2Server_extern validFor myMQTT2Server_extern&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Jetzt vergeben wir noch einen Usernamen und ein Passwort für dieses &amp;quot;allowed&amp;quot; - Device&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set allowed_MQTT2Server_extern basicAuth MyMQTT2Username MyMQTT2Password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Denkt bitte daran einen eigenen Usernamen und ein eigenes langes, kompliziertes Passwort zu verwenden. Vorsicht bei Sonderzeichen!&lt;br /&gt;
&lt;br /&gt;
=== Port-Freigaben im Router ===&lt;br /&gt;
An dieser Stelle müssen wir den Port 1884 in den Internet - Freigaben eures Routers freigeben.&lt;br /&gt;
&lt;br /&gt;
Bei der Fritz!Box wird dies beispielsweise unter Internet -&amp;gt; Freigaben -&amp;gt; Port-Freigaben gemacht. Die Details hierzu entnehmt bitte der Bedienungsanleitung eures Routers.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist dabei, das ihr das Protokol &amp;quot;TCP&amp;quot; verwendet und der Port 1884 extern nach Port 1884 intern an die IP - Adresse des jeweiligen fhem-Servers übermittelt wird.&lt;br /&gt;
&lt;br /&gt;
=== owntracks auf dem Smartphone konfigurieren ===&lt;br /&gt;
Menü / Einstellung / Verbindung &lt;br /&gt;
&lt;br /&gt;
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):&lt;br /&gt;
* Modus -&amp;gt; MQTT&lt;br /&gt;
* Hostname  -&amp;gt; &lt;br /&gt;
** Hostnamen: subdomain.dyndns.com &lt;br /&gt;
** Port: 1884 &lt;br /&gt;
** ClientID: Vorname_Nachname &lt;br /&gt;
** WebSockets (nicht nutzen)&lt;br /&gt;
* Identifikation -&amp;gt; &lt;br /&gt;
** Benutzername: MyMQTT2Username &lt;br /&gt;
** Passwort: MyMQTT2Password &lt;br /&gt;
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)&lt;br /&gt;
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte. Empfehlung: Die Initialien verwenden.)&lt;br /&gt;
* Sicherheit -&amp;gt; &lt;br /&gt;
** TLS aktivieren&lt;br /&gt;
** CA-Zertifikat: cacert.pem&lt;br /&gt;
** Client-Zertifikat: server.p12&lt;br /&gt;
** Passwort fuer Client-Zertifikat: Passwort für den server.p12 - Container&lt;br /&gt;
&lt;br /&gt;
Wenn alles richtig gemacht wurde, dann erstellt das myMQTT2Server_extern - Device automatisch ein neues Device für jede owntracks-App, die sich an dem myMQTT2Server_extern - Device meldet.&lt;br /&gt;
&lt;br /&gt;
Übrigens: Will man seine gesamte Familie ebenfalls über owntracks tracken, so muss man in den jeweiligen APPs nur die Werte für ClientID, GeräteID und TrackerID individuell gestalten. &lt;br /&gt;
&lt;br /&gt;
An den fhem- Einstellungen müssen keine weiteren Änderungen vorgenommen werden.&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===&lt;br /&gt;
Nutzt man das rawEvents-Attribut am MQTT2-IO&amp;lt;ref&amp;gt;z.B. &amp;lt;code&amp;gt;attr MQTT2_FHEM_Server rawEvents .*&amp;lt;/code&amp;gt;, der regex-Filter kann wie üblich angepasst werden&amp;lt;/ref&amp;gt;, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.&lt;br /&gt;
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit &amp;lt;code&amp;gt;attr mqtt2_server verbose 5&amp;lt;/code&amp;gt; auch alles ins FHEM-Log schreiben lassen.&lt;br /&gt;
&lt;br /&gt;
=== autocreate funktioniert anscheinend nicht? ===&lt;br /&gt;
In der Regel wird bei neu eingehenden MQTT-Messages über &#039;&#039;autocreate&#039;&#039; ein neues Device erstellt, wenn Nachrichten von einem bisher unbekannten Gerät kommen. Geschieht dies nicht, sollten folgende Punkte geprüft werden:&lt;br /&gt;
# (nur bei MQTT2_SERVER:) Der Client muss eine ClientID angeben, diese darf nicht den defaults von &#039;&#039;mosquito_sub&#039;&#039; entsprechen.&lt;br /&gt;
# Ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) muss vorhanden und aktiv sein.&lt;br /&gt;
# &#039;&#039;autocreate&#039;&#039; am IO muss eingeschaltet sein, was für MQTT2_SERVER bedeutet, dass es nicht auf &amp;quot;0&amp;quot; stehen darf (hier ist dann &#039;&#039;simple&#039;&#039; die aktive Voreinstellung), für MQTT2_CLIENT sollte ebenfalls &#039;&#039;simple&#039;&#039; verwendet werden; dies muss hier allerdings explizit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Wird dann immer noch kein Device erstellt, gibt es in aller Regel ein Device, das bereits einen entsprechenden Eintrag in der readingList enthält, oder es sind keine Nachrichten eingegangen. Überprüfen Sie daher dann ggf. die Einstellungen am Client-Gerät (z.B. im Web-Interface des Shelly oder Tasmota-geflashten ESP8266).&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;autocreate&#039;&#039; am Device schließlich bestimmt, ob die &#039;&#039;readingsList&#039;&#039; erweitert werden darf, wenn Informationen über bisher nicht über die readingList abgedeckte Topics empfangen werden und vom MQTT2-IO als zu diesem Device/ClientID gehörend identifiziert wurden.&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Die per attrTemplate jeweils erzeugten Konfigurationen sind Einrichtungsbeispiele, die v.a. eine in sich konsistenze Zusammenstellung der verschiedenen Attribute enthalten. Es steht jedem User frei, diese Ausgangsbasis dann nach seinem Belieben zu ändern. Spätere Änderungen des verwendeten attrTemplate wirken sich nicht automatisch auf die durch frühere Versionen oder den User nachkonfigurierte Geräte aus! Da es vorkommen kann, dass sich die per MQTT übermittelten Daten und Topics ändern, wenn z.B. eine firmware aktualisiert wurden, kann dies Anpassungen am jeweiligen Template erforderlich machen. Grundsätzlich sollen die per attrTemplate für MQTT2_DEVICE verfügbaren attrTemplate jeweils für die aktuellste verfügbare stabile firmware-Version passen.}}&lt;br /&gt;
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; genutzt werden. &lt;br /&gt;
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate: Es werden nicht alle templates angezeigt ===&lt;br /&gt;
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate und Sprachsteuerung ===&lt;br /&gt;
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; dem betreffenden Hauptartikel zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
=== bridgeRegexp ===&lt;br /&gt;
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch &#039;&#039;&#039;&#039;&#039;einem&#039;&#039;&#039;&#039;&#039; &#039;&#039;MQTT2_DEVICE&#039;&#039; zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. In dem nebenstehenden Schaubild wären dies die Geräte &#039;&#039;A&#039;&#039; bis &#039;&#039;D&#039;&#039;. Das &#039;&#039;&#039;Attribut&#039;&#039;&#039; &#039;&#039;bridgeRegexp&#039;&#039; kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem &#039;&#039;&#039;anderen Device&#039;&#039;&#039; (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als &#039;&#039;newClientId&#039;&#039; hinterlegte Angabe verwendet. In nebenstehendem Schaubild ist dies exemplarisch für die Gerätegruppe &#039;&#039;D&#039;&#039; mit dem &#039;&#039;bridge&#039;&#039;-Device &#039;&#039;D&#039;&#039; und dessen &#039;&#039;Satelliten&#039;&#039; &#039;&#039;D1&#039;&#039; bis &#039;&#039;D4&#039;&#039; dargestellt.&lt;br /&gt;
Dementsprechend sind in den hier aufgeführten Beispielen &#039;&#039;bridgeRegexp&#039;&#039;-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren, wie z.B. für über hier dargestellten &#039;&#039;zigbee2mqtt&#039;&#039; oder &#039;&#039;zigbee2tasmota&#039;&#039;. Ein Sonderfall hierbei ist das template &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem &#039;&#039;mosquitto&#039;&#039;-Server und würden sonst alle ein und demselben MQTT2_DEVICE zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Ständig neue Devices? ===&lt;br /&gt;
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:&lt;br /&gt;
==== Vergabe einer ClientID ====&lt;br /&gt;
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). &lt;br /&gt;
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID&#039;s. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.&lt;br /&gt;
&lt;br /&gt;
==== Löschen der ClientID aus der readingList usw. ====&lt;br /&gt;
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den &#039;&#039;default&#039;&#039; &amp;quot;sonoff&amp;quot; zu ändern).&lt;br /&gt;
Beispielsweise wäre &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt; zu ändern in &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt;&lt;br /&gt;
Die über &#039;&#039;attrTemplate&#039;&#039; verfügbaren Konfigurationen verwenden in der Regel keine ClientID&#039;s bzw. entfernen diese.&lt;br /&gt;
&lt;br /&gt;
=== Wildcards in readingList und setList ===&lt;br /&gt;
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;readingList&#039;&#039; werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise durch einen &amp;quot;/&amp;quot;) kann man so schreiben: &amp;quot;[^/]+&amp;quot; (entspricht: &amp;quot;Mindestens ein Zeichen, das kein Schrägstrich ist&amp;quot;). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;setList&#039;&#039; gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht &amp;quot;+&amp;quot; für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es &amp;quot;Gruppen-Topics&amp;quot;, auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.&lt;br /&gt;
&lt;br /&gt;
=== Die JSON-Daten sollen ausnahmsweise nicht ausgepackt werden ===&lt;br /&gt;
In manchen Fällen ist das automatische Auspacken der JSON-Payload nicht erwünscht. In diesen Fällen kann man einfach den gewünschten Reading-Namen in die readingList eintragen, statt der Anweisung, den JSON an json2NameValue() zu übergeben. Aus&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* { json2nameValue($EVENT) }\&lt;br /&gt;
owntracks/clouduser/mi6/waypoints:.* { json2nameValue($EVENT) }\&lt;br /&gt;
owntracks/clouduser/mi6/event:.* { json2nameValue($EVENT) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
wird dann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* json_mi6\&lt;br /&gt;
owntracks/clouduser/mi6/waypoints:.* json_waypoints\&lt;br /&gt;
owntracks/clouduser/mi6/event:.* json_event&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erforderlichenfalls kann man die Einträge auch doppelt erstellen, um sowohl den JSON wie auch die ausgepackten Readings zu erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Die JSON-Daten vor dem auspacken manipulieren ===&lt;br /&gt;
Aus diversen Gründen kann es zweckmäßig sein, einen bestimmten Wert der JSON-Payload zu ignorieren.&lt;br /&gt;
Z.B. sendet ein Client statt eines Messwertes die Info &amp;quot;bad&amp;quot;. Dieser Fehlerwert soll aus der JSON-Payload &amp;quot;ausgefiltert&amp;quot; werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr DEVICE readingList &amp;lt;your topic&amp;gt;:.* { my $rets = json2nameValue($EVENT,&#039;&#039;,$JSONMAP);; my %cleaned = map { $_,$rets-&amp;gt;{$_} } grep { &#039;bad&#039; ne $rets-&amp;gt;{$_} } keys %{$rets};; return \%cleaned }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch einen Wert umzubenennen wenn die JSON-Payload nur ein Objekt beinhaltet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr DEVICE readingList &amp;lt;your topic&amp;gt;:.* {my %h=(0=&amp;gt;&#039;SofortLaden&#039;,1=&amp;gt;&#039;MinPV&#039;,2=&amp;gt;&#039;NurPV&#039;,3=&amp;gt;&#039;Stop&#039;,4=&amp;gt;&#039;Standby&#039;);; return {ChargeMode=&amp;gt;$h{$EVENT}}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unnötige Konfigurationsinformationen verwerfen ===&lt;br /&gt;
Siehe Einleitung und den [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp-Abschnitt zu MQTT2_CLIENT]].&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Themen ===&lt;br /&gt;
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====&lt;br /&gt;
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeugen kann. So kann man z.B. Messdaten eines Systems über ein &#039;&#039;notify&#039;&#039; iVm. einer einfachen &#039;&#039;publish&#039;&#039;-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.&lt;br /&gt;
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten &#039;&#039;bridgeRegexp&#039;&#039; automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:&lt;br /&gt;
 attr MQTT2_myMqttServer bridgeRegexp \&lt;br /&gt;
   SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* &amp;quot;mgb2_$1&amp;quot;&lt;br /&gt;
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema &#039;&#039;SmartHome/MqttGenericBridge2/&amp;lt;Device-Name&amp;gt;/&amp;lt;Reading-Name&amp;gt;&#039;&#039; versendet.&lt;br /&gt;
&lt;br /&gt;
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====&lt;br /&gt;
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in  {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}&lt;br /&gt;
&lt;br /&gt;
näher erläutert.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}&lt;br /&gt;
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}&lt;br /&gt;
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}&lt;br /&gt;
* {{Link2Forum|Topic=116162|LinkText=Der MQTT-Workshop für MQTT2-Module}}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=AttrTemplate&amp;diff=39373</id>
		<title>AttrTemplate</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=AttrTemplate&amp;diff=39373"/>
		<updated>2024-06-26T13:56:59Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: /* Einführung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:AttrTemplate}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Hilfsmodul bzw. Befehl, das/der die Einrichtung von Geräten erleichtern kann&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=AttrTemplate.pm &lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
AttrTemplate ist ein Hilfsmodul, mit dessen Hilfe Geräte auf einfache Weise mit einer passenden Konfiguration versehen lassen.&lt;br /&gt;
&lt;br /&gt;
Das Modul &#039;&#039;AttrTemplate&#039;&#039; ist indirekt Bestandteil der SetExtensions, das Modul kann von Modulautoren aber auch ohne diese mit in beliebige (Geräte-) Module mit eingebaut werden. Über diesen Mechanismus ist der Befehl &#039;&#039;attrTemplate&#039;&#039; in einer Vielzahl von Modulen verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
Ziel von &#039;&#039;attrTemplate&#039;&#039; ist es, den Nutzer bei der Konfiguration von Geräten zu unterstützen, indem vorrangig entsprechende [[Attribute]] gesetzt werden. Grundsätzlich ist es jedoch auch möglich, beliebige FHEM-Befehle oder Perl-Code im Rahmen von attrTemplate auszulösen. &lt;br /&gt;
Teilt man entsprechende &#039;&#039;templates&#039;&#039;, sollte jedoch deutlich darauf hingewiesen werden, wenn ein Template etwas anderes tut als nur Attribute zu setzen, also insbesondere dauerhafte Konfigurationsänderungen in der Hardware selbst vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
Um Ihnen die Auswahl zu erleichtern, kann &lt;br /&gt;
* mit &amp;lt;code&amp;gt;set &amp;lt;Device-Name&amp;gt; attrTemplate ?&amp;lt;/code&amp;gt; eine Liste der vorhandenen Templates samt kurzer Beschreibung aufgerufen werden. &lt;br /&gt;
* in der Detailansicht der Geräte über das Dropdownfeld ein &#039;&#039;template&#039;&#039; ausgewählt werden. Nun erhält man unmittelbar unter dem &#039;&#039;set&#039;&#039;-Befehl ebenfalls entsprechende weitere Informationen sowie den Code des &#039;&#039;template&#039;&#039; angezeigt, der bei Drücken auf &#039;&#039;set&#039;&#039; ausgeführt wird.&lt;br /&gt;
Hat man ein passendes &#039;&#039;template&#039;&#039; gefunden, wird mit &amp;lt;code&amp;gt;set &amp;lt;Device-Name&amp;gt; attrTemplate &amp;lt;template_name&amp;gt;&amp;lt;/code&amp;gt; angewendet, wodurch die entsprechenden, in dem &#039;&#039;template&#039;&#039; hinterlegten Kommandos ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Vor allem, wenn man &#039;&#039;attrTemplate&#039;&#039; für die Konfiguration von [[MQTT2_DEVICE]] verwendet, sollte man die &#039;&#039;&#039;default&#039;&#039;&#039;-Einstellungen für die Topic-Strukturen etc. nicht am Gerät ändern, da andernfalls die Automatismen ggf. nicht greifen und z.B. passende attrTemplate für das Device gar nicht angezeigt werden.}}&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
{{Link2Forum|Topic=104804|Message=988100|LinkText=Hier}} und {{Link2Forum|Topic=99195|Message=925952|LinkText=hier}} hat Rudolf König die Syntax erläutert, die in den attrTemplate-Dateien verwendet werden können:&lt;br /&gt;
* leere Zeilen werden ignoriert&lt;br /&gt;
* Zeilen die mit # anfangen sind Kommentare (s.u. &#039;&#039;desc:&#039;&#039;)&lt;br /&gt;
* Zeilen, die mit einem der folgenden Schlüsselwörter beginnen, werden speziell interpretiert: &#039;&#039;name: filter: prereq: option: par: desc: farewell: order:&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;name:&#039;&#039;&#039; Name des Templates, markiert gleichzeitig das Ende des vorherigen Templates&lt;br /&gt;
** &#039;&#039;&#039;filter:&#039;&#039;&#039; devspec2array Ausdruck, der beschreibt, für welche Geräte dieses Template anwendbar ist. Wird erst beim &amp;quot;set ?&amp;quot; ausgeführt.&lt;br /&gt;
** &#039;&#039;&#039;prereq:&#039;&#039;&#039; ist entweder ein Perl-Ausdruck {}, oder ein &#039;&#039;devspec2array&#039;&#039;, was genau ein Gerät spezifiziert. Falls mindestens ein prereq existiert, was nicht zutrifft, wird das betroffene Template aus dem Speicher entfernt. Die Auswertung erfolgt beim FHEM Start oder bei {AttrTemplate_Initialize()} &lt;br /&gt;
** &#039;&#039;&#039;option:&#039;&#039;&#039; Syntax entspricht prereq, wird jedoch beim Einlesen des template Files ausgeführt. Falls nicht wahr ist, werden die darauffolgenden Zeilen des Template nicht ausgeführt. Ist für sowas wie &amp;quot;setze zusätzlich Attribut XY falls die Installation HomeAssistant kennt&amp;quot; gedacht.&lt;br /&gt;
** &#039;&#039;&#039;par:&#039;&#039;&#039; kann mehrfach vorkommen, Syntax: &amp;lt;code&amp;gt;par:&amp;lt;ParameterName&amp;gt;;&amp;lt;Kommentar&amp;gt;;&amp;lt;Perl-Code&amp;gt;&amp;lt;/code&amp;gt;. &#039;&#039;Perl-Code&#039;&#039; versucht den Wert zu finden, falls nicht möglich (&#039;&#039;return undef&#039;&#039;), wird ein Dialog mit &amp;quot;Replace&amp;quot; angezeigt (bzw. Usage:... im telnet). &#039;&#039;ParameterName&#039;&#039; wird in jeder Befehlzeile ersetzt mit dem Wert. Zusätzlich: &#039;&#039;DEVICE&#039;&#039; wird mit dem Namen des Gerätes ersetzt, wird &#039;&#039;DEVICE&#039;&#039; (z.B. für Modulnamen) als Text benötigt, muß es &#039;&#039;escaped&#039;&#039; werden (z.B. MQTT2_\DEVICE).&lt;br /&gt;
** &#039;&#039;&#039;pardefault:&#039;&#039;&#039; Wie &#039;&#039;&#039;par:&#039;&#039;&#039;, allerdings wird ein ggf. ermittelter Wert nicht automatisch übernommen, sondern als Vorgabe in einem Dialogfeld zur Bestätigung (bzw. Änderung) durch den User angezeigt.  &lt;br /&gt;
** &#039;&#039;&#039;desc:&#039;&#039;&#039; Kommentar fuer &amp;lt;code&amp;gt;set attrTemplate help ?&amp;lt;/code&amp;gt;. Die letzte Zeile mit # vor &#039;&#039;name:&#039;&#039; wird als &#039;&#039;desc:&#039;&#039; interpretiert, falls kein &#039;&#039;desc:&#039;&#039; vorhanden ist.&lt;br /&gt;
** &#039;&#039;&#039;farewell:&#039;&#039;&#039; wird zum Schluss als Dialog (oder Text in telnet)  angezeigt, falls beim Anwenden der Befehle kein Fehler aufgetreten ist.&lt;br /&gt;
** &#039;&#039;&#039;order:&#039;&#039;&#039; bestimmt die Reihenfolge, in der die Templates im [[FHEMWEB|Webfrontend]] angezeigt werden; falls nicht vorhanden, wird &#039;&#039;name:&#039;&#039; genommen.&lt;br /&gt;
** &#039;&#039;&#039;loop:&#039;&#039;&#039; ermöglicht es, die zwischen &#039;&#039;loop:&amp;lt;parameter-name&amp;gt;:&amp;lt;wert1&amp;gt;:&amp;lt;wert2&amp;gt;:....&#039;&#039; und &#039;&#039;loop:END&#039;&#039; stehenden Zeilen wiederholt auszuführen und dabei bei jedem Durchlauf die als &#039;&#039;&amp;lt;parameter-name&amp;gt;&#039;&#039; bezeichnete Variable durch die darauffolgende Werteliste (getrennt per Doppelpunkt) zu ersetzen.&lt;br /&gt;
* alle anderen Zeilen werden als auszuführende Befehle interpretiert, wenn man &amp;lt;code&amp;gt;set &amp;lt;Device-Name&amp;gt; attrTemplate TemplateName&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==Eigene Templates entwickeln==&lt;br /&gt;
Wer plant, mehrere gleichartige Geräte anzulegen, aber andere Einstellungen zu wählen, als sie in den vorhandenen Templates enthalten sind, kann hierfür ebenfalls die attrTemplate-Funktion mit eigenen Templates nutzen. Hierfür können die vorhandenen Templates der im Unterverzeichnis &#039;&#039;fhem/FHEM/lib/AttrTemplate&#039;&#039; zu findenden Dateien als Basis dienen. Ihre Templates speichern Sie einfach als neue Datei mit der Endung &#039;&#039;.template&#039;&#039; im selben Verzeichnis (auf Linux-konforme Zeilenumbrüche achten) und lesen diese mit &amp;lt;code&amp;gt;{ AttrTemplate_Initialize() }&amp;lt;/code&amp;gt; neu ein. Danach können Sie diese direkt verwenden.&lt;br /&gt;
&lt;br /&gt;
Haben Sie ein Template erstellt und möchten dieses teilen, erstellen Sie einfach einen Beitrag im entsprechenden Forenbereichen, für manche Module existieren auch spezielle Threads (siehe Linkliste unten)&lt;br /&gt;
&lt;br /&gt;
=== Sprachsteuerung ===&lt;br /&gt;
Zur Einbindung von Sprachsteuerungslösungen ([[Siri|Siri,]] [[Alexa]] und [[Google Assistant FHEM Connect|gassistant]]) gibt es eine Reihe zentraler attrTemplates, die meist direkt aus anderen attrTemplates heraus aufgerufen werden. Es ist auch möglich, diese attrTemplate direkt aufzurufen, z.B. wenn man erst später eine Spracherkennungslösung eingebunden hat. Wegen der Namen der templates sollte man dazu direkt die betreffende attrTemplate-file &#039;&#039;[https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/speechrecogn.template speechrecogn.template]&#039;&#039; konsultieren, die Beschreibung, welches template für welche Funktionalität gedacht ist sowie eventuelle Parameter sind  jeweils hinter dem &#039;&#039;desc:&#039;&#039; zu finden. &lt;br /&gt;
&lt;br /&gt;
=== Spezielle Fragen zur Entwicklung neuer Templates ===&lt;br /&gt;
* Ersetzungen von Schlüsselbegriffen, die durch den AttrTemplate-Code aufgelöst bzw. durch entsprechende andere Werte ersetzt werden, (insbesondere von &#039;&#039;DEVICE&#039;&#039;) kann man verhindern, indem man diese &#039;&#039;escaped&#039;&#039;. Beispiel: Um im  Ergebnis ein &amp;quot;MQTT2_DEVICE&amp;quot; zu erzielen, muß &amp;quot;MQTT2_\DEVICE&amp;quot; geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
==Warum finde ich das Template xyz nicht?==&lt;br /&gt;
In den dropdown-Auswahllisten entsprechender Geräte werden teils deutlich weniger Möglichkeiten angeboten, als in den attrTemplate-files aufgeführt sind. Gesteuert wird dies durch die bereits oben genannten Ausdrücke &#039;&#039;filter&#039;&#039; und &#039;&#039;prereq&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&#039;&#039;filter&#039;&#039; bewirkt, dass das template schlicht nicht in der Auswahlliste erscheint, aber an sich geladen ist und über die Kommandozeile auch angewendet werden kann. Allerdings müssen Sie in diesen Fällen damit rechnen, dass mindestens einzelne Elemente zur Ausführung des template-Code nicht vorhanden sind, und Sie diese Parameter über ein Dialogfeld eingeben müssen.&lt;br /&gt;
&lt;br /&gt;
Geladene attrTemplate werden angezeigt, wenn man &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; attrTemplate ?&amp;lt;/code&amp;gt;&lt;br /&gt;
ausführt.&lt;br /&gt;
&lt;br /&gt;
In der Regel ist es zu empfehlen, die in filter abgefragten Daten händisch einzupflegen, also z.B. bei einem Tasmota-MQTT2_DEVICE wenigstens das &amp;quot;LWT&amp;quot;-readingsList-Element anzugeben.&lt;br /&gt;
&lt;br /&gt;
=== prereq ===&lt;br /&gt;
Trifft ein &#039;&#039;prereq&#039;&#039; nicht zu, wird das betreffende Template gar nicht geladen. Es erscheint dann weder bei Aufruf des &amp;quot;?&amp;quot;, noch kann es über die Kommandozeile ausgeführt werden. In der Regel macht es auch wenig Sinn, ein template ausführen zu wollen, dessen Voraussetzungen nicht gegeben sind, etwa weil (noch) kein passendes Bridge-Gerät definiert ist.&lt;br /&gt;
&lt;br /&gt;
=== Deaktivierung über &#039;&#039;global&#039;&#039; ===&lt;br /&gt;
Darüber hinaus kann das Modul insgesamt über folgende Einstellung deaktiviert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr global disableFeatures attrTemplate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dann werden insgesamt keine attrTemplates mehr geladen.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* {{Link2Forum|Topic=93370|LinkText=Ankündigung des Moduls im Forum}}&lt;br /&gt;
* [[MQTT2_DEVICE#attrTemplate|Wiki zu attrTemplate und MQTT2_DEVICE]] - enthält auch Links zu speziellen Threads für bestimmte Device-Typen&lt;br /&gt;
* {{Link2Forum|Topic=94495|LinkText=Thread für getestete Vorschläge (MQTT2_DEVICE)}}.&lt;br /&gt;
* {{Link2Forum|Topic=94494|LinkText=Thread für Fragen und Anregungen (MQTT2_DEVICE)}}.&lt;br /&gt;
* {{Link2Forum|Topic=97694|LinkText=Thread für HTTPMOD}}.&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:FHEM-Verwendung]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Weekprofile&amp;diff=38366</id>
		<title>Weekprofile</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Weekprofile&amp;diff=38366"/>
		<updated>2023-05-17T08:59:47Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: fix commandref links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:weekprofile}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Verwaltung von Wochenprofilen für Heizungssteuerung&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Frontends&lt;br /&gt;
|ModCmdRef=weekprofile&lt;br /&gt;
|ModTechName=98_weekprofile.pm&lt;br /&gt;
|ModOwner={{Link2FU|7869|Risiko}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[weekprofile]] stellt Funktionen zur Verwaltung von Wochenprofilen\Wochenplänen für Heizkörperthermostate zur Verfügung. Aktuell werden folgenden Systeme unterstützt:&lt;br /&gt;
* [[MAX]]&lt;br /&gt;
* [[HomeMatic]]&lt;br /&gt;
* CCU2 (experimentell)&lt;br /&gt;
* [[WeekdayTimer]] (ermöglicht seit 12/2019 indirekt die Steuerung von anderen Device-Typen wie [[Z-Wave]], [[MQTT2_DEVICE]] bzw. [[MQTT_DEVICE]], [[ZigBee]], ...)&lt;br /&gt;
&lt;br /&gt;
Es ist möglich, verschiedene Wochenprofile anzulegen, zu kopieren, zu ändern und zu löschen. Außerdem können die erstellten Profile den entsprechenden Devices zugewiesen werden. &lt;br /&gt;
&lt;br /&gt;
== Voraussetzung ==&lt;br /&gt;
Zum einwandfreien Betrieb des Moduls wird JSON benötigt. Dieses kann z.B. über folgenden Befehl installiert werden&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install libjson-pp-perl&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Seit SVN-Version: 21314 unterstützt Weekprofile [[configdb]]. Die Profil-\Konfigurationsdatei muss bei einem Update in configDB importiert werden.  &lt;br /&gt;
&lt;br /&gt;
== FHEMWEB Widget ==&lt;br /&gt;
[[Datei:Weekprofile_master.png|thumb|right|Widget Beispielansicht]]&lt;br /&gt;
Zur Bedienung des Moduls existiert ein passendes widget für FHEMWEB.&lt;br /&gt;
Alle notwendigen Aufgaben wie bspw. Kopieren, Bearbeiten, Zuweisen, etc. können über die FHEMWEB Oberfläche erfolgen.&lt;br /&gt;
&lt;br /&gt;
Ein direkte Verwendung der Befehle für get und set ist somit nicht zwingend erforderlich.&lt;br /&gt;
&lt;br /&gt;
== Betriebsarten ==&lt;br /&gt;
Das Modul besitzt drei unterschiedliche Betriebsarten, die im Folgenden beschrieben werden. Obwohl auch Mischformen möglich sind, sollte man sich der Übersichtlichkeit halber für eine Betriebsart entscheiden.&lt;br /&gt;
&lt;br /&gt;
Bei allen Änderungen sollte man immer bedenken, dass die Änderungen an die entsprechenden Thermostaten übertragen werden müssen, was je nach Menge etwas Zeit in Anspruch nehmen kann.&lt;br /&gt;
&lt;br /&gt;
=== Assoziiertes Master Gerät ===&lt;br /&gt;
Dieses ist der einfachste Betriebsmodus, bei dem jeder Definition genau ein Thermostat zugeordnet ist. D.h. entsprechend der Anzahl der Thermostaten, die man steuern möchte, benötigt man eine passende Anzahl von Weekprofile-Definitionen. Bei der Definition des Moduls wird das zu steuernde Thermostat direkt mit angegeben.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; weekprofile &amp;lt;device&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;define EG_Bad_WEEKPROFILE weekprofile EG_Bad_THERMOSTAT_Climate&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Bei HomeMatic müssen die Kanäle &amp;quot;Clima&amp;quot; bzw. &amp;quot;_Climate&amp;quot; verwendet werden.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Bei der Definition wird automatisch ein Wochenplan mit dem Namen &#039;master&#039; angelegt.&lt;br /&gt;
Der Wochenplan entspricht dem im Device hinterlegtem Profil. &lt;br /&gt;
&lt;br /&gt;
Dieser spezielle Masterplan kann nicht gelöscht werden, da er immer dem aktuellen Profil im Device entspricht.&lt;br /&gt;
Ändert man das Profil direkt über das Device, wird der Masterplan automatisch aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Wird der Masterplan über das Modul weekprofile geändert\gespeichert, wird das Profil automatisch zum assoziiertem Device übertragen.&lt;br /&gt;
&lt;br /&gt;
Wird in dieser Betriebsart für einen Befehl kein spezielles Device angegeben, wird immer das assoziierte Device verwendet. So wird bspw. bei&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; send_to_device urlaub&amp;lt;/code&amp;gt;&lt;br /&gt;
das Profil &#039;urlaub&#039; an das bei define angegebene Thermostat übertragen.&lt;br /&gt;
&lt;br /&gt;
==== Funktionen des Wigets ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Button&lt;br /&gt;
! Funktion&lt;br /&gt;
|-&lt;br /&gt;
| Zahnräder&lt;br /&gt;
| Beabeitungsmodus öffnen; Auf der dann angezeigten Seite kann über &amp;quot;--&amp;gt;&amp;quot; der Plan eines Tages auf einen anderen kopiert werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;DropDown&#039;&lt;br /&gt;
| Profil für Ansicht/Bearbeitung auswählen&lt;br /&gt;
|-&lt;br /&gt;
| &#039;+&#039;&lt;br /&gt;
| Neues Profil durch Kopie erstellen&lt;br /&gt;
|-&lt;br /&gt;
| &#039;-&#039;&lt;br /&gt;
| Profil löschen&lt;br /&gt;
|-&lt;br /&gt;
| &#039;--&amp;gt;&#039;&lt;br /&gt;
| Profil an ein oder mehrere Thermostate übertragen, die nicht dem assoziierten Mastergerät entsprechen. Dabei bietet das Modul alle kompatiblen gefundenen Thermostaten automatisch zur Auswahl an.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Standard Verwaltung ===&lt;br /&gt;
Diese Betriebsart ist für die einfache Verwaltung von Wochenplänen gedacht, welche dann an unterschiedliche Thermostate manuell übertragen werden können.&lt;br /&gt;
Für diese Betriebsart sollte kein assoziiertes Master Gerät bei define angegeben werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; weekprofile&amp;lt;/code&amp;gt;&lt;br /&gt;
In diesem Fall wird beim erstmaligen Anlegen ein Default-Profil mit dem Namen &#039;default&#039; angelegt.&lt;br /&gt;
Dieses bildet die Grundlage zur Erstellung weiterer Pläne durch kopieren.&lt;br /&gt;
Existieren mindestens. 2 Profile, kann das Default-Profil gelöscht werden.&lt;br /&gt;
Die einzelnen Wochenpläne können mittels &amp;lt;code&amp;gt;send_to_device&amp;lt;/code&amp;gt; an ein oder mehrere Thermostate übertragen werden.&lt;br /&gt;
&lt;br /&gt;
==== Funktionen des Wigets ====&lt;br /&gt;
Siehe Betriebsmodus assoziiertes Master Gerät.&lt;br /&gt;
&lt;br /&gt;
=== Topics ===&lt;br /&gt;
Dieser Betriebsmodus erlaubt es mit Hilfe von Topics oder Kategorien wie bspw. (Urlaub, Sommer, Winter, Party, etc.) komplexeren Verwaltung von Wochenplänen zu realisieren.&lt;br /&gt;
Dieses Feature wird mittels dem Atribute &amp;lt;code&amp;gt;useTopics&amp;lt;/code&amp;gt; aktiviert.&lt;br /&gt;
Innerhalb eines Topics kann es mehrere Wochenpläne geben. Sinnvollerweise für jedes Thermostat ein Wochenplan.&lt;br /&gt;
Mit dem Befehl &amp;lt;code&amp;gt;restore_topic&amp;lt;/code&amp;gt; kann man dann zwischen unterschiedlichen Kategorien wechseln. Die Wochenpläne werden automatisch an die Thermostate übertragen. Dazu muss im Thermostat ein User-Attribut &#039;weekprofile&#039; mit dem Namen des verbundenen Wochenplans hinterlegt sein.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung von Topics wird beim erstmaligen Anlegen automatisch die Topic &#039;default&#039; mit den Default-Wochenprofil &#039;default&#039; angelegt.&lt;br /&gt;
In dieser Topic kann man beispielsweise Pläne ablegen, die bei mehreren Thermostaten oder anderen Kategorien verwendet werden sollen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Bei der Verwendung von Topics, besteht der Profilname immer aus &amp;lt;code&amp;gt;Topicname:Planname&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Wird kein Topicname angegeben, wird immer &#039;default&#039; als Topicnamen verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Verwendung von Referenzen ====&lt;br /&gt;
Mittels Referenzierung kann man auf dieser Pläne verweisen und muss so nur einen Plan ändern, um gleich für eine Vielzahl von Thermostaten die Pläne zu ändern.&lt;br /&gt;
So könnte bspw. &#039;&#039;Sommer:Plan_WZ&#039;&#039; nur eine Referenz auf &#039;&#039;default:Fest_24h&#039;&#039; sein. &amp;lt;br&amp;gt;&lt;br /&gt;
Existiert &#039;&#039;default:Fest_24h&#039;&#039;, wird der Verweis so angelegt:&lt;br /&gt;
:&amp;lt;code&amp;gt;set weekprf reference_profile default:Fest_24h Sommer:Plan_WZ&amp;lt;/code&amp;gt;&lt;br /&gt;
Referenzen können nicht bearbeitet werden. Im Beispiel wäre der Plan &#039;&#039;Sommer:Plan_WZ&#039;&#039; nicht bearbeitbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für das Anlegen eines Wochenplans, der auf einen anderen referenziert, wählt man den Quellplan im Dropdown aus und erstellt dann einen neuen, indem man den entsprechenden Haken beim Erstellen aktiviert.&lt;br /&gt;
&lt;br /&gt;
==== Funktionen des Wigets ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Button&lt;br /&gt;
! Funktion&lt;br /&gt;
|-&lt;br /&gt;
| Zahnräder&lt;br /&gt;
| Beabeitungsmodus öffnen; Auf der dann angezeigten Seite kann über &amp;quot;--&amp;gt;&amp;quot; der Plan eines Tages auf einen anderen kopiert werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;DropDown&#039;&lt;br /&gt;
| Profil für Ansicht/Bearbeitung/Referenzierung auswählen&lt;br /&gt;
|-&lt;br /&gt;
| &#039;+&#039;&lt;br /&gt;
| Neues Profil durch Kopie erstellen&lt;br /&gt;
|-&lt;br /&gt;
| &#039;-&#039;&lt;br /&gt;
| Profil löschen&lt;br /&gt;
|-&lt;br /&gt;
| &#039;T&#039;&lt;br /&gt;
| Topic aktiviert und die entsprechenden Wochenpläne an die Thermostaten übertragen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Beispiel ====&lt;br /&gt;
User-Attribut im Thermostat definieren:&lt;br /&gt;
&lt;br /&gt;
MAX Thermostate:&lt;br /&gt;
:&amp;lt;code&amp;gt;define WT_Wohnzimmer MAX WallMountedThermostat 0d657f&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr WT_Wohnzimmer userattr weekprofile&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr WT_Wohnzimmer weekprofile Plan_WZ&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HomeMatic Thermostate:&lt;br /&gt;
&lt;br /&gt;
Fügen Sie ein [[HM-CC-RT-DN Funk-Heizkörperthermostat]] über hmPairForSec hinzu (Beispiel DeviceName HM_123456)&lt;br /&gt;
:&amp;lt;code&amp;gt;attr HM_123456_Clima userattr weekprofile&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr HM_123456_Clima weekprofile Plan_WZ&amp;lt;/code&amp;gt;&lt;br /&gt;
Weiter wird angenommen, dass es die Topics Winter und Sommer mit jeweils einem Wochenplan Namens &#039;Plan_WZ&#039; im Modul &#039;weekprf&#039; gibt.&lt;br /&gt;
:&amp;lt;code&amp;gt;define weekprf weekprofile&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr weekprf useTopics 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Abfrage mittels &amp;lt;code&amp;gt;get weekprf profile_names *&amp;lt;/code&amp;gt; muss ergeben:&lt;br /&gt;
:&#039;&#039;Winter:Plan_WZ,Sommer:Plan_WZ&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wechselt man nun mit &amp;lt;code&amp;gt;set weekprf restore_topic Sommer&amp;lt;/code&amp;gt; auf Sommer, wird der Plan &#039;&#039;Sommer:Plan_WZ&#039;&#039; an das Thermostat &#039;&#039;WT_Wohnzimmer&#039;&#039; übertragen.&lt;br /&gt;
&lt;br /&gt;
== Befehle und Attribute ==&lt;br /&gt;
=== Modul Befehle: set ===&lt;br /&gt;
==== Wochenprofile kopieren ====&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=weekprofile-set}}&lt;br /&gt;
&lt;br /&gt;
====  Wochenprofile löschen ====&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=weekprofile-set}}&lt;br /&gt;
&lt;br /&gt;
====  Wochenprofile an ein Device übertragen ====&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=weekprofile-set}}&lt;br /&gt;
&lt;br /&gt;
==== Wochenprofile per Datei konfigurieren ====&lt;br /&gt;
Die Wochenprofile werden mit dem Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; profile_data &amp;lt;profilename&amp;gt; &amp;lt;json data&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
angelegt/geändert (überschrieben). Die eigentlichen Daten müssen dabei in einer [https://de.wikipedia.org/wiki/JavaScript_Object_Notation JSON] Datenstruktur angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Für jeden Tag müssen die Schaltzeiten und die Solltemperaturen in Form von Listen angegeben werden. &lt;br /&gt;
Die Datenstruktur sieht bspw. wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;{&lt;br /&gt;
  &amp;quot;Sun&amp;quot;: {&lt;br /&gt;
    &amp;quot;time&amp;quot;: [&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&lt;br /&gt;
    &amp;quot;temp&amp;quot;: [&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Sat&amp;quot;: {&lt;br /&gt;
    &amp;quot;time&amp;quot;: [&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&lt;br /&gt;
    &amp;quot;temp&amp;quot;: [&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Thu&amp;quot;: {&lt;br /&gt;
    &amp;quot;time&amp;quot;: [&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&lt;br /&gt;
    &amp;quot;temp&amp;quot;: [&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Fri&amp;quot;: {&lt;br /&gt;
    &amp;quot;time&amp;quot;: [&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&lt;br /&gt;
    &amp;quot;temp&amp;quot;: [&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Tue&amp;quot;: {&lt;br /&gt;
    &amp;quot;time&amp;quot;: [&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&lt;br /&gt;
    &amp;quot;temp&amp;quot;: [&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Wed&amp;quot;: {&lt;br /&gt;
     &amp;quot;time&amp;quot;: [&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&lt;br /&gt;
    &amp;quot;temp&amp;quot;: [&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;Mon&amp;quot;: {&lt;br /&gt;
    &amp;quot;time&amp;quot;: [&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&lt;br /&gt;
    &amp;quot;temp&amp;quot;: [&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es handelt sich dabei um eine unsortierte Liste von &amp;quot;Tages-Objekten&amp;quot;, die wiederum eine unsortierte Liste von Schlüssel-Werte Paaren enthält. Die beiden verwendeten Schlüssel &amp;quot;time&amp;quot; und &amp;quot;temp&amp;quot; für Zeit und Temperatur verweisen jeweils auf eine sortierte Liste mit Werten. &lt;br /&gt;
&lt;br /&gt;
Der Schlüssel &amp;quot;time&amp;quot; enthält die Liste der gewünschten Zeitpunkte, zu denen ein Temperaturwechsel stattfinden soll. Die Zeitangaben müssen im Format &amp;quot;hh:mm&amp;quot; angegeben werden. Falls für den ganzen Tag nur eine Temperatur verwendet werden soll, so ist als Zeitpunkt &amp;quot;24:00&amp;quot; anzugeben.&lt;br /&gt;
&lt;br /&gt;
Der Schlüssel &amp;quot;temp&amp;quot; enthält die Temperaturen, die zu den in &amp;quot;time&amp;quot; hinterlegten Schaltzeitpunkten eingestellt werden sollen. Dabei entspricht die Reihenfolge der Temperaturen der Reihenfolge der Zeitpunkte in &amp;quot;time&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Zur Übergabe an FHEM sollte die JSON Struktur von sämtlichen Formatierungen (Zeilenumbrüche, Tabs, überflüssige Leerzeichen) bereinigt werden, so dass ein einzeiliger String entsteht. Für das oben angegebene Beispiel würde das dann so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{&amp;quot;Sun&amp;quot;:{&amp;quot;time&amp;quot;:[&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&amp;quot;temp&amp;quot;:[&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]},&amp;quot;Sat&amp;quot;:{&amp;quot;time&amp;quot;:[&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&amp;quot;temp&amp;quot;:[&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]},&amp;quot;Thu&amp;quot;:{&amp;quot;time&amp;quot;:[&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&amp;quot;temp&amp;quot;:[&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]},&amp;quot;Fri&amp;quot;:{&amp;quot;time&amp;quot;:[&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&amp;quot;temp&amp;quot;:[&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]},&amp;quot;Tue&amp;quot;:{&amp;quot;time&amp;quot;:[&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&amp;quot;temp&amp;quot;:[&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]},&amp;quot;Wed&amp;quot;:{&amp;quot;time&amp;quot;:[&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&amp;quot;temp&amp;quot;:[&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]},&amp;quot;Mon&amp;quot;:{&amp;quot;time&amp;quot;:[&amp;quot;06:00&amp;quot;,&amp;quot;22:00&amp;quot;,&amp;quot;24:00&amp;quot;],&amp;quot;temp&amp;quot;:[&amp;quot;20.0&amp;quot;,&amp;quot;22.0&amp;quot;,&amp;quot;20.0&amp;quot;]}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Referenzprofil konfigurieren ====&lt;br /&gt;
Dieser Befehl kommt nur zum Tragen, wenn per Attribut useTopics die Verwendung von Topics aktiviert wurde.&lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=weekprofile-set}}&lt;br /&gt;
&lt;br /&gt;
==== Topic wiederherstellen ====&lt;br /&gt;
Dieser Befehl kommt nur zum Tragen, wenn per Attribut useTopics die Verwendung von Topics aktiviert wurde.&lt;br /&gt;
&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=weekprofile-set}}&lt;br /&gt;
=== Modul Befehle: get ===&lt;br /&gt;
&lt;br /&gt;
==== Wochenprofile exportieren ====&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=weekprofile-get}}&lt;br /&gt;
&lt;br /&gt;
==== Wochenprofilnamen exportieren ====&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=weekprofile-get}}&lt;br /&gt;
&lt;br /&gt;
==== Wochenprofil-Refrenzen exportieren ====&lt;br /&gt;
Siehe {{Link2CmdRef|Anker=weekprofile-get}}&lt;br /&gt;
&lt;br /&gt;
=== Modul Attribute ===&lt;br /&gt;
Die meisten Attribute sind selbsterklärend. Daher wird an dieser Stelle zumeist auf die Informationen in der Siehe {{Link2CmdRef|Anker=weekprofile-attr}} verwiesen.&lt;br /&gt;
&lt;br /&gt;
==== Namen der Wochentage festlegen ====&lt;br /&gt;
widgetWeekdays: Siehe {{Link2CmdRef|Anker=weekprofile-attr}} &lt;br /&gt;
&lt;br /&gt;
==== Anzeigeart: Anzahl der Spalten====&lt;br /&gt;
widgetEditDaysInRow: Siehe {{Link2CmdRef|Anker=weekprofile-attr}} &lt;br /&gt;
&lt;br /&gt;
==== Anzeigeart: editieren auf neuer Seite ====&lt;br /&gt;
widgetEditOnNewPage: Siehe {{Link2CmdRef|Anker=weekprofile-attr}} &lt;br /&gt;
&lt;br /&gt;
==== Pfad zur Konfigurationsdatei ====&lt;br /&gt;
configFile: Siehe {{Link2CmdRef|Anker=weekprofile-attr}} &lt;br /&gt;
&lt;br /&gt;
==== Verwendung von Topics ====&lt;br /&gt;
useTopics: Aktiviert den Betriebsmodus: Topics&lt;br /&gt;
&lt;br /&gt;
== WeekdayTimer ==&lt;br /&gt;
Über WeekdayTimer als &amp;quot;Zwischenschicht&amp;quot; können beliebige Thermostat-Devices weiterer, nicht direkt unterstützter Modul-Typen mit Temperaturprofilen aus &#039;&#039;weekprofile&#039;&#039; versorgt werden, auch die Änderung im laufenden Betrieb ist ohne weiteres möglich, z.B. um zwischen Urlaubs- und Anwesenheits-Topic umzuschalten. WeekdayTimer kann dabei u.A. auch Fensterkontakte abfragen und die jeweilige nächste Schaltung verzögern, bis das Fenster wieder geschlossen ist. Weitere Informationen sind der Dokumentation von WeekdayTimer zu entehmen.&lt;br /&gt;
&lt;br /&gt;
Dabei ist lediglich zu beachten, dass prinzipbedingt die erste Schaltzeit des Tages nicht direkt auf Mitternacht festgelegt wird, sondern 10 Minuten danach.&lt;br /&gt;
Übertragen werden Profile von weekprofile aus mittels&lt;br /&gt;
:&amp;lt;code&amp;gt;set weekprf send_to_device holiday:livingrooms myWeekdayTimer&amp;lt;/code&amp;gt;&lt;br /&gt;
Dies hat denselben Effekt, wie wenn man vom WeekdayTimer-Device aus das betreffende Profil über dessen setter &#039;&#039;weekprofile&#039;&#039; abruft: &lt;br /&gt;
:&amp;lt;code&amp;gt;set myWeekdayTimer weekprofile weekprf:holiday:livingrooms&amp;lt;/code&amp;gt;&lt;br /&gt;
Nutzt man auf bei weekprofile keine &#039;&#039;topics&#039;&#039;, ist &#039;&#039;&amp;quot;default&amp;quot;&#039;&#039; als Topic anzugeben:&lt;br /&gt;
:&amp;lt;code&amp;gt;set weekprf send_to_device default:livingrooms myWeekdayTimer&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== bekannte Probleme ==&lt;br /&gt;
* Derzeit (Version: 10924) können keine Leerzeichen oder Umlaute verwendet werden. Leerzeichen werden bei der Eingabe abgefangen. Hat man versehentlich doch Umlaute verwendet, müssen in der Datei ./log/weekprofile-&amp;lt;name&amp;gt;.cfg die entsprechenden Zeilen manuell gelöscht/umbenennt werden und danach ein [[rereadcfg]] ausführt werden.&lt;br /&gt;
* Speichert man einen Wochenplan, wird die Änderung erst nach einem reload der Seite angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*{{Link2Forum|Topic=46117|LinkText=Thread}} im FHEM-Forum&lt;br /&gt;
*[http://www.jsoneditoronline.org/ JSON-Editor] für eine einfache Bearbeitung der JSON Daten&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=AttrTemplate&amp;diff=38017</id>
		<title>AttrTemplate</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=AttrTemplate&amp;diff=38017"/>
		<updated>2023-01-31T06:38:06Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: /* Syntax */ pardefault ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:AttrTemplate}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Hilfsmodul bzw. Befehl, das/der die Einrichtung von Geräten erleichtern kann&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=AttrTemplate.pm &lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
AttrTemplate ist ein Hilfsmodul, mit dessen Hilfe Geräte auf einfache Weise mit einer passenden Konfiguration versehen lassen.&lt;br /&gt;
&lt;br /&gt;
Das Modul &#039;&#039;AttrTemplate&#039;&#039; ist indirekt Bestandteil der SetExtensions, das Modul kann von Modulautoren aber auch ohne diese mit in beliebige (Geräte-) Module mit eingebaut werden. Über diesen Mechanismus ist der Befehl &#039;&#039;attrTemplate&#039;&#039; in einer Vielzahl von Modulen verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
Ziel von &#039;&#039;attrTemplate&#039;&#039; ist es, den Nutzer bei der Konfiguration von Geräten zu unterstützen, indem vorrangig entsprechende [[Attribute]] gesetzt werden. Grundsätzlich ist es jedoch auch möglich, beliebige FHEM-Befehle oder Perl-Code im Rahmen von attrTemplate auszulösen. &lt;br /&gt;
Teilt man entsprechende &#039;&#039;templates&#039;&#039;, sollte jedoch deutlich darauf hingewiesen werden, wenn ein Template etwas anderes tut als nur Attribute zu setzen, also insbesondere dauerhafte Konfigurationsänderungen in der Hardware selbst vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
Um Ihnen die Auswahl zu erleichtern, kann &lt;br /&gt;
* mit &amp;lt;code&amp;gt;set &amp;lt;Device-Name&amp;gt; attrTemplate ?&amp;lt;/code&amp;gt; eine Liste der vorhandenen Templates samt kurzer Beschreibung aufgerufen werden. &lt;br /&gt;
* in der Detailansicht der Geräte über das Dropdownfeld ein &#039;&#039;template&#039;&#039; ausgewählt werden. Nun erhält man unmittelbar unter dem &#039;&#039;set&#039;&#039;-Befehl ebenfalls entsprechende weitere Informationen sowie den Code des &#039;&#039;template&#039;&#039; angezeigt, der bei Drücken auf &#039;&#039;set&#039;&#039; ausgeführt wird.&lt;br /&gt;
Hat man ein passendes &#039;&#039;template&#039;&#039; gefunden, wird mit &amp;lt;code&amp;gt;set &amp;lt;Device-Name&amp;gt; attrTemplate &amp;lt;template_name&amp;gt;&amp;lt;/code&amp;gt; angewendet, wodurch die entsprechenden, in dem &#039;&#039;template&#039;&#039; hinterlegten Kommandos ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
{{Link2Forum|Topic=104804|Message=988100|LinkText=Hier}} und {{Link2Forum|Topic=99195|Message=925952|LinkText=hier}} hat Rudolf König die Syntax erläutert, die in den attrTemplate-Dateien verwendet werden können:&lt;br /&gt;
* leere Zeilen werden ignoriert&lt;br /&gt;
* Zeilen die mit # anfangen sind Kommentare (s.u. &#039;&#039;desc:&#039;&#039;)&lt;br /&gt;
* Zeilen, die mit einem der folgenden Schlüsselwörter beginnen, werden speziell interpretiert: &#039;&#039;name: filter: prereq: option: par: desc: farewell: order:&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;name:&#039;&#039;&#039; Name des Templates, markiert gleichzeitig das Ende des vorherigen Templates&lt;br /&gt;
** &#039;&#039;&#039;filter:&#039;&#039;&#039; devspec2array Ausdruck, der beschreibt, für welche Geräte dieses Template anwendbar ist. Wird erst beim &amp;quot;set ?&amp;quot; ausgeführt.&lt;br /&gt;
** &#039;&#039;&#039;prereq:&#039;&#039;&#039; ist entweder ein Perl-Ausdruck {}, oder ein &#039;&#039;devspec2array&#039;&#039;, was genau ein Gerät spezifiziert. Falls mindestens ein prereq existiert, was nicht zutrifft, wird das betroffene Template aus dem Speicher entfernt. Die Auswertung erfolgt beim FHEM Start oder bei {AttrTemplate_Initialize()} &lt;br /&gt;
** &#039;&#039;&#039;option:&#039;&#039;&#039; Syntax entspricht prereq, wird jedoch beim Einlesen des template Files ausgeführt. Falls nicht wahr ist, werden die darauffolgenden Zeilen des Template nicht ausgeführt. Ist für sowas wie &amp;quot;setze zusätzlich Attribut XY falls die Installation HomeAssistant kennt&amp;quot; gedacht.&lt;br /&gt;
** &#039;&#039;&#039;par:&#039;&#039;&#039; kann mehrfach vorkommen, Syntax: &amp;lt;code&amp;gt;par:&amp;lt;ParameterName&amp;gt;;&amp;lt;Kommentar&amp;gt;;&amp;lt;Perl-Code&amp;gt;&amp;lt;/code&amp;gt;. &#039;&#039;Perl-Code&#039;&#039; versucht den Wert zu finden, falls nicht möglich (&#039;&#039;return undef&#039;&#039;), wird ein Dialog mit &amp;quot;Replace&amp;quot; angezeigt (bzw. Usage:... im telnet). &#039;&#039;ParameterName&#039;&#039; wird in jeder Befehlzeile ersetzt mit dem Wert. Zusätzlich: &#039;&#039;DEVICE&#039;&#039; wird mit dem Namen des Gerätes ersetzt, wird &#039;&#039;DEVICE&#039;&#039; (z.B. für Modulnamen) als Text benötigt, muß es &#039;&#039;escaped&#039;&#039; werden (z.B. MQTT2_\DEVICE).&lt;br /&gt;
** &#039;&#039;&#039;pardefault:&#039;&#039;&#039; Wie &#039;&#039;&#039;par:&#039;&#039;&#039;, allerdings wird ein ggf. ermittelter Wert nicht automatisch übernommen, sondern als Vorgabe in einem Dialogfeld zur Bestätigung (bzw. Änderung) durch den User angezeigt.  &lt;br /&gt;
** &#039;&#039;&#039;desc:&#039;&#039;&#039; Kommentar fuer &amp;lt;code&amp;gt;set attrTemplate help ?&amp;lt;/code&amp;gt;. Die letzte Zeile mit # vor &#039;&#039;name:&#039;&#039; wird als &#039;&#039;desc:&#039;&#039; interpretiert, falls kein &#039;&#039;desc:&#039;&#039; vorhanden ist.&lt;br /&gt;
** &#039;&#039;&#039;farewell:&#039;&#039;&#039; wird zum Schluss als Dialog (oder Text in telnet)  angezeigt, falls beim Anwenden der Befehle kein Fehler aufgetreten ist.&lt;br /&gt;
** &#039;&#039;&#039;order:&#039;&#039;&#039; bestimmt die Reihenfolge, in der die Templates im [[FHEMWEB|Webfrontend]] angezeigt werden; falls nicht vorhanden, wird &#039;&#039;name:&#039;&#039; genommen.&lt;br /&gt;
** &#039;&#039;&#039;loop:&#039;&#039;&#039; ermöglicht es, die zwischen &#039;&#039;loop:&amp;lt;parameter-name&amp;gt;:&amp;lt;wert1&amp;gt;:&amp;lt;wert2&amp;gt;:....&#039;&#039; und &#039;&#039;loop:END&#039;&#039; stehenden Zeilen wiederholt auszuführen und dabei bei jedem Durchlauf die als &#039;&#039;&amp;lt;parameter-name&amp;gt;&#039;&#039; bezeichnete Variable durch die darauffolgende Werteliste (getrennt per Doppelpunkt) zu ersetzen.&lt;br /&gt;
* alle anderen Zeilen werden als auszuführende Befehle interpretiert, wenn man &amp;lt;code&amp;gt;set &amp;lt;Device-Name&amp;gt; attrTemplate TemplateName&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==Eigene Templates entwickeln==&lt;br /&gt;
Wer plant, mehrere gleichartige Geräte anzulegen, aber andere Einstellungen zu wählen, als sie in den vorhandenen Templates enthalten sind, kann hierfür ebenfalls die attrTemplate-Funktion mit eigenen Templates nutzen. Hierfür können die vorhandenen Templates der im Unterverzeichnis &#039;&#039;fhem/FHEM/lib/AttrTemplate&#039;&#039; zu findenden Dateien als Basis dienen. Ihre Templates speichern Sie einfach als neue Datei mit der Endung &#039;&#039;.template&#039;&#039; im selben Verzeichnis (auf Linux-konforme Zeilenumbrüche achten) und lesen diese mit &amp;lt;code&amp;gt;{ AttrTemplate_Initialize() }&amp;lt;/code&amp;gt; neu ein. Danach können Sie diese direkt verwenden.&lt;br /&gt;
&lt;br /&gt;
Haben Sie ein Template erstellt und möchten dieses teilen, erstellen Sie einfach einen Beitrag im entsprechenden Forenbereichen, für manche Module existieren auch spezielle Threads (siehe Linkliste unten)&lt;br /&gt;
&lt;br /&gt;
=== Sprachsteuerung ===&lt;br /&gt;
Zur Einbindung von Sprachsteuerungslösungen ([[Siri|Siri,]] [[Alexa]] und [[Google Assistant FHEM Connect|gassistant]]) gibt es eine Reihe zentraler attrTemplates, die meist direkt aus anderen attrTemplates heraus aufgerufen werden. Es ist auch möglich, diese attrTemplate direkt aufzurufen, z.B. wenn man erst später eine Spracherkennungslösung eingebunden hat. Wegen der Namen der templates sollte man dazu direkt die betreffende attrTemplate-file &#039;&#039;[https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/speechrecogn.template speechrecogn.template]&#039;&#039; konsultieren, die Beschreibung, welches template für welche Funktionalität gedacht ist sowie eventuelle Parameter sind  jeweils hinter dem &#039;&#039;desc:&#039;&#039; zu finden. &lt;br /&gt;
&lt;br /&gt;
=== Spezielle Fragen zur Entwicklung neuer Templates ===&lt;br /&gt;
* Ersetzungen von Schlüsselbegriffen, die durch den AttrTemplate-Code aufgelöst bzw. durch entsprechende andere Werte ersetzt werden, (insbesondere von &#039;&#039;DEVICE&#039;&#039;) kann man verhindern, indem man diese &#039;&#039;escaped&#039;&#039;. Beispiel: Um im  Ergebnis ein &amp;quot;MQTT2_DEVICE&amp;quot; zu erzielen, muß &amp;quot;MQTT2_\DEVICE&amp;quot; geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
==Warum finde ich das Template xyz nicht?==&lt;br /&gt;
In den dropdown-Auswahllisten entsprechender Geräte werden teils deutlich weniger Möglichkeiten angeboten, als in den attrTemplate-files aufgeführt sind. Gesteuert wird dies durch die bereits oben genannten Ausdrücke &#039;&#039;filter&#039;&#039; und &#039;&#039;prereq&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
=== filter ===&lt;br /&gt;
&#039;&#039;filter&#039;&#039; bewirkt, dass das template schlicht nicht in der Auswahlliste erscheint, aber an sich geladen ist und über die Kommandozeile auch angewendet werden kann. Allerdings müssen Sie in diesen Fällen damit rechnen, dass mindestens einzelne Elemente zur Ausführung des template-Code nicht vorhanden sind, und Sie diese Parameter über ein Dialogfeld eingeben müssen.&lt;br /&gt;
&lt;br /&gt;
Geladene attrTemplate werden angezeigt, wenn man &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; attrTemplate ?&amp;lt;/code&amp;gt;&lt;br /&gt;
ausführt.&lt;br /&gt;
&lt;br /&gt;
In der Regel ist es zu empfehlen, die in filter abgefragten Daten händisch einzupflegen, also z.B. bei einem Tasmota-MQTT2_DEVICE wenigstens das &amp;quot;LWT&amp;quot;-readingsList-Element anzugeben.&lt;br /&gt;
&lt;br /&gt;
=== prereq ===&lt;br /&gt;
Trifft ein &#039;&#039;prereq&#039;&#039; nicht zu, wird das betreffende Template gar nicht geladen. Es erscheint dann weder bei Aufruf des &amp;quot;?&amp;quot;, noch kann es über die Kommandozeile ausgeführt werden. In der Regel macht es auch wenig Sinn, ein template ausführen zu wollen, dessen Voraussetzungen nicht gegeben sind, etwa weil (noch) kein passendes Bridge-Gerät definiert ist.&lt;br /&gt;
&lt;br /&gt;
=== Deaktivierung über &#039;&#039;global&#039;&#039; ===&lt;br /&gt;
Darüber hinaus kann das Modul insgesamt über folgende Einstellung deaktiviert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr global disableFeatures attrTemplate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dann werden insgesamt keine attrTemplates mehr geladen.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* {{Link2Forum|Topic=93370|LinkText=Ankündigung des Moduls im Forum}}&lt;br /&gt;
* [[MQTT2_DEVICE#attrTemplate|Wiki zu attrTemplate und MQTT2_DEVICE]] - enthält auch Links zu speziellen Threads für bestimmte Device-Typen&lt;br /&gt;
* {{Link2Forum|Topic=94495|LinkText=Thread für getestete Vorschläge (MQTT2_DEVICE)}}.&lt;br /&gt;
* {{Link2Forum|Topic=94494|LinkText=Thread für Fragen und Anregungen (MQTT2_DEVICE)}}.&lt;br /&gt;
* {{Link2Forum|Topic=97694|LinkText=Thread für HTTPMOD}}.&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:FHEM-Verwendung]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MsgDialog&amp;diff=37997</id>
		<title>MsgDialog</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MsgDialog&amp;diff=37997"/>
		<updated>2023-01-26T14:20:33Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: /* TelegramBot */ Typo..&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Dialoge für Sofortnachrichten über TelegramBot, Jabber und WhatsApp&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Frontends&lt;br /&gt;
|ModTechName=76_msgDialog.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Ein zentrale Anforderung an die Haus-Automation ist die Kommunikation mit den Anwendern. Fast jeder Anwender möchte über bestimmte Ereignisse informiert werden und Einstellungen vornehmen. FHEM bietet schon seit längerem die Unterstützung für verschiedene Messaging Dienste an.&lt;br /&gt;
Mit dem msgDialog Modul können vordefinierte Dialoge erstellt werden. Die Kommunikation erfolgt dabei über den [[msg]] Befehl welcher zurzeit die bidirektionale Kommunikation über [[TelegramBot]], [[Jabber]] und [[yowsup]] (WhatsApp) unterstützt. Eingehende Nachrichten werden einem ROMMATE oder GUEST zugeordnet. Darüber werden auch die Berechtigungen für die einzelnen Dialoge festgelegt.&lt;br /&gt;
Die grundlegende Bedienung wird in diesem &#039;&#039;&#039;[https://youtu.be/yiCOTeR1YVQ Video]&#039;&#039;&#039; am Beispiel von TelegramBot gezeigt.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
=== Voraussetzungen ===&lt;br /&gt;
Für dieses Modul wird das Perl JSON Modul benötigt. Auf einem Debian-basierten System (z.B RaspberryPI o.ä.) kann man das mit dem folgenden Befehl installieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install libjson-perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hinweis zu den Code Beispielen ===&lt;br /&gt;
Es handelt sich bei den Beispielen um eine Raw definition, siehe auch [[Import_von_Code_Snippets]]&lt;br /&gt;
&lt;br /&gt;
=== msgConfig ===&lt;br /&gt;
&lt;br /&gt;
Als erstes benötigt man ein definiertes msgConfig device:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod myMsgConfig msgConfig&lt;br /&gt;
attr myMsgConfig userattr msgDialog_evalSpecials:textField-long msgDialog_msgCommand:textField&lt;br /&gt;
attr myMsgConfig msgContactPush &amp;lt;Name des TelegramBot-device&amp;gt;&lt;br /&gt;
attr myMsgConfig msgDialog_evalSpecials me=&amp;lt;Aktivierungswort bzw. -Nachricht&amp;gt;\&lt;br /&gt;
TelegramBot=&amp;lt;Name des TelegramBot-device&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bereits vorhanden, müssen natürlich nur die fehlenden Attribute gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
;msgDialog_evalSpecials&lt;br /&gt;
:key1=value1 key2=value2 ... Leerzeichen getrennte Liste von Name=Wert Paaren. Wert kann Leerzeichen enthalten, falls es in &amp;quot;&amp;quot; oder {} eingeschlossen :ist. Wert wird als perl-Ausdruck ausgewertet, falls es in {} eingeschlossen ist. In der DEF werden %Name% Zeichenketten durch den zugehörigen Wert :ersetzt. Wenn der selbe Name im msgConfig und msgDialog definiert wurde, wird der Wert aus msgDialog verwendet.&lt;br /&gt;
&lt;br /&gt;
;msgDialog_msgCommand &amp;lt;command&amp;gt;&lt;br /&gt;
:Befehl zum Versenden einer Nachricht. Die Vorgabe ist &amp;quot;msg push \@$recipients $message&amp;quot;. Wenn nicht gesetzt, wird die Vorgabe verwendet.&lt;br /&gt;
&lt;br /&gt;
=== ROOMMATE / GUEST ===&lt;br /&gt;
Für jeden Dialog kann festgelegt werden welche Person dazu berechtigt ist. Dazu sind Geräte vom Typ ROOMMATE oder GUEST mit definiertem msgContactPush Attribut erforderlich. Es ist darauf zu achten, dass das Reading fhemMsgRcvPush ein Event erzeugt. Siehe auch Attribut &amp;quot;allowed&amp;quot; in msgDialog.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt vom Attribut msgContactPush muss folgendem Muster entsprechen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;NAME des TelegramBot Device&amp;gt;:@&amp;lt;zum ROOMMATE/GUEST gehörende Telegram ID&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Define ===&lt;br /&gt;
&lt;br /&gt;
Definition des metaDialogs:&lt;br /&gt;
Zur Auflistung aller berechtigten Dialoge dient - was sonst - ein Dialog!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod meta_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;%me%&amp;quot;: {\&lt;br /&gt;
    &amp;quot;match&amp;quot;: &amp;quot;\/?(start|%me%)&amp;quot;,\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: &amp;quot;deletereading TYPE=msgDialog $recipient_history&amp;quot;,\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{return(&#039;(&#039; . join(&#039;) (&#039;, sort{lc($a) cmp lc($b)} (split(&#039;\n&#039;, fhem(&#039;get TYPE=msgDialog:FILTER=NAME!=$SELF:FILTER=allowed=.*($recipient|everyone).* trigger&#039;, 1)))) . &#039;) (abbrechen) &#039;)}&amp;quot;,\&lt;br /&gt;
      &amp;quot;Ich kann folgendes für dich tun:&amp;quot;\&lt;br /&gt;
    ]\&lt;br /&gt;
  },\&lt;br /&gt;
  &amp;quot;zurück&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: &amp;quot;set $recipient_history=.+ say @$recipient {(ReadingsVal($DEV, &#039;$recipient_history&#039;, &#039;&#039;) =~ m/((.+)\\|.+$)/;;;; return($2 || $1);;;;)}&amp;quot;\&lt;br /&gt;
  },\&lt;br /&gt;
  &amp;quot;abbrechen&amp;quot;: {\&lt;br /&gt;
    &amp;quot;match&amp;quot;: &amp;quot;\/?abbrechen&amp;quot;,\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: &amp;quot;deletereading TYPE=msgDialog $recipient_history&amp;quot;,\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
      &amp;quot;Dialog abgebrochen.&amp;quot;\&lt;br /&gt;
    ]\&lt;br /&gt;
  },\&lt;br /&gt;
  &amp;quot;beenden&amp;quot;: {\&lt;br /&gt;
    &amp;quot;match&amp;quot;: &amp;quot;\/?beenden&amp;quot;,\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: &amp;quot;deletereading TYPE=msgDialog $recipient_history&amp;quot;,\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
      &amp;quot;Dialog beendet.&amp;quot;\&lt;br /&gt;
    ]\&lt;br /&gt;
  }\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
attr meta_Dialog allowed everyone&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Komplexität eines Dialogs mit JSON ist es am praktikabelsten, zunächst einen leeren Dialog zu definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; msgDialog {} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann die &#039;&#039;&#039;DEF&#039;&#039;&#039; in der Detail-Ansicht des Dialog-Device bearbeitet werden. Jeder Dialog basiert auf der folgenden Struktur von einfach bis komplex.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;&amp;lt;TRIGGER&amp;gt;&amp;quot;: {&lt;br /&gt;
    &amp;quot;match&amp;quot;: &amp;quot;&amp;lt;regex&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;quot;setOnly&amp;quot;: (true|false),&lt;br /&gt;
    &amp;quot;commands&amp;quot;: &amp;quot;(fhem command|{perl code})&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;: [&lt;br /&gt;
      &amp;quot;{perl code}&amp;quot;,&lt;br /&gt;
      &amp;quot;text&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;&amp;lt;NEXT TRIGGER 1&amp;gt;&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;&amp;lt;NEXT TRIGGER 2&amp;gt;&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den JSON-Teil der Dialoge zu testen, empfiehlt sich ein Besuch auf https://jsonlint.com/&lt;br /&gt;
Hier kann der selbst geschriebene JSON-Code validiert werden.&lt;br /&gt;
&lt;br /&gt;
;TRIGGER &lt;br /&gt;
:Kann ein beliebiger Text sein. Es wird geprüft ob die eingehende Nachricht damit übereinstimmt. Falls ja, wird der Dialog an dieser Stelle fortgesetzt.&lt;br /&gt;
&lt;br /&gt;
;match&lt;br /&gt;
:Wenn nicht nur genau eine Nachricht zugelassen werden soll, kann noch eine regex angegeben werden. Die regex muss auf die gesamte eingehnde Nachricht :zutreffen. &lt;br /&gt;
&lt;br /&gt;
;setOnly &lt;br /&gt;
:Kann optional auf true oder false gestellt werden. In beiden fällen wird der TRIGGER dann nicht bei &amp;quot;get &amp;lt;name&amp;gt; trigger&amp;quot; zurück gegeben.&lt;br /&gt;
:Wenn setOnly auf &amp;quot;true&amp;quot; gestellt wird, kann der Dialog an dieser Stelle nicht durch eingehende Nachrichten ausgelöst werden, sondern nur über &amp;quot;get &amp;lt;name&amp;gt; say TRIGGER&amp;quot;. Dies kann dazu genutzt werden um einen Dialog aus :FHEM heraus zu initiieren.&lt;br /&gt;
&lt;br /&gt;
;commands&lt;br /&gt;
:Kann einen einzelnen oder mehrere Befehle enthalten: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;commands&amp;quot;: &amp;quot;single command&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;commands&amp;quot;: [&lt;br /&gt;
&amp;quot;command 1&amp;quot;,&lt;br /&gt;
&amp;quot;command 2&amp;quot;,&lt;br /&gt;
&amp;quot;{perl command}&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;message &lt;br /&gt;
:Kann einen einzelnen oder mehrere Texte enthalten die mit einen Zeilenumbruch verbunden werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;message&amp;quot;: [&lt;br /&gt;
  &amp;quot;text 1&amp;quot;,&lt;br /&gt;
  &amp;quot;text 2&amp;quot;,&lt;br /&gt;
  &amp;quot;{return from perl command}&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Dialogfelder&lt;br /&gt;
:Um Dialogfelder im Keyboard anzuzeigen müssen diese innerhalb des message-Blocks in runden Klammern stehen(). Wichtig ist das nach der schließenden Klammer ein Leerzeichen folgt. Damit das Keyboard angezeigt wird, muss auch ein normaler Text im bessage-Block enthalten sein.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;message&amp;quot;: [&lt;br /&gt;
  &amp;quot;(Dialogfeld 1) &amp;quot;,&lt;br /&gt;
  &amp;quot;(Dialogfeld 2) &amp;quot;,&lt;br /&gt;
  &amp;quot;Bitte wähle ein Dialogfeld aus&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei mehrstufigen Dialogen wird diese Struktur ineinander verschachtelt angegeben.&lt;br /&gt;
Es werden Variablen und Platzhalter, welche unter dem Attribut evalSpecials definiert werden, ausgewertet.&lt;br /&gt;
&lt;br /&gt;
=== Variablen ===&lt;br /&gt;
*$SELF: Eigenname des msgDialog&lt;br /&gt;
*$message: eingegangene Nachricht&lt;br /&gt;
*$recipient: Name des Dialogpartners&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
*allowed: Liste mit allen RESIDENTS und ROOMMATE die für diesen Dialog berechtigt sind.&lt;br /&gt;
*disable: [0|1] Dialog ist aktiviert|deaktiviert.&lt;br /&gt;
*disabledForIntervals: HH:MM-HH:MM HH:MM-HH-MM ...&lt;br /&gt;
*evalSpecials: key1=value1 key2=value2 ...Leerzeichen getrennte Liste von Name=Wert Paaren. Wert kann Leerzeichen enthalten, falls es in &amp;quot;&amp;quot; oder {} eingeschlossen ist. Wert wird als perl-Ausdruck ausgewertet, falls es in {} eingeschlossen ist. In der DEF werden %Name% Zeichenketten durch den zugehörigen Wert ersetzt. Dieses Attribut ist als &amp;quot;msgDialog_evalSpecials&amp;quot; im msgConfig Gerät vorhanden. Wenn der selbe Name im msgConfig und msgDialog definiert wurde, wird der Wert aus msgDialog verwendet.&lt;br /&gt;
*msgCommand &amp;lt;command&amp;gt;: Befehl der zum Versenden einer Nachricht verwendet wird. Die Vorgabe ist &amp;quot;msg push \@$recipients $message&amp;quot; Dieses Attribut ist als &amp;quot;msgDialog_msgCommand&amp;quot; im msgConfig Gerät vorhanden.&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
*reset: Setzt den Dialog für alle Benutzer zurück.&lt;br /&gt;
*say [@&amp;lt;recipient1&amp;gt;[,&amp;lt;recipient2&amp;gt;,...]] &amp;lt;TRIGGER&amp;gt;[|&amp;lt;NEXT TRIGGER&amp;gt;|...]: Der Dialog wird für alle angegeben Empänger an der angegeben Stelle fortgeführt. Sind keine Empfänger angegeben wird der Dialog für alle unter dem Attribut allowed angegebenen Empfänger fortgeführt.&lt;br /&gt;
*updateAllowed: Aktualisiert die Auswahl für das Attribut allowed.&lt;br /&gt;
&lt;br /&gt;
=== get ===&lt;br /&gt;
*trigger: Listet alle TRIGGER der ersten Ebene auf bei denen nicht setOnly angegeben ist.&lt;br /&gt;
&lt;br /&gt;
=== READINGS ===&lt;br /&gt;
*$recipient_history: Durch | getrennte Liste von TRIGGER um den aktuellen Zustand des Dialogs zu sichern. Für jeden Dialogpartner wird ein Reading angelegt. Wenn der Dialog beendet ist wird das Reading zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
== Hilfe bei der Fehlersuche ==&lt;br /&gt;
Hier entsteht eine Sammlung von Tipps bei der Fehlersuche. Die meisten dieser &amp;quot;Stolpersteine&amp;quot;&lt;br /&gt;
entstehen häufig bei der Erstellung eines ersten eigenen Dialoges.&lt;br /&gt;
&lt;br /&gt;
=== Das Attribut allowed fehlt oder ist nicht korrekt gesetzt ===&lt;br /&gt;
Das allowed-Attribut dient dazu, einzelne Dialoge für alle  oder nur bestimmte Benutzer zu berechtigen.&lt;br /&gt;
Fehlt es, wird der Dialog dem aufrufenden Benutzer nicht angezeigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Testdialog allowed everyone&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Das Attribut msgDialog_evalSpecials fehlt oder ist nicht korrekt gesetzt ===&lt;br /&gt;
Dieses Attribut gehört dem msgConfig device und muss wie in 2.3 zu lesen&lt;br /&gt;
korrekt befüllt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr myMsgConfig msgDialog_evalSpecials me=&amp;lt;Aktivierungswort bzw. -Nachricht&amp;gt;&lt;br /&gt;
TelegramBot=&amp;lt;Name des TelegramBot-device&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Das Attribut utf8Special fehlt beim TelegramBot device ===&lt;br /&gt;
Dieses Attribut ist für die korrekte UTF-8 Kodierung zuständig und im Standard deaktiviert.&lt;br /&gt;
Der Satz &amp;quot;Was kann ich für dich tun?&amp;quot; aus dem Meta-Dialog enthält bereits einen Umlaut!&lt;br /&gt;
&lt;br /&gt;
Folgende FHEM-Log-Fehlermeldung kann auf das fehlende Attribut hindeuten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Datum&amp;gt; &amp;lt;Zeit&amp;gt; 3: TelegramBot_Callback &amp;lt;TelegramBot-Device&amp;gt;: resulted in NonBlockingGet timed out on read from &amp;lt;hidden&amp;gt; after 30s from SendIt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JSON-Syntax Fehler ===&lt;br /&gt;
Das Modul prüft vor dem Abspeichern auf eine korrekte JSON-Syntax.&lt;br /&gt;
Meistens wird auch eine sprechende Meldung angezeigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Usage: define &amp;lt;name&amp;gt; msgDialog {JSON}&lt;br /&gt;
&lt;br /&gt;
, or ] expected while parsing array, at character offset 73 (before &amp;quot;}\n}&amp;quot;) at ./FHEM/76_msgDialog.pm line 93.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Eine gute Anlaufstelle zur Überprüfung von JSON-Code ist hier: https://jsonlint.com/&lt;br /&gt;
 &lt;br /&gt;
=== Es werden keine Dialoge angezeigt ===&lt;br /&gt;
Ohne die Angabe einer normalen Nachricht wird bei Keyboards kein Dialog angezeigt: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;message&amp;quot;: [&lt;br /&gt;
&amp;quot;(Lampen einschalten) &amp;quot;,&lt;br /&gt;
&amp;quot;(Lampen ausschalten) &amp;quot;,&lt;br /&gt;
&amp;quot;(zurück:%me%) &amp;quot;, &lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erst mit der Nachricht &amp;quot;Möchtest Du Lampen ein oder ausschalten?&amp;quot; erscheint der Dialog:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;message&amp;quot;: [&lt;br /&gt;
&amp;quot;(Lampen einschalten) &amp;quot;,&lt;br /&gt;
&amp;quot;(Lampen ausschalten) &amp;quot;,&lt;br /&gt;
&amp;quot;(zurück:%me%) &amp;quot;, &lt;br /&gt;
&amp;quot;Möchtest Du Lampen ein oder ausschalten?&amp;quot;&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Innerhalb eines Dialogs fehlen einzelne Menüeinträge ===&lt;br /&gt;
Das liegt das meistens an einem fehlenden Leerzeichen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;message&amp;quot;: [&lt;br /&gt;
&amp;quot;(Lampen einschalten)&amp;quot;,&lt;br /&gt;
&amp;quot;(Lampen ausschalten) &amp;quot;,&lt;br /&gt;
&amp;quot;(zurück:%me%) &amp;quot;, &lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei &amp;quot;Lampen ausschalten&amp;quot; ist dagegen korrekt ein Leerzeichen zu sehen und somit auch der Menüeintrag im Dialog.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;:&amp;quot; bei Inline Keyboards ===&lt;br /&gt;
Bei Inline Keyboards wird der letzte : als Trennzeichen zwischen Nachricht und Befehl ausgewertet.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;(Temperatur: [heizung:desiredTemperature]°C:setheiz) &amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oder  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;([test:state]:weiter) &amp;quot; wenn [test:state] = &amp;quot;Status: ok&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
==== Programmierung der Waschmaschine ====&lt;br /&gt;
Das ist ein Beispiel zur Programmierung einer Waschmaschine wie auch oben im Video zu sehen: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod Waschmaschine_Dialog msgDialog { &amp;quot;Waschmaschine&amp;quot;: {\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{return(&#039;(Zeitprogramm stoppen) &#039;) if(ReadingsVal(&#039;%controlUnit%&#039;, &#039;controlMode&#039;, &#039;&#039;) eq &#039;auto&#039;)}&amp;quot;,\&lt;br /&gt;
      &amp;quot;{return(&#039;(programmieren) &#039;) if(ReadingsVal(&#039;%actor%&#039;, &#039;state&#039;, &#039;&#039;) ne &#039;on&#039;)}&amp;quot;,\&lt;br /&gt;
      &amp;quot;{return(&#039;(einschalten) &#039;) if(ReadingsVal(&#039;%actor%&#039;, &#039;state&#039;, &#039;&#039;) ne &#039;on&#039;)}&amp;quot;,\&lt;br /&gt;
      &amp;quot;(Verlaufsdiagramm) &amp;quot;,\&lt;br /&gt;
      &amp;quot;(abbrechen) &amp;quot;,\&lt;br /&gt;
      &amp;quot;{return(&#039;Waschmaschine: &#039; . (ReadingsVal(&#039;%actor%&#039;, &#039;state&#039;, &#039;&#039;) eq &#039;on&#039; ? &#039;eingeschaltet&#039; : &#039;ausgeschaltet&#039;))}&amp;quot;,\&lt;br /&gt;
      &amp;quot;{return(&#039;Modus: &#039; . (ReadingsVal(&#039;%controlUnit%&#039;, &#039;controlMode&#039;, &#039;&#039;) eq &#039;auto&#039; ? &#039;Automatik&#039; : &#039;Manuell (&#039; . ReadingsVal(&#039;%controlUnit%&#039;, &#039;time&#039;, &#039;&#039;) . &#039;)&#039;))}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;Zeitprogramm stoppen&amp;quot;: {\&lt;br /&gt;
      &amp;quot;commands&amp;quot;: &amp;quot;set %controlUnit% controlMode manual&amp;quot;,\&lt;br /&gt;
      &amp;quot;message&amp;quot;: [\&lt;br /&gt;
        &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
        &amp;quot;Das Zeitprogramm wurde gestoppt.&amp;quot;\&lt;br /&gt;
      ]\&lt;br /&gt;
    },\&lt;br /&gt;
    &amp;quot;programmieren&amp;quot;: {\&lt;br /&gt;
      &amp;quot;message&amp;quot;: [\&lt;br /&gt;
        &amp;quot;(bestätigen|zurück|abbrechen) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 00:00 | 00:15 | 00:30 | 00:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 01:00 | 01:15 | 01:30 | 01:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 02:00 | 02:15 | 02:30 | 02:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 03:00 | 03:15 | 03:30 | 03:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 04:00 | 04:15 | 04:30 | 04:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 05:00 | 05:15 | 05:30 | 05:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 06:00 | 06:15 | 06:30 | 06:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 07:00 | 07:15 | 07:30 | 07:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 08:00 | 08:15 | 08:30 | 08:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 09:00 | 09:15 | 09:30 | 09:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 10:00 | 10:15 | 10:30 | 10:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 11:00 | 11:15 | 11:30 | 11:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 12:00 | 12:15 | 12:30 | 12:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 13:00 | 13:15 | 13:30 | 13:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 14:00 | 14:15 | 14:30 | 14:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 15:00 | 15:15 | 15:30 | 15:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 16:00 | 16:15 | 16:30 | 16:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 17:00 | 17:15 | 17:30 | 17:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 18:00 | 18:15 | 18:30 | 18:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 19:00 | 19:15 | 19:30 | 19:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 20:00 | 20:15 | 20:30 | 20:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 21:00 | 21:15 | 21:30 | 21:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 22:00 | 22:15 | 22:30 | 22:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 23:00 | 23:15 | 23:30 | 23:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;Wann soll die Wäsche fertig sein?&amp;quot;,\&lt;br /&gt;
        &amp;quot;Bitte Uhrzeit in HH:MM angeben.&amp;quot;,\&lt;br /&gt;
        &amp;quot;Aktuell ist [%controlUnit%:time] Uhr eingestellt.&amp;quot;\&lt;br /&gt;
      ],\&lt;br /&gt;
      &amp;quot;Uhrzeit&amp;quot;: {\&lt;br /&gt;
        &amp;quot;match&amp;quot;: &amp;quot; ?([0-1][0-9]|2[0-3]):[0-5][0-9] ?&amp;quot;,\&lt;br /&gt;
        &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
          &amp;quot;set %controlUnit% time $message&amp;quot;,\&lt;br /&gt;
          &amp;quot;set $SELF say @$recipient Waschmaschine|programmieren|bestätigen&amp;quot;\&lt;br /&gt;
        ]\&lt;br /&gt;
      },\&lt;br /&gt;
      &amp;quot;bestätigen&amp;quot;: {\&lt;br /&gt;
        &amp;quot;commands&amp;quot;: &amp;quot;set %controlUnit% controlMode auto&amp;quot;,\&lt;br /&gt;
        &amp;quot;message&amp;quot;: [\&lt;br /&gt;
          &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
          &amp;quot;Das Zeitprogramm wurde eingestellt.&amp;quot;,\&lt;br /&gt;
          &amp;quot;Die Wäsche wird voraussichtlich um [%controlUnit%:time] Uhr fertig sein.&amp;quot;,\&lt;br /&gt;
          &amp;quot;Bitte die Waschmaschine vorbereiten.&amp;quot;\&lt;br /&gt;
        ]\&lt;br /&gt;
      }\&lt;br /&gt;
    },\&lt;br /&gt;
    &amp;quot;einschalten&amp;quot;: {\&lt;br /&gt;
      &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
        &amp;quot;set %controlUnit% controlMode manual&amp;quot;,\&lt;br /&gt;
        &amp;quot;set %actor% on&amp;quot;\&lt;br /&gt;
      ]\&lt;br /&gt;
    },\&lt;br /&gt;
    &amp;quot;Verlaufsdiagramm&amp;quot;: {\&lt;br /&gt;
      &amp;quot;commands&amp;quot;: &amp;quot;set %TelegramBot% cmdSend {plotAsPng(&#039;%plot%&#039;)}&amp;quot;,\&lt;br /&gt;
      &amp;quot;message&amp;quot;: &amp;quot;TelegramBot_MTYPE=queryInline (%me%) $message&amp;quot;\&lt;br /&gt;
    }\&lt;br /&gt;
  },\&lt;br /&gt;
  &amp;quot;auto&amp;quot;: {\&lt;br /&gt;
    &amp;quot;setOnly&amp;quot;: true,\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;set %actor% on&amp;quot;,\&lt;br /&gt;
      &amp;quot;set %controlUnit% controlMode manual&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
      &amp;quot;Die Wachmaschine wurde automatisch eingeschaltet.&amp;quot;\&lt;br /&gt;
    ]\&lt;br /&gt;
  },\&lt;br /&gt;
  &amp;quot;manual&amp;quot;: {\&lt;br /&gt;
    &amp;quot;setOnly&amp;quot;: true,\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
      &amp;quot;Die Wachmaschine wurde manuell eingeschaltet.&amp;quot;\&lt;br /&gt;
    ]\&lt;br /&gt;
  },\&lt;br /&gt;
  &amp;quot;done&amp;quot;: {\&lt;br /&gt;
    &amp;quot;setOnly&amp;quot;: true,\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: &amp;quot;set %actor% off&amp;quot;,\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
      &amp;quot;Die Wachmaschine ist fertig.&amp;quot;\&lt;br /&gt;
    ]\&lt;br /&gt;
  }\&lt;br /&gt;
}&lt;br /&gt;
attr Waschmaschine_Dialog evalSpecials actor=HM_2C10D8_Sw\&lt;br /&gt;
controlUnit=Waschkeller_washer_controlUnit\&lt;br /&gt;
plot=Waschkeller_washer_SVG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TelegramBot ==&lt;br /&gt;
&lt;br /&gt;
In [[TelegramBot|Telegram]] gibt es die Möglichkeit die Art des Keyboards zu ändern. Links das normale Keyboard, rechts das Inline Keyboard.&lt;br /&gt;
&lt;br /&gt;
[[Datei:76msgDialog menu.png|Normales Keyboard]]  [[Datei:76msgDialog menu inline.PNG|Inline Keyboard]]&lt;br /&gt;
&lt;br /&gt;
In diesem &#039;&#039;&#039;[https://youtu.be/oRDy2918mVI Video]&#039;&#039;&#039; wird Telegram mit einem Inline Keyboard verwendet.&lt;br /&gt;
&lt;br /&gt;
Um eine Nachricht bei Telegram zu verändern, gibt es den Befehl &amp;quot;queryEditInline&amp;quot;.&lt;br /&gt;
Dafür wird die MsgId von der Nachricht benötigt. Das erledigt ein notify, welches die msgId pro Peer abspeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod sentMsgIdByPeerId notify .+:sentMsgId.+ {\&lt;br /&gt;
  return if $TYPE ne &#039;TelegramBot&#039;;;\&lt;br /&gt;
  \&lt;br /&gt;
  my $sentMsgId = ReadingsVal($NAME, &#039;sentMsgId&#039;, &#039;&#039;);;\&lt;br /&gt;
  my $sentMsgPeerId = ReadingsVal($NAME, &#039;sentMsgPeerId&#039;, &#039;&#039;);;\&lt;br /&gt;
  my $contact = (devspec2array(&amp;quot;TYPE=(ROOMMATE|GUEST):FILTER=msgContactPush=.*$sentMsgPeerId.*&amp;quot;))[0];;\&lt;br /&gt;
  \&lt;br /&gt;
  readingsSingleUpdate($defs{$NAME}, &amp;quot;$contact\_sentMsgId&amp;quot;, $sentMsgId, 1);;\&lt;br /&gt;
}&lt;br /&gt;
attr sentMsgIdByPeerId devStateIcon {ReadingsVal($name, &#039;state&#039;, &#039;inactive&#039;) eq &#039;active&#039; ? &#039;.*:ios-on-blue:inactive&#039; : &#039;.*:ios-off:active&#039;}&lt;br /&gt;
attr sentMsgIdByPeerId icon audio_mic&lt;br /&gt;
attr sentMsgIdByPeerId room msg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach wird der Message-Befehl von  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set &amp;lt;TelegramBot&amp;gt; message&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
auf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set &amp;lt;TelegramBot&amp;gt; queryEditInline &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
geändert. Dafür wird ein [[cmdalias]] verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod message2queryEditInline cmdalias set .+ message (.|\n)+ AS {\&lt;br /&gt;
  my ($NAME, $cmd, $message) = split(/[\s]+/, $EVENT, 3);;\&lt;br /&gt;
  my $TYPE = InternalVal($NAME, &amp;quot;TYPE&amp;quot;, &amp;quot;&amp;quot;);;\&lt;br /&gt;
  (my $recipient, $message) = ($message =~ m/(@\S+)? (.+)/s);;\&lt;br /&gt;
  \&lt;br /&gt;
  if($TYPE eq &amp;quot;TelegramBot&amp;quot; &amp;amp;&amp;amp; $recipient){\&lt;br /&gt;
    my ($contact) = devspec2array(&amp;quot;TYPE=(ROOMMATE|GUEST):FILTER=msgContactPush=.*$recipient.*&amp;quot;);;\&lt;br /&gt;
    my $sentMsgId = ReadingsVal($NAME, &amp;quot;$contact\_sentMsgId&amp;quot;, &amp;quot;&amp;quot;);;\&lt;br /&gt;
\&lt;br /&gt;
    if($sentMsgId ne &amp;quot;&amp;quot;){\&lt;br /&gt;
      fhem(&amp;quot;set $NAME queryEditInline $sentMsgId $recipient $message&amp;quot;);;\&lt;br /&gt;
    }\&lt;br /&gt;
    else{\&lt;br /&gt;
      fhem(&amp;quot;set $NAME queryInline $recipient $message&amp;quot;);;\&lt;br /&gt;
    }\&lt;br /&gt;
  }\&lt;br /&gt;
  else{\&lt;br /&gt;
    fhem(&amp;quot;set $EVENT&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
}&lt;br /&gt;
attr message2queryEditInline room msg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um wieder zurück zum normalen Keyboard zu gelangen genügt es, das notify und den cmdAlias zu deaktivieren.&lt;br /&gt;
Das kann komfortabel über ein notify und einen dummy erledigt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod inline_normal.NOT notify inline_normal.DUM:.* {\&lt;br /&gt;
if (&amp;quot;$EVENT&amp;quot; =~ &amp;quot;on&amp;quot;) {\&lt;br /&gt;
  fhem &amp;quot;set sentMsgIdByPeerId active;; attr message2queryEditInline disable 0&amp;quot;;;\&lt;br /&gt;
  } \&lt;br /&gt;
elsif (&amp;quot;$EVENT&amp;quot; =~ &amp;quot;off&amp;quot;) {\&lt;br /&gt;
  fhem &amp;quot;set sentMsgIdByPeerId inactive;; attr message2queryEditInline disable 1&amp;quot;;;\&lt;br /&gt;
  }\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Infos zum Thema Inline Keyboard sind in der Antwort #10 im Forum zu finden (siehe Link unten).&lt;br /&gt;
&lt;br /&gt;
== JABBER ==&lt;br /&gt;
Hier wird die Verwendung mit Jabber beschrieben...&lt;br /&gt;
&lt;br /&gt;
== WhatsApp ==&lt;br /&gt;
Hier wird die Verwendung mit yowsup/WhatsApp beschrieben...&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=77297|LinkText=FHEM Forum}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Hilfsmodul]]&lt;br /&gt;
[[Kategorie:Telegram]]&lt;br /&gt;
[[Kategorie:Jabber]]&lt;br /&gt;
[[Kategorie:WhatsApp]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MsgDialog&amp;diff=37996</id>
		<title>MsgDialog</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MsgDialog&amp;diff=37996"/>
		<updated>2023-01-26T14:08:20Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: /* TelegramBot */ - Code update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Dialoge für Sofortnachrichten über TelegramBot, Jabber und WhatsApp&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Frontends&lt;br /&gt;
|ModTechName=76_msgDialog.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Zielsetzung ==&lt;br /&gt;
Ein zentrale Anforderung an die Haus-Automation ist die Kommunikation mit den Anwendern. Fast jeder Anwender möchte über bestimmte Ereignisse informiert werden und Einstellungen vornehmen. FHEM bietet schon seit längerem die Unterstützung für verschiedene Messaging Dienste an.&lt;br /&gt;
Mit dem msgDialog Modul können vordefinierte Dialoge erstellt werden. Die Kommunikation erfolgt dabei über den [[msg]] Befehl welcher zurzeit die bidirektionale Kommunikation über [[TelegramBot]], [[Jabber]] und [[yowsup]] (WhatsApp) unterstützt. Eingehende Nachrichten werden einem ROMMATE oder GUEST zugeordnet. Darüber werden auch die Berechtigungen für die einzelnen Dialoge festgelegt.&lt;br /&gt;
Die grundlegende Bedienung wird in diesem &#039;&#039;&#039;[https://youtu.be/yiCOTeR1YVQ Video]&#039;&#039;&#039; am Beispiel von TelegramBot gezeigt.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
=== Voraussetzungen ===&lt;br /&gt;
Für dieses Modul wird das Perl JSON Modul benötigt. Auf einem Debian-basierten System (z.B RaspberryPI o.ä.) kann man das mit dem folgenden Befehl installieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install libjson-perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hinweis zu den Code Beispielen ===&lt;br /&gt;
Es handelt sich bei den Beispielen um eine Raw definition, siehe auch [[Import_von_Code_Snippets]]&lt;br /&gt;
&lt;br /&gt;
=== msgConfig ===&lt;br /&gt;
&lt;br /&gt;
Als erstes benötigt man ein definiertes msgConfig device:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod myMsgConfig msgConfig&lt;br /&gt;
attr myMsgConfig userattr msgDialog_evalSpecials:textField-long msgDialog_msgCommand:textField&lt;br /&gt;
attr myMsgConfig msgContactPush &amp;lt;Name des TelegramBot-device&amp;gt;&lt;br /&gt;
attr myMsgConfig msgDialog_evalSpecials me=&amp;lt;Aktivierungswort bzw. -Nachricht&amp;gt;\&lt;br /&gt;
TelegramBot=&amp;lt;Name des TelegramBot-device&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls bereits vorhanden, müssen natürlich nur die fehlenden Attribute gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
;msgDialog_evalSpecials&lt;br /&gt;
:key1=value1 key2=value2 ... Leerzeichen getrennte Liste von Name=Wert Paaren. Wert kann Leerzeichen enthalten, falls es in &amp;quot;&amp;quot; oder {} eingeschlossen :ist. Wert wird als perl-Ausdruck ausgewertet, falls es in {} eingeschlossen ist. In der DEF werden %Name% Zeichenketten durch den zugehörigen Wert :ersetzt. Wenn der selbe Name im msgConfig und msgDialog definiert wurde, wird der Wert aus msgDialog verwendet.&lt;br /&gt;
&lt;br /&gt;
;msgDialog_msgCommand &amp;lt;command&amp;gt;&lt;br /&gt;
:Befehl zum Versenden einer Nachricht. Die Vorgabe ist &amp;quot;msg push \@$recipients $message&amp;quot;. Wenn nicht gesetzt, wird die Vorgabe verwendet.&lt;br /&gt;
&lt;br /&gt;
=== ROOMMATE / GUEST ===&lt;br /&gt;
Für jeden Dialog kann festgelegt werden welche Person dazu berechtigt ist. Dazu sind Geräte vom Typ ROOMMATE oder GUEST mit definiertem msgContactPush Attribut erforderlich. Es ist darauf zu achten, dass das Reading fhemMsgRcvPush ein Event erzeugt. Siehe auch Attribut &amp;quot;allowed&amp;quot; in msgDialog.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt vom Attribut msgContactPush muss folgendem Muster entsprechen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;NAME des TelegramBot Device&amp;gt;:@&amp;lt;zum ROOMMATE/GUEST gehörende Telegram ID&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Define ===&lt;br /&gt;
&lt;br /&gt;
Definition des metaDialogs:&lt;br /&gt;
Zur Auflistung aller berechtigten Dialoge dient - was sonst - ein Dialog!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod meta_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;%me%&amp;quot;: {\&lt;br /&gt;
    &amp;quot;match&amp;quot;: &amp;quot;\/?(start|%me%)&amp;quot;,\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: &amp;quot;deletereading TYPE=msgDialog $recipient_history&amp;quot;,\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{return(&#039;(&#039; . join(&#039;) (&#039;, sort{lc($a) cmp lc($b)} (split(&#039;\n&#039;, fhem(&#039;get TYPE=msgDialog:FILTER=NAME!=$SELF:FILTER=allowed=.*($recipient|everyone).* trigger&#039;, 1)))) . &#039;) (abbrechen) &#039;)}&amp;quot;,\&lt;br /&gt;
      &amp;quot;Ich kann folgendes für dich tun:&amp;quot;\&lt;br /&gt;
    ]\&lt;br /&gt;
  },\&lt;br /&gt;
  &amp;quot;zurück&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: &amp;quot;set $recipient_history=.+ say @$recipient {(ReadingsVal($DEV, &#039;$recipient_history&#039;, &#039;&#039;) =~ m/((.+)\\|.+$)/;;;; return($2 || $1);;;;)}&amp;quot;\&lt;br /&gt;
  },\&lt;br /&gt;
  &amp;quot;abbrechen&amp;quot;: {\&lt;br /&gt;
    &amp;quot;match&amp;quot;: &amp;quot;\/?abbrechen&amp;quot;,\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: &amp;quot;deletereading TYPE=msgDialog $recipient_history&amp;quot;,\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
      &amp;quot;Dialog abgebrochen.&amp;quot;\&lt;br /&gt;
    ]\&lt;br /&gt;
  },\&lt;br /&gt;
  &amp;quot;beenden&amp;quot;: {\&lt;br /&gt;
    &amp;quot;match&amp;quot;: &amp;quot;\/?beenden&amp;quot;,\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: &amp;quot;deletereading TYPE=msgDialog $recipient_history&amp;quot;,\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
      &amp;quot;Dialog beendet.&amp;quot;\&lt;br /&gt;
    ]\&lt;br /&gt;
  }\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
attr meta_Dialog allowed everyone&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Komplexität eines Dialogs mit JSON ist es am praktikabelsten, zunächst einen leeren Dialog zu definieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define &amp;lt;name&amp;gt; msgDialog {} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann die &#039;&#039;&#039;DEF&#039;&#039;&#039; in der Detail-Ansicht des Dialog-Device bearbeitet werden. Jeder Dialog basiert auf der folgenden Struktur von einfach bis komplex.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;&amp;lt;TRIGGER&amp;gt;&amp;quot;: {&lt;br /&gt;
    &amp;quot;match&amp;quot;: &amp;quot;&amp;lt;regex&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;quot;setOnly&amp;quot;: (true|false),&lt;br /&gt;
    &amp;quot;commands&amp;quot;: &amp;quot;(fhem command|{perl code})&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;: [&lt;br /&gt;
      &amp;quot;{perl code}&amp;quot;,&lt;br /&gt;
      &amp;quot;text&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;&amp;lt;NEXT TRIGGER 1&amp;gt;&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;&amp;lt;NEXT TRIGGER 2&amp;gt;&amp;quot;: {&lt;br /&gt;
      ...&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um den JSON-Teil der Dialoge zu testen, empfiehlt sich ein Besuch auf https://jsonlint.com/&lt;br /&gt;
Hier kann der selbst geschriebene JSON-Code validiert werden.&lt;br /&gt;
&lt;br /&gt;
;TRIGGER &lt;br /&gt;
:Kann ein beliebiger Text sein. Es wird geprüft ob die eingehende Nachricht damit übereinstimmt. Falls ja, wird der Dialog an dieser Stelle fortgesetzt.&lt;br /&gt;
&lt;br /&gt;
;match&lt;br /&gt;
:Wenn nicht nur genau eine Nachricht zugelassen werden soll, kann noch eine regex angegeben werden. Die regex muss auf die gesamte eingehnde Nachricht :zutreffen. &lt;br /&gt;
&lt;br /&gt;
;setOnly &lt;br /&gt;
:Kann optional auf true oder false gestellt werden. In beiden fällen wird der TRIGGER dann nicht bei &amp;quot;get &amp;lt;name&amp;gt; trigger&amp;quot; zurück gegeben.&lt;br /&gt;
:Wenn setOnly auf &amp;quot;true&amp;quot; gestellt wird, kann der Dialog an dieser Stelle nicht durch eingehende Nachrichten ausgelöst werden, sondern nur über &amp;quot;get &amp;lt;name&amp;gt; say TRIGGER&amp;quot;. Dies kann dazu genutzt werden um einen Dialog aus :FHEM heraus zu initiieren.&lt;br /&gt;
&lt;br /&gt;
;commands&lt;br /&gt;
:Kann einen einzelnen oder mehrere Befehle enthalten: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;commands&amp;quot;: &amp;quot;single command&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;commands&amp;quot;: [&lt;br /&gt;
&amp;quot;command 1&amp;quot;,&lt;br /&gt;
&amp;quot;command 2&amp;quot;,&lt;br /&gt;
&amp;quot;{perl command}&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;message &lt;br /&gt;
:Kann einen einzelnen oder mehrere Texte enthalten die mit einen Zeilenumbruch verbunden werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;message&amp;quot;: [&lt;br /&gt;
  &amp;quot;text 1&amp;quot;,&lt;br /&gt;
  &amp;quot;text 2&amp;quot;,&lt;br /&gt;
  &amp;quot;{return from perl command}&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Dialogfelder&lt;br /&gt;
:Um Dialogfelder im Keyboard anzuzeigen müssen diese innerhalb des message-Blocks in runden Klammern stehen(). Wichtig ist das nach der schließenden Klammer ein Leerzeichen folgt. Damit das Keyboard angezeigt wird, muss auch ein normaler Text im bessage-Block enthalten sein.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;message&amp;quot;: [&lt;br /&gt;
  &amp;quot;(Dialogfeld 1) &amp;quot;,&lt;br /&gt;
  &amp;quot;(Dialogfeld 2) &amp;quot;,&lt;br /&gt;
  &amp;quot;Bitte wähle ein Dialogfeld aus&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei mehrstufigen Dialogen wird diese Struktur ineinander verschachtelt angegeben.&lt;br /&gt;
Es werden Variablen und Platzhalter, welche unter dem Attribut evalSpecials definiert werden, ausgewertet.&lt;br /&gt;
&lt;br /&gt;
=== Variablen ===&lt;br /&gt;
*$SELF: Eigenname des msgDialog&lt;br /&gt;
*$message: eingegangene Nachricht&lt;br /&gt;
*$recipient: Name des Dialogpartners&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
*allowed: Liste mit allen RESIDENTS und ROOMMATE die für diesen Dialog berechtigt sind.&lt;br /&gt;
*disable: [0|1] Dialog ist aktiviert|deaktiviert.&lt;br /&gt;
*disabledForIntervals: HH:MM-HH:MM HH:MM-HH-MM ...&lt;br /&gt;
*evalSpecials: key1=value1 key2=value2 ...Leerzeichen getrennte Liste von Name=Wert Paaren. Wert kann Leerzeichen enthalten, falls es in &amp;quot;&amp;quot; oder {} eingeschlossen ist. Wert wird als perl-Ausdruck ausgewertet, falls es in {} eingeschlossen ist. In der DEF werden %Name% Zeichenketten durch den zugehörigen Wert ersetzt. Dieses Attribut ist als &amp;quot;msgDialog_evalSpecials&amp;quot; im msgConfig Gerät vorhanden. Wenn der selbe Name im msgConfig und msgDialog definiert wurde, wird der Wert aus msgDialog verwendet.&lt;br /&gt;
*msgCommand &amp;lt;command&amp;gt;: Befehl der zum Versenden einer Nachricht verwendet wird. Die Vorgabe ist &amp;quot;msg push \@$recipients $message&amp;quot; Dieses Attribut ist als &amp;quot;msgDialog_msgCommand&amp;quot; im msgConfig Gerät vorhanden.&lt;br /&gt;
&lt;br /&gt;
=== set ===&lt;br /&gt;
*reset: Setzt den Dialog für alle Benutzer zurück.&lt;br /&gt;
*say [@&amp;lt;recipient1&amp;gt;[,&amp;lt;recipient2&amp;gt;,...]] &amp;lt;TRIGGER&amp;gt;[|&amp;lt;NEXT TRIGGER&amp;gt;|...]: Der Dialog wird für alle angegeben Empänger an der angegeben Stelle fortgeführt. Sind keine Empfänger angegeben wird der Dialog für alle unter dem Attribut allowed angegebenen Empfänger fortgeführt.&lt;br /&gt;
*updateAllowed: Aktualisiert die Auswahl für das Attribut allowed.&lt;br /&gt;
&lt;br /&gt;
=== get ===&lt;br /&gt;
*trigger: Listet alle TRIGGER der ersten Ebene auf bei denen nicht setOnly angegeben ist.&lt;br /&gt;
&lt;br /&gt;
=== READINGS ===&lt;br /&gt;
*$recipient_history: Durch | getrennte Liste von TRIGGER um den aktuellen Zustand des Dialogs zu sichern. Für jeden Dialogpartner wird ein Reading angelegt. Wenn der Dialog beendet ist wird das Reading zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
== Hilfe bei der Fehlersuche ==&lt;br /&gt;
Hier entsteht eine Sammlung von Tipps bei der Fehlersuche. Die meisten dieser &amp;quot;Stolpersteine&amp;quot;&lt;br /&gt;
entstehen häufig bei der Erstellung eines ersten eigenen Dialoges.&lt;br /&gt;
&lt;br /&gt;
=== Das Attribut allowed fehlt oder ist nicht korrekt gesetzt ===&lt;br /&gt;
Das allowed-Attribut dient dazu, einzelne Dialoge für alle  oder nur bestimmte Benutzer zu berechtigen.&lt;br /&gt;
Fehlt es, wird der Dialog dem aufrufenden Benutzer nicht angezeigt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr Testdialog allowed everyone&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Das Attribut msgDialog_evalSpecials fehlt oder ist nicht korrekt gesetzt ===&lt;br /&gt;
Dieses Attribut gehört dem msgConfig device und muss wie in 2.3 zu lesen&lt;br /&gt;
korrekt befüllt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr myMsgConfig msgDialog_evalSpecials me=&amp;lt;Aktivierungswort bzw. -Nachricht&amp;gt;&lt;br /&gt;
TelegramBot=&amp;lt;Name des TelegramBot-device&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Das Attribut utf8Special fehlt beim TelegramBot device ===&lt;br /&gt;
Dieses Attribut ist für die korrekte UTF-8 Kodierung zuständig und im Standard deaktiviert.&lt;br /&gt;
Der Satz &amp;quot;Was kann ich für dich tun?&amp;quot; aus dem Meta-Dialog enthält bereits einen Umlaut!&lt;br /&gt;
&lt;br /&gt;
Folgende FHEM-Log-Fehlermeldung kann auf das fehlende Attribut hindeuten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Datum&amp;gt; &amp;lt;Zeit&amp;gt; 3: TelegramBot_Callback &amp;lt;TelegramBot-Device&amp;gt;: resulted in NonBlockingGet timed out on read from &amp;lt;hidden&amp;gt; after 30s from SendIt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JSON-Syntax Fehler ===&lt;br /&gt;
Das Modul prüft vor dem Abspeichern auf eine korrekte JSON-Syntax.&lt;br /&gt;
Meistens wird auch eine sprechende Meldung angezeigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Usage: define &amp;lt;name&amp;gt; msgDialog {JSON}&lt;br /&gt;
&lt;br /&gt;
, or ] expected while parsing array, at character offset 73 (before &amp;quot;}\n}&amp;quot;) at ./FHEM/76_msgDialog.pm line 93.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Eine gute Anlaufstelle zur Überprüfung von JSON-Code ist hier: https://jsonlint.com/&lt;br /&gt;
 &lt;br /&gt;
=== Es werden keine Dialoge angezeigt ===&lt;br /&gt;
Ohne die Angabe einer normalen Nachricht wird bei Keyboards kein Dialog angezeigt: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;message&amp;quot;: [&lt;br /&gt;
&amp;quot;(Lampen einschalten) &amp;quot;,&lt;br /&gt;
&amp;quot;(Lampen ausschalten) &amp;quot;,&lt;br /&gt;
&amp;quot;(zurück:%me%) &amp;quot;, &lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erst mit der Nachricht &amp;quot;Möchtest Du Lampen ein oder ausschalten?&amp;quot; erscheint der Dialog:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;message&amp;quot;: [&lt;br /&gt;
&amp;quot;(Lampen einschalten) &amp;quot;,&lt;br /&gt;
&amp;quot;(Lampen ausschalten) &amp;quot;,&lt;br /&gt;
&amp;quot;(zurück:%me%) &amp;quot;, &lt;br /&gt;
&amp;quot;Möchtest Du Lampen ein oder ausschalten?&amp;quot;&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Innerhalb eines Dialogs fehlen einzelne Menüeinträge ===&lt;br /&gt;
Das liegt das meistens an einem fehlenden Leerzeichen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;message&amp;quot;: [&lt;br /&gt;
&amp;quot;(Lampen einschalten)&amp;quot;,&lt;br /&gt;
&amp;quot;(Lampen ausschalten) &amp;quot;,&lt;br /&gt;
&amp;quot;(zurück:%me%) &amp;quot;, &lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei &amp;quot;Lampen ausschalten&amp;quot; ist dagegen korrekt ein Leerzeichen zu sehen und somit auch der Menüeintrag im Dialog.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;:&amp;quot; bei Inline Keyboards ===&lt;br /&gt;
Bei Inline Keyboards wird der letzte : als Trennzeichen zwischen Nachricht und Befehl ausgewertet.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;(Temperatur: [heizung:desiredTemperature]°C:setheiz) &amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oder  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;([test:state]:weiter) &amp;quot; wenn [test:state] = &amp;quot;Status: ok&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
==== Programmierung der Waschmaschine ====&lt;br /&gt;
Das ist ein Beispiel zur Programmierung einer Waschmaschine wie auch oben im Video zu sehen: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod Waschmaschine_Dialog msgDialog { &amp;quot;Waschmaschine&amp;quot;: {\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{return(&#039;(Zeitprogramm stoppen) &#039;) if(ReadingsVal(&#039;%controlUnit%&#039;, &#039;controlMode&#039;, &#039;&#039;) eq &#039;auto&#039;)}&amp;quot;,\&lt;br /&gt;
      &amp;quot;{return(&#039;(programmieren) &#039;) if(ReadingsVal(&#039;%actor%&#039;, &#039;state&#039;, &#039;&#039;) ne &#039;on&#039;)}&amp;quot;,\&lt;br /&gt;
      &amp;quot;{return(&#039;(einschalten) &#039;) if(ReadingsVal(&#039;%actor%&#039;, &#039;state&#039;, &#039;&#039;) ne &#039;on&#039;)}&amp;quot;,\&lt;br /&gt;
      &amp;quot;(Verlaufsdiagramm) &amp;quot;,\&lt;br /&gt;
      &amp;quot;(abbrechen) &amp;quot;,\&lt;br /&gt;
      &amp;quot;{return(&#039;Waschmaschine: &#039; . (ReadingsVal(&#039;%actor%&#039;, &#039;state&#039;, &#039;&#039;) eq &#039;on&#039; ? &#039;eingeschaltet&#039; : &#039;ausgeschaltet&#039;))}&amp;quot;,\&lt;br /&gt;
      &amp;quot;{return(&#039;Modus: &#039; . (ReadingsVal(&#039;%controlUnit%&#039;, &#039;controlMode&#039;, &#039;&#039;) eq &#039;auto&#039; ? &#039;Automatik&#039; : &#039;Manuell (&#039; . ReadingsVal(&#039;%controlUnit%&#039;, &#039;time&#039;, &#039;&#039;) . &#039;)&#039;))}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;Zeitprogramm stoppen&amp;quot;: {\&lt;br /&gt;
      &amp;quot;commands&amp;quot;: &amp;quot;set %controlUnit% controlMode manual&amp;quot;,\&lt;br /&gt;
      &amp;quot;message&amp;quot;: [\&lt;br /&gt;
        &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
        &amp;quot;Das Zeitprogramm wurde gestoppt.&amp;quot;\&lt;br /&gt;
      ]\&lt;br /&gt;
    },\&lt;br /&gt;
    &amp;quot;programmieren&amp;quot;: {\&lt;br /&gt;
      &amp;quot;message&amp;quot;: [\&lt;br /&gt;
        &amp;quot;(bestätigen|zurück|abbrechen) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 00:00 | 00:15 | 00:30 | 00:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 01:00 | 01:15 | 01:30 | 01:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 02:00 | 02:15 | 02:30 | 02:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 03:00 | 03:15 | 03:30 | 03:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 04:00 | 04:15 | 04:30 | 04:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 05:00 | 05:15 | 05:30 | 05:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 06:00 | 06:15 | 06:30 | 06:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 07:00 | 07:15 | 07:30 | 07:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 08:00 | 08:15 | 08:30 | 08:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 09:00 | 09:15 | 09:30 | 09:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 10:00 | 10:15 | 10:30 | 10:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 11:00 | 11:15 | 11:30 | 11:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 12:00 | 12:15 | 12:30 | 12:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 13:00 | 13:15 | 13:30 | 13:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 14:00 | 14:15 | 14:30 | 14:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 15:00 | 15:15 | 15:30 | 15:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 16:00 | 16:15 | 16:30 | 16:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 17:00 | 17:15 | 17:30 | 17:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 18:00 | 18:15 | 18:30 | 18:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 19:00 | 19:15 | 19:30 | 19:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 20:00 | 20:15 | 20:30 | 20:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 21:00 | 21:15 | 21:30 | 21:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 22:00 | 22:15 | 22:30 | 22:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;( 23:00 | 23:15 | 23:30 | 23:45 ) &amp;quot;,\&lt;br /&gt;
        &amp;quot;Wann soll die Wäsche fertig sein?&amp;quot;,\&lt;br /&gt;
        &amp;quot;Bitte Uhrzeit in HH:MM angeben.&amp;quot;,\&lt;br /&gt;
        &amp;quot;Aktuell ist [%controlUnit%:time] Uhr eingestellt.&amp;quot;\&lt;br /&gt;
      ],\&lt;br /&gt;
      &amp;quot;Uhrzeit&amp;quot;: {\&lt;br /&gt;
        &amp;quot;match&amp;quot;: &amp;quot; ?([0-1][0-9]|2[0-3]):[0-5][0-9] ?&amp;quot;,\&lt;br /&gt;
        &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
          &amp;quot;set %controlUnit% time $message&amp;quot;,\&lt;br /&gt;
          &amp;quot;set $SELF say @$recipient Waschmaschine|programmieren|bestätigen&amp;quot;\&lt;br /&gt;
        ]\&lt;br /&gt;
      },\&lt;br /&gt;
      &amp;quot;bestätigen&amp;quot;: {\&lt;br /&gt;
        &amp;quot;commands&amp;quot;: &amp;quot;set %controlUnit% controlMode auto&amp;quot;,\&lt;br /&gt;
        &amp;quot;message&amp;quot;: [\&lt;br /&gt;
          &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
          &amp;quot;Das Zeitprogramm wurde eingestellt.&amp;quot;,\&lt;br /&gt;
          &amp;quot;Die Wäsche wird voraussichtlich um [%controlUnit%:time] Uhr fertig sein.&amp;quot;,\&lt;br /&gt;
          &amp;quot;Bitte die Waschmaschine vorbereiten.&amp;quot;\&lt;br /&gt;
        ]\&lt;br /&gt;
      }\&lt;br /&gt;
    },\&lt;br /&gt;
    &amp;quot;einschalten&amp;quot;: {\&lt;br /&gt;
      &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
        &amp;quot;set %controlUnit% controlMode manual&amp;quot;,\&lt;br /&gt;
        &amp;quot;set %actor% on&amp;quot;\&lt;br /&gt;
      ]\&lt;br /&gt;
    },\&lt;br /&gt;
    &amp;quot;Verlaufsdiagramm&amp;quot;: {\&lt;br /&gt;
      &amp;quot;commands&amp;quot;: &amp;quot;set %TelegramBot% cmdSend {plotAsPng(&#039;%plot%&#039;)}&amp;quot;,\&lt;br /&gt;
      &amp;quot;message&amp;quot;: &amp;quot;TelegramBot_MTYPE=queryInline (%me%) $message&amp;quot;\&lt;br /&gt;
    }\&lt;br /&gt;
  },\&lt;br /&gt;
  &amp;quot;auto&amp;quot;: {\&lt;br /&gt;
    &amp;quot;setOnly&amp;quot;: true,\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;set %actor% on&amp;quot;,\&lt;br /&gt;
      &amp;quot;set %controlUnit% controlMode manual&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
      &amp;quot;Die Wachmaschine wurde automatisch eingeschaltet.&amp;quot;\&lt;br /&gt;
    ]\&lt;br /&gt;
  },\&lt;br /&gt;
  &amp;quot;manual&amp;quot;: {\&lt;br /&gt;
    &amp;quot;setOnly&amp;quot;: true,\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
      &amp;quot;Die Wachmaschine wurde manuell eingeschaltet.&amp;quot;\&lt;br /&gt;
    ]\&lt;br /&gt;
  },\&lt;br /&gt;
  &amp;quot;done&amp;quot;: {\&lt;br /&gt;
    &amp;quot;setOnly&amp;quot;: true,\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: &amp;quot;set %actor% off&amp;quot;,\&lt;br /&gt;
    &amp;quot;message&amp;quot;: [\&lt;br /&gt;
      &amp;quot;TelegramBot_MTYPE=queryInline (%me%) &amp;quot;,\&lt;br /&gt;
      &amp;quot;Die Wachmaschine ist fertig.&amp;quot;\&lt;br /&gt;
    ]\&lt;br /&gt;
  }\&lt;br /&gt;
}&lt;br /&gt;
attr Waschmaschine_Dialog evalSpecials actor=HM_2C10D8_Sw\&lt;br /&gt;
controlUnit=Waschkeller_washer_controlUnit\&lt;br /&gt;
plot=Waschkeller_washer_SVG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TelegramBot ==&lt;br /&gt;
&lt;br /&gt;
In [[TelegramBot|Telegram]] gibt es die Möglichkeit die Art des Keyboards zu ändern. Links das normale Keyboard, rechts das Inline Keyboard.&lt;br /&gt;
&lt;br /&gt;
[[Datei:76msgDialog menu.png|Normales Keyboard]]  [[Datei:76msgDialog menu inline.PNG|Inline Keyboard]]&lt;br /&gt;
&lt;br /&gt;
In diesem &#039;&#039;&#039;[https://youtu.be/oRDy2918mVI Video]&#039;&#039;&#039; wird Telegram mit einem Inline Keyboard verwendet.&lt;br /&gt;
&lt;br /&gt;
Um eine Nachricht bei Telegram zu verändern, gibt es den Befehl &amp;quot;queryEditInline&amp;quot;.&lt;br /&gt;
Dafür wird die MsgId von der Nachricht benötigt. Das erledigt ein notify, welches die msgId pro Peer abspeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod sentMsgIdByPeerId notify .+:sentMsgId.+ {\&lt;br /&gt;
  return if $TYPE ne &#039;TelegramBot&#039;;;\&lt;br /&gt;
  \&lt;br /&gt;
  my $dev_hash = ;;\&lt;br /&gt;
  my $sentMsgId = ReadingsVal($NAME, &#039;sentMsgId&#039;, &#039;&#039;);;\&lt;br /&gt;
  my $sentMsgPeerId = ReadingsVal($NAME, &#039;sentMsgPeerId&#039;, &#039;&#039;);;\&lt;br /&gt;
  my $contact = (devspec2array(&amp;quot;TYPE=(ROOMMATE|GUEST):FILTER=msgContactPush=.*$sentMsgPeerId.*&amp;quot;))[0];;\&lt;br /&gt;
  \&lt;br /&gt;
  readingsSingleUpdate($defs{$NAME}, &amp;quot;$contact\_sentMsgId&amp;quot;, $sentMsgId, 1);;\&lt;br /&gt;
}&lt;br /&gt;
attr sentMsgIdByPeerId devStateIcon {ReadingsVal($name, &#039;state&#039;, &#039;inactive&#039;) eq &#039;active&#039; ? &#039;.*:ios-on-blue:inactive&#039; : &#039;.*:ios-off:active&#039;}&lt;br /&gt;
attr sentMsgIdByPeerId icon audio_mic&lt;br /&gt;
attr sentMsgIdByPeerId room msg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach wird der Message-Befehl von  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set &amp;lt;TelegramBot&amp;gt; message&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
auf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set &amp;lt;TelegramBot&amp;gt; queryEditInline &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
geändert. Dafür wird ein [[cmdalias]] verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod message2queryEditInline cmdalias set .+ message (.|\n)+ AS {\&lt;br /&gt;
  my ($NAME, $cmd, $message) = split(/[\s]+/, $EVENT, 3);;\&lt;br /&gt;
  my $TYPE = InternalVal($NAME, &amp;quot;TYPE&amp;quot;, &amp;quot;&amp;quot;);;\&lt;br /&gt;
  (my $recipient, $message) = ($message =~ m/(@\S+)? (.+)/s);;\&lt;br /&gt;
  \&lt;br /&gt;
  if($TYPE eq &amp;quot;TelegramBot&amp;quot; &amp;amp;&amp;amp; $recipient){\&lt;br /&gt;
    my ($contact) = devspec2array(&amp;quot;TYPE=(ROOMMATE|GUEST):FILTER=msgContactPush=.*$recipient.*&amp;quot;);;\&lt;br /&gt;
    my $sentMsgId = ReadingsVal($NAME, &amp;quot;$contact\_sentMsgId&amp;quot;, &amp;quot;&amp;quot;);;\&lt;br /&gt;
\&lt;br /&gt;
    if($sentMsgId ne &amp;quot;&amp;quot;){\&lt;br /&gt;
      fhem(&amp;quot;set $NAME queryEditInline $sentMsgId $recipient $message&amp;quot;);;\&lt;br /&gt;
    }\&lt;br /&gt;
    else{\&lt;br /&gt;
      fhem(&amp;quot;set $NAME queryInline $recipient $message&amp;quot;);;\&lt;br /&gt;
    }\&lt;br /&gt;
  }\&lt;br /&gt;
  else{\&lt;br /&gt;
    fhem(&amp;quot;set $EVENT&amp;quot;);;\&lt;br /&gt;
  }\&lt;br /&gt;
}&lt;br /&gt;
attr message2queryEditInline room msg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um wieder zurück zum normalen Keyboard zu gelangen genügt es, das notify und den cmdAlias zu deaktivieren.&lt;br /&gt;
Das kann komfortabel über ein notify und einen dummy erledigt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod inline_normal.NOT notify inline_normal.DUM:.* {\&lt;br /&gt;
if (&amp;quot;$EVENT&amp;quot; =~ &amp;quot;on&amp;quot;) {\&lt;br /&gt;
  fhem &amp;quot;set sentMsgIdByPeerId active;; attr message2queryEditInline disable 0&amp;quot;;;\&lt;br /&gt;
  } \&lt;br /&gt;
elsif (&amp;quot;$EVENT&amp;quot; =~ &amp;quot;off&amp;quot;) {\&lt;br /&gt;
  fhem &amp;quot;set sentMsgIdByPeerId inactive;; attr message2queryEditInline disable 1&amp;quot;;;\&lt;br /&gt;
  }\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Infos zum Thema Inline Keyboard sind in der Antwort #10 im Forum zu finden (siehe Link unten).&lt;br /&gt;
&lt;br /&gt;
== JABBER ==&lt;br /&gt;
Hier wird die Verwendung mit Jabber beschrieben...&lt;br /&gt;
&lt;br /&gt;
== WhatsApp ==&lt;br /&gt;
Hier wird die Verwendung mit yowsup/WhatsApp beschrieben...&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im {{Link2Forum|Topic=77297|LinkText=FHEM Forum}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Hilfsmodul]]&lt;br /&gt;
[[Kategorie:Telegram]]&lt;br /&gt;
[[Kategorie:Jabber]]&lt;br /&gt;
[[Kategorie:WhatsApp]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-CC-RT-DN_Funk-Heizk%C3%B6rperthermostat&amp;diff=37938</id>
		<title>HM-CC-RT-DN Funk-Heizkörperthermostat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-CC-RT-DN_Funk-Heizk%C3%B6rperthermostat&amp;diff=37938"/>
		<updated>2023-01-12T14:16:11Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: update von virtuellen Sensoren&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=HM-CC-RT-DN.jpg&lt;br /&gt;
|Bildbeschreibung=HM-CC-RT-DN an Heizkörper montiert&lt;br /&gt;
|HWProtocol=[[HomeMatic]]&lt;br /&gt;
|HWType=[[HomeMatic Type Thermostat|thermostat]]&lt;br /&gt;
|HWCategory=[[:Kategorie:Heizungsventile|Heizungsventile]]&lt;br /&gt;
|HWComm=868 MHz&lt;br /&gt;
|HWChannels=6&lt;br /&gt;
|HWVoltage=3&amp;amp;nbsp;V&lt;br /&gt;
|HWPowerConsumption=180&amp;amp;nbsp;mA&lt;br /&gt;
|HWPoweredBy=2x LR6/Mignon/AA&lt;br /&gt;
|HWSize=54x65x93 mm (BxHxT)&lt;br /&gt;
|HWDeviceFHEM=[[CUL_HM]]&lt;br /&gt;
&amp;lt;!-- |ModOwner=  --&amp;gt;&lt;br /&gt;
|HWManufacturer=ELV / eQ-3&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;HM-CC-RT-DN&#039;&#039;&#039; (häufig einfach &#039;&#039;&#039;RT&#039;&#039;&#039; genannt) ist ein Funk-&#039;&#039;Heizkörperthermostate&#039;&#039; mit integriertem &#039;&#039;Stellantrieb&#039;&#039;. Das Thermostat ist seit September 2013 verfügbar und ist der Nachfolger des [[HM-CC-VD Funk-Stellantrieb]]s.&lt;br /&gt;
&lt;br /&gt;
== Vorbemerkungen ==&lt;br /&gt;
: &#039;&#039;→ Einstellungen und Informationen, die alle [[HomeMatic]] Thermostate betreffen, sind unter [[HomeMatic Type Thermostat#Temperaturlisten|HomeMatic Type Thermostat]] zu finden.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der HM-CC-RT-DN kann die Temperatur selbst messen (im Gegensatz zum [[HM-CC-VD Funk-Stellantrieb|Vorgänger]]) und verfügt über eine Fenster-Offen-Erkennung sowie eine Boost-Funktion. Der HM-CC-RT-DN &#039;&#039;kann&#039;&#039; von einem [[HM-TC-IT-WM-W-EU Funk-Wandthermostat AP]] gesteuert werden, das ist aber &#039;&#039;optional&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Das Gerät wird seit Anfang Oktober 2013 von FHEM unterstützt (siehe Diskussion im {{Link2Forum|Topic=14738|LinkText=Forum}}).&lt;br /&gt;
&lt;br /&gt;
Der HM-CC-RT-DN scheint das erste HomeMatic-Device zu sein, bei dem ein Update der Firmware auch vom Anwender durchgeführt werden kann. Ein Firmware-Update erfordert einen [[HM-CFG-USB_USB_Konfigurations-Adapter|USB Konfigurations-Adapter]] und eine auf der eQ-3 Webseite herunterladbare Firmwareupdate-Software. Weitere Details sind unter [[#Firmware Update|Firmware Update]] beschrieben.&lt;br /&gt;
{{Hinweis|Die Solltemperaturen eines HM-CC-RT-DN lassen sich &#039;&#039;nicht&#039;&#039; durch einen [[HM-CC-TC Funk-Wandthermostat]] &#039;&#039;steuern&#039;&#039;. Dieser kann nur die Ist-Temperatur an den HM-CC-RT-DN weitergeben, damit nicht die am HM-CC-RT-DN direkt gemessene Raumtemperatur zur Regelung verwendet wird.}}&lt;br /&gt;
Mit einem HM-CC-RT-DN können maximal (neben der Zentrale/FHEM):&lt;br /&gt;
* 7 HomeMatic Heizkörperthermostate&lt;br /&gt;
* 8 HomeMatic Tür-Fensterkontakte / Fenster-Drehgriffkontakte&lt;br /&gt;
* 8 Tastenpaare von HomeMatic Fernbedienungen bzw. Display-Wandtaster&lt;br /&gt;
* 1 HomeMatic Innen-Temperatur-Sensor&lt;br /&gt;
[[Peering (HomeMatic)|gepeert]] werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Wird für Wartungs-/Umbaumaßnahmen das Wasser der Heizung abgelassen bzw. diese neubefüllt, sind alle Stellantriebe manuell dauerhaft auf &#039;&#039;&#039;on&#039;&#039;&#039; zu setzen: set &amp;lt;HM_Stellantrieb&amp;gt;_Clima controlManu on. Beim Einsatz eines Wandthermostaten ist der Wandthermostat entsprechend einzustellen.}}&lt;br /&gt;
&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
* Betriebsspannung: 2 Stck. 1,5V LR6/Mignon/AA&lt;br /&gt;
* Stromaufnahme: 180 mA max.&lt;br /&gt;
* Abmessungen (B x H x T): 54 x 65 x 93 mm&lt;br /&gt;
* Gewicht: 180 g (ohne Batterien)&lt;br /&gt;
* Ventilanschluss: M30 x 1,5 mm&lt;br /&gt;
&lt;br /&gt;
Aktuelle Firmware: 1.5 (2020)&lt;br /&gt;
&lt;br /&gt;
== Betrieb mit FHEM ==&lt;br /&gt;
Der Funk-Heizkörperthermostat muss zuerst mit FHEM [[Pairing (HomeMatic)|gepairt]] werden. Stellen Sie sicher, dass FHEM aktuell ist ([[update]] durchführen)&lt;br /&gt;
&lt;br /&gt;
Das Pairing sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden (mittlere Taste mindestens drei Sekunden drücken, um den Vorgang auszulösen). Vereinzelt muss mehrfach gepairt werden, es wurde auch berichtet, dass dabei die Batterie zwichendurch entfernt und neu eingelegt werden muss.&lt;br /&gt;
&lt;br /&gt;
=== Channels (Kanäle) ===&lt;br /&gt;
==== Channel (Kanal) 01 _Weather ====&lt;br /&gt;
&lt;br /&gt;
Dieser Kanal dient zur Einspeisung der (gemessenen) &#039;&#039;Ist-Temperatur&#039;&#039;. Als Sensor können zum Beispiel das [[HM-TC-IT-WM-W-EU Funk-Wandthermostat AP|HM-TC-IT-WM-W-EU Funk-Wandthermostat]] oder ein [[HM-WDS40-TH-I Funk-Temperatur-/Feuchtesensor innen (IT)|HM-WDS40-TH-I Funk-Temperatur-/Feuchtesensor]] dienen.&lt;br /&gt;
&lt;br /&gt;
Ein Temperatur-Sensor &#039;&#039;tempSensor&#039;&#039; kann mit dem &#039;&#039;_Weather&#039;&#039;-Kanal wie folgt [[Peering (HomeMatic)|gepeert]] werden: &lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;HM-TC-IT-WM-W-EU&amp;gt;_Weather peerChan 0 &amp;lt;HM-CC-RT-DN&amp;gt;_Weather single set&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
  set EG_Buero_WANDTHERMOSTAT_Weather peerChan 0 EG_Buero_THERMOSTAT_Weather single set&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: Das Wandthermostat sowie das Thermostat Ventil (Beispiel &amp;quot;EG_Buero_WANDTHERMOSTAT&amp;quot; und EG_Buero_THERMOSTAT) werden vorher in FHEM den Status &amp;quot;CMDs_done&amp;quot; anzeigen.&lt;br /&gt;
Beim peerChan wird dann bei beiden &amp;quot;CMDs_pending&amp;quot; stehen. Wobei das Wandthermostat sehr schnell wieder auf CMDs_done zurück springt.&lt;br /&gt;
Allerdings ist dringend darauf zu achten, dass das Thermostat Ventil auch wieder auf  &amp;quot;CMDs_done&amp;quot; wechselt, bevor man den nächsten Befehl absendet.&lt;br /&gt;
Das Heizkörper Ventil kann unter Umständen 3 bis 5 min benötigen bis wieder &amp;quot;CMDs_done&amp;quot; steht. Evtl. kann man dies durch die BOOST Taste beschleunigen. Da das Ventil etwa alle 3 min aufwacht, prüft und Daten sendet / empfängt. Sollte man mit dem Befehlen weiter gemacht haben, so kann es zu dem Problem führen, dass einer nicht mehr mit dem Pending aufhört. In dem Fall empfiehlt es sich beide Devices von FHEM abzumelden und auf Werkseinstellung zu resetten. &lt;br /&gt;
&lt;br /&gt;
Zum Test haucht man das Wandthermostat an oder hält es einige Zeit in der Hand bis die Temperatur steigt, nach etwa 3 Minuten sollte man auch am Thermostat Ventil einen Temperaturanstieg sehen.&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 02 _Climate ====&lt;br /&gt;
Dieser Kanal erlaubt es dem [[HM-TC-IT-WM-W-EU Funk-Wandthermostat AP|HM-TC-IT-WM-W-EU Funk-Wandthermostat]] den HM-CC-RT-DN zu steuern. Dazu müssen die beiden Geräte gepeert werden:&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;HM-TC-IT-WM-W-EU&amp;gt;_Climate peerChan 0 &amp;lt;HM-CC-RT-DN&amp;gt;_Climate single set&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 03 _WindowRec ====&lt;br /&gt;
Mit diesem Kanal können Fensterkontakte ([[HM-SEC-SC Tür-Fensterkontakt|HM-SEC-SC]] und [[HM-Sec-RHS Funk-Fenster-Drehgriffkontakt|HM-SEC-RHS]]) ihren Fensterstatus (geöffnet / gekippt) an ein oder mehrere Thermostate senden. Die Thermostate stellen anschließend die entsprechende (konfigurierbare) Temperatur ein. Der Temperaturwert kann je Fenster-Sensor unterschiedlich definiert werden. Sind mehrere Fenster gleichzeitig geöffnet, so wird der Thermostat auf die Temperatur des Sensors mit dem geringsten Temperaturwert eingestellt. &lt;br /&gt;
Ferner wird empfohlen, bei Einsatz von externen Sensoren, die interne „Fenster auf Erkennung“ zu deaktivieren (weitere Details sind im [[HM-CC-RT-DN Funk-Heizkörperthermostat#Channel .28Kanal.29 04 _Clima|Channel (Kanal) 04 _Clima]] beschrieben).&lt;br /&gt;
&lt;br /&gt;
Der Befehl zum Peeren lautet, wobei &amp;lt;fensterSensor&amp;gt; die FHEM-Kanalbezeichnung für den Fensterkontakt ist und &amp;lt;rt_WindowRec&amp;gt; die Kanalbezeichnung für den entsprechenden Kanal des Heizkörperthermostates (siehe {{Link2Forum|Topic=41541|LinkText=diesen Thread}}):&lt;br /&gt;
 set &amp;lt;fensterSensor&amp;gt; peerChan 0 &amp;lt;rt_WindowRec&amp;gt;_WindowRec single &lt;br /&gt;
&lt;br /&gt;
Zum Löschen (=unpeeren) dieser Kopplung:&lt;br /&gt;
 set &amp;lt;fensterSensor&amp;gt; peerChan 0 &amp;lt;rt_WindowRec&amp;gt;_WindowRec single unset&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Der Peer-(Lösch-)Vorgang muss erst am Fensterkontakt durch Drücken der Anlerntaste ausgelöst werden, und zwar auch dann, wenn der Fensterkontakt schon vorher mit FHEM gepairt wurde. Dann kann der oben genannte Befehl in FHEM abgesetzt werden. Wichtig scheint auch, dass der Fensterkontakt geschlossen ist wenn man die Anlerntaste drückt.&lt;br /&gt;
&lt;br /&gt;
Der Befehl zur Temperatureinstellung des Heizkörperthermostaten für den Zustand &amp;quot;Fenster offen&amp;quot; lautet, wobei &amp;lt;fensterSensor&amp;gt; die FHEM-Kanalbezeichnung für den Fensterkontakt ist und &amp;lt;rt_WindowRec&amp;gt; die Kanalbezeichnung für den entsprechenden Kanal des Heizkörperthermostates, sowie &amp;lt;Temp&amp;gt; die einzustellende Temperatur (ganzzahliger Wert):&lt;br /&gt;
 set &amp;lt;rt_WindowRec&amp;gt;_WindowRec regSet winOpnTemp &amp;lt;Temp&amp;gt; &amp;lt;fensterSensor&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Hinweise im Forum, siehe {{Link2Forum|Topic=41541|Message=348044|LinkText=FHEM Forum-Beitrag}}&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 04 _Clima ====&lt;br /&gt;
Dieser Kanal dient zum Einstellen der Betriebsparameter, auch [[#Temperaturlisten|Temperaturlisten]] sind hierauf zu übertragen.&lt;br /&gt;
Mit dem Modul [[Weekprofile|Wochenplan / Weekprofile]] können die Wochenpläne komfortabel in FHEM erstellt und an die Thermostate übertragen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In älteren Versionen von FHEM wurde dieser Kanal durch &#039;&#039;autocreate&#039;&#039; als &amp;lt;code&amp;gt;_ClimRT_tr&amp;lt;/code&amp;gt; angelegt. Der Hersteller hat hier offenbar die internen Bezeichnungen geändert, denn beim Vorläufermodell HM-CC-TC mussten Temperaturlisten auf den Kanal &#039;&#039;Climate&#039;&#039; übertragen werden.}}&lt;br /&gt;
&lt;br /&gt;
Die maximale Öffnung des Ventils kann mittels folgendem Befehl eingestellt werden (hier auf 80 %):&lt;br /&gt;
  set &amp;lt;HM-CC-RT-DN&amp;gt;_Clima regSet valveMaxPos 80&lt;br /&gt;
&lt;br /&gt;
Die interne &amp;quot;Fenster-auf&amp;quot;-Erkennung kann man wie folgt abschalten:&lt;br /&gt;
  set &amp;lt;HM-CC-RT-DN&amp;gt;_Clima regSet winOpnMode off&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 05 _ClimaTeam ====&lt;br /&gt;
Dieser Kanal erlaubt es mehrere HM-CC-RT-DN zu einem &amp;quot;Team&amp;quot; zu gruppieren. Ein Mitglied des Teams meldet&lt;br /&gt;
* Änderungen der Temperatur am Handrad&lt;br /&gt;
* Einschalten des Boost-Modus am Taster&lt;br /&gt;
an seine &amp;quot;Teamkollegen&amp;quot; weiter. Folgende Änderungen werden &#039;&#039;&#039;nicht&#039;&#039;&#039; weitergegeben:&lt;br /&gt;
* Status der Fensterkontakte&lt;br /&gt;
* Temperaturlisten/Wochenplan und daraus folgende Änderungen&lt;br /&gt;
* Änderungen durch Fernbedienungen&lt;br /&gt;
* Änderungen durch eine HomeMatic-Zentrale&lt;br /&gt;
&lt;br /&gt;
Befehl zum Peeren, wobei &#039;&#039;&amp;lt;HM-CC-RT-DN#1&amp;gt;_ClimaTeam&#039;&#039;, &#039;&#039;&amp;lt;HM-CC-RT-DN#2&amp;gt;_ClimaTeam&#039;&#039;, ..., &#039;&#039;&amp;lt;HM-CC-RT-DN#8&amp;gt;_ClimaTeam&#039;&#039; die Kanalbezeichnungen der jeweiligen ClimaTeam-Kanäle sind:&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN#1&amp;gt;_ClimaTeam peerChan 0 &amp;lt;HM-CC-RT-DN#2&amp;gt;_ClimaTeam single&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN#1&amp;gt;_ClimaTeam peerChan 0 &amp;lt;HM-CC-RT-DN#3&amp;gt;_ClimaTeam single&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN#2&amp;gt;_ClimaTeam peerChan 0 &amp;lt;HM-CC-RT-DN#3&amp;gt;_ClimaTeam single&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
==== Channel (Kanal) 06 _remote ====&lt;br /&gt;
Dieser Kanal kann an eine Fernbedienung gekoppelt werden. Per Tastendruck kann man einen bestimmten Mode und/oder eine bestimmte Temperatur wählen. Dabei kann die Reaktion auf einen langen oder kurzen Tastendruck gesondert eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Der Befehl zum Peeren lautet, wobei &amp;lt;button&amp;gt; die Kanalbezeichnung der Fernbedienung und &amp;lt;rt-remote&amp;gt; die Kanalbezeichnung des Heizkörperthermostates ist:&lt;br /&gt;
set &amp;lt;nowiki&amp;gt;&amp;lt;button&amp;gt; peerChan 0 &amp;lt;HM-CC-RT-DN&amp;gt;_remote single&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodus Auto, Manu, Party (Urlaub) ===&lt;br /&gt;
&lt;br /&gt;
Der HM-CC-RT-DN verfügt über drei Betriebsmodus: Auto, Manu (Manuell) und Party (Urlaub). &lt;br /&gt;
&lt;br /&gt;
==== Modus Auto ====&lt;br /&gt;
Das Gerät arbeitet gemäß des gespeicherten Wochenprogramms. Manuelle Änderungen sind möglich, werden aber beim nächsten Schaltpunkt überschrieben.&lt;br /&gt;
&lt;br /&gt;
==== Modus Manu ====&lt;br /&gt;
Die Temperatur wird manuell eingestellt, das Wochenprogramm wird nicht abgearbeitet. &amp;quot;Manuell Einstellen&amp;quot; bedeutet entweder am Handrad oder durch Übermittlung eines &amp;quot;set desired temp&amp;quot;-Befehls von FHEM (oder equivalent von einer CCU).&lt;br /&gt;
&lt;br /&gt;
==== Modus Party (Urlaub) ====&lt;br /&gt;
Die eingestellte Temperatur gilt bis zu einem gegebenen Endzeitpunkt, anschließend wechselt das Thermostat in den &#039;&#039;Auto&#039;&#039;-Modus. &lt;br /&gt;
&lt;br /&gt;
==== Welchen Modus nutzen? ====&lt;br /&gt;
Im Umfeld von FHEM sind alle drei Modi einsetzbar. Betrieb in &amp;quot;Auto&amp;quot; hat den Vorteil, dass bei Ausfall der FHEM-Instanz der Thermostat trotzdem noch die eingespeicherten Wochenprogramme abarbeitet. Nachteilig ist aber, dass die Steuerung komplexer wird, weil sowohl die Einstellungen am Thermostat als auch Schaltbefehle von FHEM das Verhalten beeinflussen. Vielfach wird daher im Umfeld von FHEM der Modus &amp;quot;Manu&amp;quot; benutzt, hier wird die Temperatur nur per einzelnem FHEM Schaltbefehl gesteuert, ausgelöst z.b. durch &amp;quot;at&amp;quot; Kommandos, Anwesenheitserkennung oder Bewegungsmelder. Sollte FHEM (oder die Funkverbindung) ausfallen, bleibt der Thermostat allerdings auf der letzten eingestellten Temperatur stehen.&lt;br /&gt;
&lt;br /&gt;
Denkbar ist auch, den Modus &amp;quot;Auto&amp;quot; zu verwenden und dann die Steuerung per FHEM dadurch durchzuführen, dass durch FHEM die Wochenprogramme verändert werden. Dies verbindet zwar die Vorteil der vorgenannten Methoden, ist aber am Aufwendigsten in der Programmierung und erzeugt die höchste Funklast.&lt;br /&gt;
&lt;br /&gt;
Auch der Urlaubsmodus ist einsetzbar, so kann beispielsweise bei Abwesenheit ein niedrigeres Temperaturprofil eingestellt werden, ohne dass eventuell vorhandene Temperaturlisten verändert werden müssen.&lt;br /&gt;
&lt;br /&gt;
  set &amp;lt;HM-CC-RT-DN&amp;gt;_Clima controlParty 16 06.12.13 16:30 09.12.13 05:00&lt;br /&gt;
&lt;br /&gt;
Dadurch wird &lt;br /&gt;
* von 06.12.2013, 16:30 Uhr&lt;br /&gt;
* bis 09.12.2013, 05:00 Uhr &lt;br /&gt;
* die gewünschte Raumtemperatur auf 16 °C eingestellt.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|&lt;br /&gt;
* Der Befehl muss auf dem Kanal 4 &#039;&#039;(_Clima)&#039;&#039; erfolgen.&lt;br /&gt;
* Es werden nur Uhrzeiten zu jeder vollen oder halben Stunde angenommen (Minuten also 00 oder 30).}}&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Funktion &amp;lt;code&amp;gt;Urlaub()&amp;lt;/code&amp;gt; kann man eine ganze Wohnung (also mehrere RTs) mit nur einem Befehl in den Party-Modus versetzen. Im Beispiel werden zwei Heizkörper (&amp;quot;Treppenhaus&amp;quot; und &amp;quot;Kammer&amp;quot;) angesteuert.&lt;br /&gt;
&lt;br /&gt;
Zu beachten sind folgende Dinge:&lt;br /&gt;
# Aktuelle Dateien (z.B. &amp;lt;code&amp;gt;10_CUL_HM&amp;lt;/code&amp;gt;) verwenden!&lt;br /&gt;
# Bei dem &#039;&#039;controlParty&#039;&#039;-Befehl &#039;&#039;kein&#039;&#039; Komma zwischen den Parametern.&lt;br /&gt;
# Bei der Funktion die Parameterübergabe definieren &amp;lt;code&amp;gt;($$$$$)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufruf:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;{Urlaub (&amp;quot;16&amp;quot;, &amp;quot;06.12.13&amp;quot;, &amp;quot;16:30&amp;quot;, &amp;quot;09.12.13&amp;quot; ,&amp;quot;05:00&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktion:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my $Urlaub;&lt;br /&gt;
sub&lt;br /&gt;
Urlaub($$$$$)&lt;br /&gt;
  {&lt;br /&gt;
    my ($temp, $startDate, $startTime, $endDate, $endTime) = @_;&lt;br /&gt;
 &lt;br /&gt;
    # HM-CC-RT-DN akzeptiert nur Zeiten, die auf Minute 00 oder 30 enden.&lt;br /&gt;
    # Daher $startTime und $endTime abrunden&lt;br /&gt;
    $startTime =~ s/\:[0-2].$/:00/;&lt;br /&gt;
    $startTime =~ s/\:[3-5].$/:30/;&lt;br /&gt;
    $endTime =~ s/\:[0-2].$/:00/;&lt;br /&gt;
    $endTime =~ s/\:[3-5].$/:30/;&lt;br /&gt;
&lt;br /&gt;
    # controlParty bei jedem HM-CC-RT-DN setzen.&lt;br /&gt;
    for my $rt (qw(Kammer Treppenhaus)) {&lt;br /&gt;
      fhem (&amp;quot;set $rt controlParty $temp $startDate $startTime $endDate $endTime&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tastensperre ===&lt;br /&gt;
&lt;br /&gt;
Um zu verhindern, dass der Modus oder die Temperatur per Tasten bzw. Drehrad am HM-CC-RT-DN verändert wird, kann eine Tastensperre gesetzt werden. Dies erfolgt mittels des Befehls:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt; regSet btnLock on&lt;br /&gt;
&lt;br /&gt;
Rückgängig machen geht per:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt; regSet btnLock off&lt;br /&gt;
&lt;br /&gt;
Diese Tastensperre kann man aber am HM-CC-RT-DN durch eine Tastenkombination wieder zurücksetzen. Um sie nur per FHEM rücksetzen zu können, muss&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt; regSet globalBtnLock on&lt;br /&gt;
&lt;br /&gt;
eingegeben werden. Rückgängig geht wieder per:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt; regSet globalBtnLock off&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Tastensperre die nur das Umschalten des Modus (Auto, Manuell, Urlaub) am Gerät verhindert. Diese wird mit&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt; regSet modusBtnLock on&lt;br /&gt;
&lt;br /&gt;
eingeschaltet. Abschalten geht mit:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt; regSet modusBtnLock off&lt;br /&gt;
&lt;br /&gt;
=== Burst-Modus ===&lt;br /&gt;
Das ist ein &#039;&#039;&#039;Übertragungs&#039;&#039;&#039;modus für Nachrichten zwischen HM-Geräten und der Zentrale. Der RT erwacht alle 2,5 Minuten und dann überträgt die Zentrale die Kommandos. Wenn man einen Fensterkontakt oder eine Fernsteuerung nutzt, muss der RT sofort reagieren - dann muss man den Burst &#039;&#039;enablen&#039;&#039;. Der RT kann in diesem Fall sofort aufgeweckt werden und bearbeitet die Anforderung (Request). Das kann man auch von der Zentrale aus nutzen (so man möchte). Das ist der &#039;&#039;&#039;Vorteil&#039;&#039;&#039; des eingeschalteten Burst-Modus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nachteil:&#039;&#039;&#039; Der Burst-Modus benötigt mehr Leistung, das heißt die Batterien müssen häufiger gewechselt werden: Der RT muss den Receiver ständig empfangsbereit halten. Außerdem wachen bei jedem Burst &#039;&#039;alle&#039;&#039; Burst-Empfänger auf – egal an wen die Kommunikation gerichtet war.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Burst – wie es funktioniert&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Schickt ein Sender eine burst Sequenz, wachen alle burst-Empfänger auf und prüfen die Message. &lt;br /&gt;
Wenn sie betroffen sind bleiben sie eine Zeit lang wach, ansonsten schlafen sie wieder ein. &lt;br /&gt;
Man beachte also, dass Senden eines Burst  Energie in ALLEN burst-Empfängern verbraucht, egal ob sie angesprochen sind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HMLAN und burst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[HMLAN]] hat ein Sendebudget das über eine Stunde berechnet wird. Burst belastet dieses Konto deutlich - so können nicht mehr als 100 bursts /h gesendet werden - dann geht HMLAN in overload. Wenn zusätzliche Nachrichten gesendet werden sind es entsprechend weniger. &lt;br /&gt;
Es ist nicht vorteilhaft, unnötig bursts zu senden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Burst devices&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es gibt Devices, die immer auf burst reagieren und solche bei denen es abgeschaltet werden kann. So reagiert ein Rauchmelder immer auf Burst damit er seine Team-Kollegen hören kann. &lt;br /&gt;
Ein TC oder RT hingegen hat diese Funktion abschaltbar. &#039;Per default ist dies ausgeschaltet um Batterie zu sparen&#039;. Wenn ein VD gesteuert wird ist der TC ja selbst wach.  Wird er aber mit einem Fensterkontakt gekoppelt muss es eingeschaltet werden – sonst verpasst er die Nachricht. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ConditionalBurst devices&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Devices mit abschaltbarem Burst wie z.B. der &#039;&#039;HM-CC-RT-DN&#039;&#039; haben ein Register, &#039;&#039;burstRx&#039;&#039;, mit dem das burst-Erwachen eingestellt werden kann. &lt;br /&gt;
Sendern, die einen burst-Aktor erwecken sollen, muss man sagen, welcher Peer Burst benötigt. Hier kann ggf. das Register &#039;&#039;peerNeedsBurst&#039;&#039; nach dem Peeren gesetzt werden. FHEM versucht dies automatisch beim Peeren zu erledigen. Siehe [[HMInfo]] Befehl &#039;&#039;models&#039;&#039; um herauszufinden, welche Devices welchen Modus unterstützen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attribut burstAccess&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Devices, die abschaltbaren burst haben kann man ein attribut burstAccess 1_auto setzen. Es wird beim Abschicken eines Kommandos versucht, das Device mit burst zu wecken. Sollte es nicht funktionieren wird gewartet, bis das Device aufwacht (meist reagieren solche Devices auch auf wakeup). Das Setzen des Attributs ist angenehm – es werden aber ggf. viele bursts gesendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kommando burstXmit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mit diesem Kommando, das bei Devices mit conditional-Burst zu Verfügung steht, wird der burst gezielt vom User angestoßen.&lt;br /&gt;
&lt;br /&gt;
Der User schickt erst seine Kommandos an das device. Die Kommandos werden im Command-stack gesammelt. &lt;br /&gt;
&lt;br /&gt;
Dann sendet der User ein set burstXmit.&lt;br /&gt;
&lt;br /&gt;
Es passiert das gleiche wie bei burstAccess.&lt;br /&gt;
&lt;br /&gt;
FHEM versucht mittels burst zu wecken und sendet bei Erfolg die Messages aus dem Kommandostack. &lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu burstAccess ist burstXmit gezielt einsetzbar und kann sparsamer verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; FHEM und burst devices&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
FHEM sendet eine burst automatisch mit Kommandos zu Devices, die nur burst unterstützen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;So aktiviert man den burst-Betrieb am HM-CC-RT-DN&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Burst Mode einschalten&#039;&#039; (der Kanal 4 des Device WZ1 heisst hier WZ1_4)&lt;br /&gt;
:&amp;lt;code&amp;gt;set WZ1_4 regSet burstRx on &amp;lt;/code&amp;gt;&lt;br /&gt;
prüfen mit:&lt;br /&gt;
:&amp;lt;code&amp;gt;get WZ1_4 reg burstRx &amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;Nun in FHEM den Burst mode einschalten (sofern nicht burstXmit verwendet wird)&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr WZ1 burstAccess 1_auto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Attribut im Device und nicht im Kanal setzen, ansonsten gibt es eine Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
=== Temperaturlisten ===&lt;br /&gt;
Die Temperaturlisten des HM-CC-RT-DN werden identisch mit denen anderer HomeMatic Thermostate verwaltet (siehe [[HomeMatic Type Thermostat#Temperaturlisten|HomeMatic Type Thermostat]]). Beim HM-CC-RT-DN ist der Kanal 4 (_Clima) für die Temperaturlisten zuständig.&lt;br /&gt;
&lt;br /&gt;
==FHEM-Log==&lt;br /&gt;
In den folgenden Logs heißt Kanal 4 noch &amp;quot;_ClimRT_tr&amp;quot;. Inzwischen würde man dort &amp;quot;_Clima&amp;quot; sehen.&lt;br /&gt;
&lt;br /&gt;
=== Device-Log ===&lt;br /&gt;
 2013.10.10 20:03:24 3: CUL_HM Unknown device CUL_HM_HM_CC_RT_DN_2212BC, please define it&lt;br /&gt;
 2013.10.10 20:03:24 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC CUL_HM 2212BC A1A0184002212BC0000001000954B4551303531303031375900FFFF&lt;br /&gt;
 2013.10.10 20:03:24 3: Device CUL_HM_HM_CC_RT_DN_2212BC added to ActionDetector with 000:10 time&lt;br /&gt;
 2013.10.10 20:03:24 3: CUL_HM pair: CUL_HM_HM_CC_RT_DN_2212BC thermostat, model HM-CC-RT-DN serialNr KEQ0510017&lt;br /&gt;
 2013.10.10 20:03:24 3: LANCUL pairing (hmPairForSec) not enabled&lt;br /&gt;
 2013.10.10 20:03:24 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC-%Y.log CUL_HM_HM_CC_RT_DN_2212BC&lt;br /&gt;
 2013.10.10 20:03:24 3: Device Heizung_Wohnzimmer added to ActionDetector with 000:10 time&lt;br /&gt;
 2013.10.10 20:03:24 3: CUL_HM pair: Heizung_Wohnzimmer thermostat, model HM-CC-TC serialNr JEQ0044286&lt;br /&gt;
 2013.10.10 20:03:24 3: Device CUL_HM_HM_CC_RT_DN_2212BC added to ActionDetector with 000:10 time&lt;br /&gt;
 2013.10.10 20:03:24 3: CUL_HM pair: CUL_HM_HM_CC_RT_DN_2212BC thermostat, model HM-CC-RT-DN serialNr KEQ0510017&lt;br /&gt;
 2013.10.10 20:03:25 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_Weather CUL_HM 2212BC01&lt;br /&gt;
 2013.10.10 20:03:25 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_Weather FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_Weather-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_Weather&lt;br /&gt;
 2013.10.10 20:03:25 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_Weather FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_Weather-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_Weather&lt;br /&gt;
 2013.10.10 20:03:26 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_Climate CUL_HM 2212BC02&lt;br /&gt;
 2013.10.10 20:03:26 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_Climate FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_Climate-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_Climate&lt;br /&gt;
 2013.10.10 20:03:26 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_Climate FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_Climate-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_Climate&lt;br /&gt;
 2013.10.10 20:03:27 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_WindowRec CUL_HM 2212BC03&lt;br /&gt;
 2013.10.10 20:03:27 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_WindowRec FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_WindowRec-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_WindowRec&lt;br /&gt;
 2013.10.10 20:03:27 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_WindowRec FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_WindowRec-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_WindowRec&lt;br /&gt;
 2013.10.10 20:03:28 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr CUL_HM 2212BC04&lt;br /&gt;
 2013.10.10 20:03:28 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr&lt;br /&gt;
 2013.10.10 20:03:28 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr&lt;br /&gt;
 2013.10.10 20:03:29 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam CUL_HM 2212BC05&lt;br /&gt;
 2013.10.10 20:03:29 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam&lt;br /&gt;
 2013.10.10 20:03:29 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_ClimaTeam&lt;br /&gt;
 2013.10.10 20:03:30 2: autocreate: define CUL_HM_HM_CC_RT_DN_2212BC_remote CUL_HM 2212BC06&lt;br /&gt;
 2013.10.10 20:03:30 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_remote FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_remote-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_remote&lt;br /&gt;
 2013.10.10 20:03:30 2: autocreate: define FileLog_CUL_HM_HM_CC_RT_DN_2212BC_remote FileLog /usr/local/FHEM/var/log/CUL_HM_HM_CC_RT_DN_2212BC_remote-%Y.log CUL_HM_HM_CC_RT_DN_2212BC_remote&lt;br /&gt;
 2013.10.10 20:03:35 3: Device CUL_HM_HM_CC_RT_DN_2212BC added to ActionDetector with 000:10 time&lt;br /&gt;
 2013.10.10 20:03:40 2: CUL_HM set CUL_HM_HM_CC_RT_DN_2212BC getSerial&lt;br /&gt;
 2013.10.10 20:03:40 2: CUL_HM set CUL_HM_HM_CC_RT_DN_2212BC getConfig&lt;br /&gt;
 2013.10.10 20:03:54 3: Device CUL_HM_HM_CC_RT_DN_2212BC added to ActionDetector with 000:10 time&lt;br /&gt;
&lt;br /&gt;
=== Event monitor ===&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr motorErr: ok&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr measured-temp: 18.4&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr desired-temp: 18&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr ValvePosition: 3 %&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr mode: manu&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr unknown0: 24&lt;br /&gt;
 2013-10-12 12:05:35.610 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC_ClimRT_tr T: 18.4 desired: 18 valve: 3 %&lt;br /&gt;
 2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC battery: ok&lt;br /&gt;
 2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC batteryLevel: 3.1 V&lt;br /&gt;
 2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC measured-temp: 18.4&lt;br /&gt;
 2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC desired-temp: 18&lt;br /&gt;
 2013-10-12 12:05:35.646 CUL_HM CUL_HM_HM_CC_RT_DN_2212BC actuator: 3 %&lt;br /&gt;
&lt;br /&gt;
== Firmware Update ==&lt;br /&gt;
Seit 24.10.2014 gibt es für den HM-CC-RT-DN die neue Firmware Version 1.4. Diese kann von der eQ-3 Webseite heruntergeladen werden. Genauere Informationen gibt es unter [[HomeMatic Firmware Update]].&lt;br /&gt;
&lt;br /&gt;
=== HM-CC-RT-DN spezifische Update Informationen ===&lt;br /&gt;
Durch gleichzeitiges Drücken der &amp;quot;Auto-/Manu&amp;quot;-Taste und der &amp;quot;Comfort-/Eco&amp;quot;-Taste am HM-CC-RT-DN während man die Batterien wieder einlegt wird der updatemodus gestartet. Während des Updates steht &amp;quot;FUP&amp;quot; im Display. Nach erfolgreichem Update erscheint &amp;quot;Ins&amp;quot; im Display und es muss eine erneute Adaptierfahrt durch Drücken der Boost-Taste ausgelöst werden. Anschließend sollte der HM-CC-RT-DN wieder normal funktionieren. Die eingestellten Parameter und das Pairing mit FHEM gehen beim Update nicht verloren. Sollte das Update fehlschlagen, erscheint &amp;quot;Err&amp;quot; bzw. &amp;quot;CrC&amp;quot; im Display.&lt;br /&gt;
&lt;br /&gt;
Normalerweise sollte dann durch erneutes Starten der Prozedur am PC und HM-CC-RT-DN das ganze erneut durchführbar sein.&lt;br /&gt;
&lt;br /&gt;
Es gibt einige Readings, die nicht durch ein einfaches &#039;&#039;getConfig&#039;&#039; aktualisiert werden, z.B. &amp;quot;battery&amp;quot;(nicht batteryLevel). Um diese Readings zu bekommen, ist ein &lt;br /&gt;
:&amp;lt;code&amp;gt;set Device_Channel04 controlMode auto &amp;lt;/code&amp;gt;&lt;br /&gt;
notwendig. Daraufhin werden die Readings übertragen/aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Anscheinend ([https://forum.fhem.de/index.php?topic=93074.msg1252268#msg1252268]) benötigt man bei Firmware 1.5 ein weiteres Attribut,&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr &amp;lt;devicename&amp;gt; commStInChn off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simulation von Fensterkontakten und externen Temperatursensoren ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Für jeden separat zu steuernden HM-CC-RT-DN kann nur je ein Kanal eines virtuellen Devices als Temperatur- bzw. Fensterkontakt genutzt werden. Insbesondere die virtuellen Kanäle der VCCU eignen sich nicht dazu, mehrere HM-CC-RT-DN unabhängig voneinander anzusteuern! Hat man mehrere unabhängig arbeitende RT&#039;s, muß für jeden auch ein &#039;&#039;&#039;eigenes virtuelles Gerät&#039;&#039;&#039; angelegt werden!  &lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele sind nicht für Anfänger und Unwissende geeignet! Es gibt zahlreiche Stolpersteine:&lt;br /&gt;
# Die HMId für virtuelle Geräte muss einmalig im System sein. Sie muss selbst gewählt werden und es darf &#039;&#039;&#039;keine&#039;&#039;&#039; vorhandene ID verwendet werden!&lt;br /&gt;
# Es kann vorkommen, das beim Anlegen eines virtual Gerätes kein attr IODev gesetzt wird. Das Attribute ist aber notwendig, sonst arbeitet das Gerät nicht! Bitte kontrollieren und gegebenenfalls per Hand setzen.&lt;br /&gt;
}}&lt;br /&gt;
Grober Ablauf:&lt;br /&gt;
* erstelle ein virtuelles Device&lt;br /&gt;
* erstelle dazu einen virtuellen Kanal (bzw. mehrere, wenn sowohl ein virtueller Fensterkontakt wie ein virtueller Temperaturkanal benötigt werden).&lt;br /&gt;
* peere den Kanal mit dem RT (als Fenster-Kontakt oder als remote, wenn du willst)&lt;br /&gt;
* sende ein postEvent / stelle die neue Temperatur im Kanal ein&lt;br /&gt;
&lt;br /&gt;
=== Fensterkontakte ===&lt;br /&gt;
&#039;&#039;Angelehnt an diese {{Link2Forum|Topic=31078|Message=236245|LinkText=Forenbeitrag}}&#039;&#039;&lt;br /&gt;
 define virtKitchenSensors CUL_HM 221133&lt;br /&gt;
Um das Device als virtuelles zu kennzeichnen benötigt man den folgenden Befehl (legt weitere Attribute an): &lt;br /&gt;
 attr virtKitchenSensors model VIRTUAL&lt;br /&gt;
&lt;br /&gt;
Kanal bzw. Kanäle erstellen (benötigt uU. einen Neustart von FHEM, bevor der Befehl zur Verfügung steht):&lt;br /&gt;
 set virtKitchenSensors virtual 1 &lt;br /&gt;
oder (für das Anlegen je eines Kanals für einen Fenster- und Temperatur-Kanal):&lt;br /&gt;
 set virtKitchenSensors virtual 2 &lt;br /&gt;
Als Zwischenergebnis sehen wir in der Detailansicht des &#039;&#039;virtKitchenSensors&#039;&#039; ein bzw. zwei weitere Devices mit Namen &#039;&#039;virtKitchenSensors_Btn1&#039;&#039; bzw. &#039;&#039;virtKitchenSensors_Btn2&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Umbenennen des 1. Kanals: &lt;br /&gt;
 rename virtKitchenSensors_Btn1 virtualKitchenDoor&lt;br /&gt;
&lt;br /&gt;
Danach sollte man das webCmd-Attribut wie folgt vergeben:&lt;br /&gt;
 attr virtualKitchenDoor webCmd postEvent open:postEvent closed &lt;br /&gt;
&lt;br /&gt;
Anschließend peeren und (wer weniger wie den default-Wert von 12°C einstellen möchte) Temperatur festlegen mit:&lt;br /&gt;
 set virtualKitchenDoor peerChan 0 &amp;lt;Thermostat_Window_Rec&amp;gt; single set&lt;br /&gt;
 set &amp;lt;Thermostat_Window_Rec&amp;gt; regSet winOpnTemp 5 virtualKitchenDoor&lt;br /&gt;
&lt;br /&gt;
Ggf noch interne &amp;quot;Fenster-auf&amp;quot; Erkennung abschalten&lt;br /&gt;
 set &amp;lt;HM-CC-RT-DN&amp;gt;_Clima regSet winOpnMode off&lt;br /&gt;
&lt;br /&gt;
Die virtuelle Tür wird dann entsprechend über ein Notify getriggert.&lt;br /&gt;
Einfache Form (nur ein Fensterkontakt im Raum):&lt;br /&gt;
 define notify_virtualKitchenDoor notify Fensterkontakt_1:(open|closed) set virtualKitchenDoor postEvent $EVENT&lt;br /&gt;
Komplexere Form (zwei Fensterkontakte):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;define notify_virtualKitchenDoor notify (Fensterkontakt_1|Fensterkontakt_2) {if($EVENT eq &amp;quot;open&amp;quot; and Value(&amp;quot;virtualKitchenDoor&amp;quot;) eq &amp;quot;set_postEvent closed&amp;quot;){fhem(&amp;quot;set virtualKitchenDoor postEvent open&amp;quot;)} elsif (Value(&amp;quot;virtualKitchenDoor&amp;quot;) eq &amp;quot;closed&amp;quot; &amp;amp;&amp;amp; Value(&amp;quot;Fensterkontakt_2&amp;quot;) eq &amp;quot;closed&amp;quot;) {fhem(&amp;quot;set virtualKitchenDoor postEvent closed&amp;quot;)}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Hinweis|Die &#039;&#039;postEvent&#039;&#039;-Anweisung wird unmittelbar an die Funkschnittstelle weitergegeben und löst einen &#039;&#039;burst&#039;&#039; aus.}}&lt;br /&gt;
&lt;br /&gt;
=== Temperatursensoren ===&lt;br /&gt;
&#039;&#039;Angelehnt an diesen {{Link2Forum|Topic=19686|Message=233788|LinkText=Forenbeitrag}}&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Virtuelles HomeMatic Device mit eigener HM Id definieren, (s.o.), es kann auch ein weiterer Kanal des oben erstellten Devices genutzt werden&lt;br /&gt;
&lt;br /&gt;
2. Dem Device einen virtuellen Kanal (Default ist ein virtueller Button) hinzufügen, wieder mit &amp;lt;code&amp;gt;set virtKitchenSensors virtual 1&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;set virtKitchenSensors virtual 2&amp;lt;/code&amp;gt; (2 geht auch, wenn bereits ein erster Kanal vorhanden war).&lt;br /&gt;
&lt;br /&gt;
3. Es ist kein virtueller Button sondern ein virtueller Temperatursensor - darum rename:&lt;br /&gt;
 rename virtKitchenSensors_Btn1 Kitchen_vT_Sensor1&lt;br /&gt;
bzw. &amp;lt;code&amp;gt;rename virtKitchenSensors_Btn2 Kitchen_vT_Sensor1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Virtuellen Peer Sensor mit dem Weather Channel des RT-DN peeren:&lt;br /&gt;
 set Kitchen_vT_Sensor1 peerChan 0 &amp;lt;RT_DN&amp;gt;_Weather single&lt;br /&gt;
&lt;br /&gt;
5. Peering kontrollieren (Voraussetzung: Device &#039;&#039;hm&#039;&#039; vom Typ [[HMInfo]] existiert):&lt;br /&gt;
:&amp;lt;code&amp;gt;set hm peerXref&amp;lt;/code&amp;gt;&lt;br /&gt;
Beispiel-Ausgabe:&lt;br /&gt;
 peerXref done: &lt;br /&gt;
 x-ref list &lt;br /&gt;
    wz_Thermostat_Weather =&amp;gt; Kitchen_vT_Sensor1 &lt;br /&gt;
    Kitchen_vT_Sensor1 =&amp;gt; wz_Thermostat_Weather&lt;br /&gt;
&lt;br /&gt;
6. Gemessene Temperatur vom z.B. 1-Wire DS1820 dem virtuellen HM Sensor übergeben. Z.B. bei jeder Aktualisierung des Messwerts per notify:&lt;br /&gt;
 define at_Kitchen_vT notify myRealKitchenTempSensor:temperature:.* set Kitchen_vT_Sensor1 virtTemp $EVTPART1&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Die &#039;&#039;virtTemp&#039;&#039;-Anweisung ändert zunächst nur den Wert im virtuellen Kanal. Diese wird zu bestimmten Zeiten als &#039;&#039;broadcast&#039;&#039; gesendet. Diese Zeiten kennt der RT und hält sich kurzfristig empfangsbereit.}}&lt;br /&gt;
Sollte es Probleme geben, dass der RT des Öfteren wieder auf seine eigenen Messwerte wechselt, weil die von FHEM errechnete Sendezeit und die vom RT errechnete Empfangszeit zu weit auseinanderliegen, sollte das Attr cyclicMsgOffset im Virtuellen Kanal beachtet werden. Näheres dazu ist ca. ab {{Link2Forum|Topic=45735|Message=572806|LinkText=hier}} im Forum zu finden.&lt;br /&gt;
&lt;br /&gt;
7. Sicherstellen, dass nicht längerfristig veraltete Temperaturdaten berücksichtigt werden:&lt;br /&gt;
Aufgrund des oben beschriebenen Verfahrens wird der im virtuellen Kanal vorhandene Wert solange immer wieder gesendet, wie dieser dort steht. Fällt z.B. der echte Sensor oder das Interface nicht nur vorübergehend aus, muß der Wert gelöscht werden. Hier ein Vorschlag für ein &#039;&#039;at&#039;&#039;, das alle 15 Minuten alle virtuellen Temperaturwerte löscht, die älter als eine Stunde sind, und damit den Rückfall des jeweiligen RT auf seinen internen Sensor bewirkt:&lt;br /&gt;
 defmod a_delete_outdated_virtTemps at +*00:15 {\&lt;br /&gt;
 my @vTemps = devspec2array(&amp;quot;TYPE=CUL_HM:FILTER=model=VIRTUAL:FILTER=temperature~.+&amp;quot;);;\&lt;br /&gt;
  for my $vTemp (@vTemps) {\&lt;br /&gt;
    CommandDeleteReading(undef,&amp;quot;$vTemp temperature&amp;quot; ) if ReadingsAge($vTemp,&amp;quot;temperature&amp;quot;,0) &amp;gt; HOURSECONDS ;;\&lt;br /&gt;
  }\&lt;br /&gt;
 }&lt;br /&gt;
Erhält der RT eine gewisse Zeitlang (ca. 15 Minuten) keinen Wert von seinem (virtuellen) Peer, schaltet er auf den internen Temperatursensor zurück und signalisiert dies durch ein blinkendes Funksymbol im Display.&lt;br /&gt;
&lt;br /&gt;
=== Exkurs: HMCCUDEV  ===&lt;br /&gt;
{{Hinweis|Das Nachfolgende entspricht dem Stand Janaur 2020. Die HMCCU-Module sind jedoch derzeit in der Weiterentwicklung, so dass es sich ggf. empfiehlt, im Forum nachzufragen.}}&lt;br /&gt;
Das Nutzen externer Sensoren scheint mit HMCCU nicht möglich zu sein, siehe {{Link2Forum|Topic=107134|LinkText=Forenbeitrag: RaspberryMatic (HMCCU) und LaCrosse Temperature als &amp;quot;Wandthermostat&amp;quot;}}, die Weitergabe eines externen Türkontakts ist eventuell  möglich, siehe {{Link2Forum|Topic=106807|LinkText=Forenbeitrag: HMCCU mit Thermostat HM-CC-RT-DN und ZWave Türsensor}}, an anderer Stelle hat der Modulentwickler ausgeführt, es könnten nur {{Link2Forum|Topic=107501|Message=1015944|LinkText=HomeMatic Geräte}} als Sensoren verwendet werden.&lt;br /&gt;
&lt;br /&gt;
== Auflistung und Beschreibung der Readings ==&lt;br /&gt;
Einige der Readings können via &amp;quot;regSet&amp;quot; parametriert werden.&lt;br /&gt;
Wobei der Registername etwas anders geschrieben wird als der Reading Name (ohne R-).&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; regSet &amp;lt;register&amp;gt; &amp;lt;value&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
Beispiel für Reading R-winOpnPeriod erhöhen auf 60 Minuten: &lt;br /&gt;
:&amp;lt;code&amp;gt;set EG_Buero_THERMOSTAT_Clima regSet winOpnPeriod 60 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Liste erhält man auch, wenn man einen falschen Registernamen angibt.&lt;br /&gt;
  supported register are backOnTime boostPeriod boostPos btnLock btnNoBckLight burstRx cyclicInfoMsg cyclicInfoMsgDis dayTemp daylightSaveTime decalcTime decalcWeekday globalBtnLock localResDis lowBatLimitRT modePrioManu modePrioParty modusBtnLock nightTemp noMinMax4Manu pairCentral regAdaptive reguExtI reguExtP reguExtPstart reguIntI reguIntP reguIntPstart showInfo showWeekday sign tempMax tempMin tempOffset valveErrPos valveMaxPos valveOffsetRt winOpnBoost winOpnDetFall winOpnMode winOpnPeriod winOpnTempI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-top: 2px solid #ffffff; border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#A6A6A6&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#0D0D0D&amp;quot;&amp;gt;Reading&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-top: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#A6A6A6&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#0D0D0D&amp;quot;&amp;gt;Beispielwert&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-top: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#A6A6A6&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#0D0D0D&amp;quot;&amp;gt;M&amp;amp;ouml;gliche Werte&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-top: 2px solid #ffffff; border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#A6A6A6&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#0D0D0D&amp;quot;&amp;gt;Beschreibung&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;CommandAccepted&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;yes&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;yes; no&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Letztes Kommando akzeptiert (yes/ No)&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-boostPeriod&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;5 min&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;1 min bis x min&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Zeit wie lange das Ventil im Boost Modus sein soll.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-boostPos&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot; sdval=&amp;quot;0.8&amp;quot; sdnum=&amp;quot;1033;0;0%&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;80%&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot; sdnum=&amp;quot;1033;0;0%&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;0 bis 100&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Ventilposition die im Boost Modus gesetzt wird.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-btnNoBckLight&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;on; off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;35&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-dayTemp&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;21 C&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R-tempMin bis R-tempMax&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Solltemperatur die gesetzt werden soll, wenn das Sonnensymbol am Thermostat gedr&amp;amp;uuml;ckt wird.  Ebenso wird bei dieser Solltemperatur das Sonnensymbol im Display angezeigt.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-daylightSaveTime&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;on&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;on; off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-decalcTime&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot; sdval=&amp;quot;0.458333333333333&amp;quot; sdnum=&amp;quot;1033;1033;H:MM&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;11:00&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot; sdnum=&amp;quot;1033;1033;H:MM&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;00:00 bis 23:59&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Uhrzeit wann die Entkalkungsfahrt durchgef&amp;amp;uuml;hrt werden soll. &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-decalcWeekday&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Sat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Mon; Tue; Wed; Thu; Fri; Sat; Sun&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Tag an dem die Entkalkungsfahrt durchgef&amp;amp;uuml;hrt werden soll.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-modePrioManu&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;all&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;all; ???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-modePrioParty&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;all&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;all; ???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;35&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-nightTemp&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;17 C&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R-tempMin bis R-tempMax&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Solltemperatur die gesetzt werden soll, wenn das Mondsymbol am Thermostat gedr&amp;amp;uuml;ckt wird.  Ebenso wird bei dieser Solltemperatur das Mondsymbol im Display angezeigt.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-noMinMax4Manu&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;on; off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-regAdaptive&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;on&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;on; off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-reguExtI&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot; sdval=&amp;quot;15&amp;quot; sdnum=&amp;quot;1033;&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;15&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-reguExtP&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot; sdval=&amp;quot;30&amp;quot; sdnum=&amp;quot;1033;&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;30&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-reguExtPstart&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot; sdval=&amp;quot;30&amp;quot; sdnum=&amp;quot;1033;&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;30&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-reguIntI&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot; sdval=&amp;quot;18&amp;quot; sdnum=&amp;quot;1033;&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;18&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-reguIntP&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot; sdval=&amp;quot;33&amp;quot; sdnum=&amp;quot;1033;&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;33&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-reguIntPstart&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot; sdval=&amp;quot;44&amp;quot; sdnum=&amp;quot;1033;&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;44&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-showInfo&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;time&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;date; time&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Zeige Datum oder Uhrzeit im Display an&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-showWeekday&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;on; off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Zeige den Wochentag im Display an&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-sign&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;on; off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-tempMax&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;30.5 C&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Gr&amp;amp;ouml;&amp;amp;szlig;te einstellbare Temperatur&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-tempMin&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;4.5 C&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Kleinste einstellbare Temperatur&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-tempOffset&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;0.0K&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;0.0 bis ???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Temperaturabweichung gemessene Temperatur vs. realer Temperatur in Grad Kelvin. Angabe in 0.5-Schritten ohne Einheitenzeichen, z.B. 0.5 oder -1.0&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-valveErrPos&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot; sdval=&amp;quot;0.15&amp;quot; sdnum=&amp;quot;1033;0;0%&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;15%&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot; sdnum=&amp;quot;1033;0;0%&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-valveMaxPos&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot; sdval=&amp;quot;1&amp;quot; sdnum=&amp;quot;1033;0;0%&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;100%&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot; sdnum=&amp;quot;1033;0;0%&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;0 bis 100&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Maximale Ventilstellung die das Thermostat fahren darf.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-valveOffsetRt&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot; sdval=&amp;quot;0&amp;quot; sdnum=&amp;quot;1033;0;0%&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;0%&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot; sdnum=&amp;quot;1033;0;0%&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;0 Bis 100&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;52&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-winOpnBoost&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;on; off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Startet nach dem Fensterschlie&amp;amp;szlig;en die Boostfunktion um unabh&amp;amp;auml;ngig von der Raumtemperatur den Heizk&amp;amp;ouml;rper eine Zeit x aufzuheizen. (Siehe R-boostPeriod &amp;amp;amp; R-boostPos)&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-winOpnDetFall&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;1.4 K&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;0.5 bis 2.5&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Temperatur Sturz zwischen zwei Messungen, die als Fenster offen erkannt werden.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;35&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-winOpnMode&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;on; off&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Thermostat soll anhand eines schnellen Temperaturabfalls erkennen, dass das Fenster ge&amp;amp;ouml;ffnet ist.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-winOpnPeriod&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;15 min&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;1 bis 60 Minuten&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Dauer bis das Signal Fenster offen wieder entfernt wird.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R-winOpnTemp&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;12 C&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R-tempMin bis R-tempMax&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Temperatur die eingestellt werden soll, wenn das Fenster als offen erkannt wird.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;104&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;07:00 20.0 22:30 22.0 24:00 20.0&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;incomplete = Daten werden mit Thermostat abgeglichen&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Zeit/Temperaturangaben siehe Beispiel&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Tages Solltemperaturen abh&amp;amp;auml;ngig von der Uhrzeit. &amp;lt;br&amp;gt;- Der Beginn um 00:00 ist nicht einzutragen. &amp;lt;br&amp;gt;- Es sind immer Paare einzutragen (Uhrzeit Temperatur). &amp;lt;br&amp;gt;- Der letzte Eintrag muss an jedem Tag 24:00 sein.&amp;lt;br&amp;gt;- Uhrzeiten sind auf halbe Stunden beschr&amp;amp;auml;nkt. Eintr&amp;amp;auml;ge 08:00 und 08:30 sind g&amp;amp;uuml;ltig. 08:20 ist ung&amp;amp;uuml;ltig.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R_1_tempListSun&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;07:00 20.0 22:00 22.0 24:00 20.0&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R_2_tempListMon&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;04:30 20.0 07:00 22.0 12:45 20.0 22:00 22.0 24:00 20.0&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R_3_tempListTue&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;04:30 20.0 07:00 22.0 12:45 20.0 22:00 22.0 24:00 20.0&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R_4_tempListWed&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;04:30 20.0 07:00 22.0 12:45 20.0 22:00 22.0 24:00 20.0&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R_5_tempListThu&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;04:30 20.0 07:00 22.0 12:45 20.0 22:00 22.0 24:00 20.0&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R_6_tempListFri&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;04:30 20.0 07:00 22.0 12:45 20.0 22:00 22.0 24:00 20.0&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Siehe R_0_tempListSat&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;35&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;R_tempList_State&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;verified&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;incomplete = Daten werden mit Thermostat abgeglichen&amp;lt;br&amp;gt;verified = Daten sind mit Thermostat abgeglichen&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Aktualisierungsstatus der Wochen Temperatur Einstellungen&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;ValvePosition&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot; sdval=&amp;quot;36&amp;quot; sdnum=&amp;quot;1033;&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;36&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;0 bis 100&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;aktuelle Ventilstellung&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;35&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;boostTime&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;-&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;-&amp;lt;br&amp;gt;1 min bis n min&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Zeit wie lange der Boostmodus noch aktiv ist.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;121&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;controlMode&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;auto&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;auto = Thermostat wird nach der TempListe gesteuert&amp;lt;br&amp;gt;manual = Die eingestellte Temperatur am Thermostat wird nicht ver&amp;amp;auml;ndert, au&amp;amp;szlig;er bei Verwendung von WinOpn; &amp;lt;br&amp;gt;boost = Thermostat wird in den Boost Modus gesetzt. Siehe R-boostPeriod/Pos&amp;lt;br&amp;gt;day = Thermostat wird auf die eingestellte Tag Temperatur gesetzt (R-dayTemp).&amp;lt;br&amp;gt;night = Thermostat wird auf die eingestellte Nacht Temperatur gesetzt (R-nightTemp).&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Setzt das Thermostat in einen bestimmten Modus&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;desired-temp&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot; sdval=&amp;quot;22&amp;quot; sdnum=&amp;quot;1033;&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;22&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;N/A&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Solltemperatur&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;measured-temp&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot; sdval=&amp;quot;23.2&amp;quot; sdnum=&amp;quot;1033;&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;23.2&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;N/A&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Isttemperatur&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;partyEnd&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;-&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Ende Datum/Zeit in dem die Party Temperatur (partyTemp) gesetzt sein soll.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;partyStart&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;-&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Start Datum/Zeit in dem die Party Temperatur (partyTemp) gesetzt sein soll.&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;partyTemp&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;-&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;-; 20.0&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Party Temperatur&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;21&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;recentStateType&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;ack&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-right: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#333333&amp;quot; sdnum=&amp;quot;1033;1033;M/D/YYYY H:MM&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;???&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-bottom: 2px solid #ffffff; border-left: 2px solid #ffffff&amp;quot; height=&amp;quot;23&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;state&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-bottom: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;T: 23.2 desired: 22.0 valve: 36&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-bottom: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td style=&amp;quot;border-bottom: 2px solid #ffffff&amp;quot; align=&amp;quot;left&amp;quot; valign=&amp;quot;middle&amp;quot; bgcolor=&amp;quot;#111111&amp;quot;&amp;gt;&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;2&amp;quot; color=&amp;quot;#CCCCCC&amp;quot;&amp;gt;Aktuelle Statusinformation&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
=== TempList: Bad format ... ===&lt;br /&gt;
Wenn Sie beim Setzen einer Temperaturliste nach dem o.a. Schema (&amp;quot;SetTempList...&amp;quot;) die Meldung&lt;br /&gt;
&lt;br /&gt;
 Bad format, use HH:MM TEMP ......&lt;br /&gt;
&lt;br /&gt;
erhalten, sollten Sie zunächst ein [[update]] von FHEM durchführen.&lt;br /&gt;
&lt;br /&gt;
=== Der Thermostat heizt über die Solltemperatur hinaus ===&lt;br /&gt;
In der Regel ist das ein ganz normales Verhalten, wenn der Thermostat nicht mit einem externen Temperaturfühler oder einem Wandthermostat gepeert ist. In dem Fall muss sich der Thermostat auf den eingebauten Temperatursensor verlassen, der sehr nahe an der Heizung selbst sitzt. Dadurch ist die gemessene Temperatur höher, als sie z.B. in der Raummitte wäre. Der Hersteller hat hier einen mehr oder weniger intelligenten Algorithmus eingebaut, um diesen Effekt zu kompensieren. Das sieht dann so aus, als ob der Thermostat nicht richtig regelt.&lt;br /&gt;
Dieses Verhalten kann man im Prinzip nur verhindern, indem man einen externen Temperatursensor oder einen Wandthermostat peert. Wie das geht ist hier beschrieben: [[#Channel (Kanal) 01 _Weather]]. Normalerweise regelt der Thermostat dann genau auf die Solltemperatur. &lt;br /&gt;
Ansonsten sollte man sich auch fragen, ob das gezeigte Verhalten vielleicht doch gut genug ist. Dazu platziert man irgendein Thermometer möglichst in der Mitte des Raums und beobachtet den Temperaturverlauf eine Weile. Wenn man dann noch eine Abweichung feststellt, kann es sinnvoll sein, diese mittels des Registers R-tempOffset zu beheben.&lt;br /&gt;
&lt;br /&gt;
=== Pairen bei Firmware 1.5 ===&lt;br /&gt;
Das nachfolgende Vorgehen bietet sich ab Firmware 1.5 ab, da sonst das pairen nicht erfolgreich sein wird:&lt;br /&gt;
# Pairing wie angegeben&lt;br /&gt;
# &#039;&#039;&#039;&#039;&#039;GetConfig&#039;&#039;&#039;&#039;&#039; erst, nachdem die Zeit von &#039;&#039;&#039;&#039;&#039;hmPairForSec&#039;&#039;&#039;&#039;&#039; abgelaufen ist&lt;br /&gt;
# burstXmit&lt;br /&gt;
# set &amp;lt;gerät&amp;gt; reset&lt;br /&gt;
# set &amp;lt;gerät&amp;gt; unpair &lt;br /&gt;
# harten HW Reset nach Handbuch am Gerät&lt;br /&gt;
# erneut pairen&lt;br /&gt;
Der Tipp stammt aus [https://de.elv.com/forum/neue-firmware-1.5-an-fhem-uart-modul-hm-mod-rpi-pcb-mit-firmware-1.4.1-7481 diesem Beitrag] im ELV Forum. Dies Vorgang konnte teilweise auch für Geräte mit Firmware 1.4 bestätigt werden.&lt;br /&gt;
&lt;br /&gt;
Falls es Probleme während der Prozedur gibt, bitte den Abschnitt [[HM-CC-RT-DN Funk-Heizkörperthermostat#HM-CC-RT-DN spezifische Update Informationen|HM-CC-RT-DN_spezifische_Update_Informationen]] beachten.&lt;br /&gt;
&lt;br /&gt;
=== Akkubetrieb ===&lt;br /&gt;
Auch frisch geladenen NiMh-Akkus weisen nur eine Zellenspannung von nur ca. 1,2 Volt auf. Deshalb wird schnell die battery:low Warngrenze erreicht, die bei U &amp;lt; 2,4V  liegt und mitunter unmittelbar nach dem Einsetzen mit der Kalibierungsfahrt unterschritten wird. Mit &#039;&#039;NiMh-Akkus mit geringer Selbstentladung&#039;&#039; (z.b. Panasonic Eneloop) ist ein Betrieb jedoch sinnvoll möglich, da der Spannungsabfall bei den sehr geringen Entladeströmen im Stellantrieb relativ lange oberhalb 1,3 Volt verläuft.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.eq-3.de/produkt-detail-aktoren/items/homematic-funk-heizkoerperthermostat.html Produktinfo bei EQ-3]&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/downloads_produktkatalog/homematic/bda/HM-CC-RT-DN_UM_GE_eQ-3_web.pdf Bedienungsanleitung bei EQ-3 (PDF)]&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/downloads_produktkatalog/homematic/pdb/Funk-Heizkoerperthermostat_105155_Produktdatenblatt_V2.3.pdf Datenblatt bei EQ-3 (PDF)]&lt;br /&gt;
* [http://www.eq-3.de/Downloads/eq3/downloads/Ventilkompatibilitaeten.pdf Ventil-Kompatibilitätsliste bei EQ-3 (zur Zeit nicht verfügbar)]&lt;br /&gt;
* {{Link2Forum|Topic=14738|LinkText=Forenthema zum Thermostat}}&lt;br /&gt;
* {{Link2Forum|Topic=64446|LinkText=Reparatur einer durch mechanischen Stoß von außen abgerissenen Lichtschranke}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Heizungsventile]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT_GENERIC_BRIDGE&amp;diff=37742</id>
		<title>MQTT GENERIC BRIDGE</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT_GENERIC_BRIDGE&amp;diff=37742"/>
		<updated>2022-11-30T16:54:09Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Klarstellung bzgl. ClientID und mosquitto_pub&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Stellt für beliebige Geräte eine Schnittstellt zum MQTT-Protokoll zur Verfügung&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=MQTT_GENERIC_BRIDGE&lt;br /&gt;
|ModForumArea=MQTT&lt;br /&gt;
|ModTechName=10_MQTT_GENERIC_BRIDGE.pm&lt;br /&gt;
|ModOwner=hexenmeister ({{Link2FU|4065|Forum}}) }}&lt;br /&gt;
&lt;br /&gt;
{{Baustelle}}&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
&lt;br /&gt;
Das Modul &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; stellt eine zentrale Schnittstelle zum MQTT-Protokoll für beliebig viele andere FHEM-Geräte bereit. Es wird für eine FHEM-Installation jeweils nur ein erreichbarer MQTT-Server sowie eine Instanz der &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; benötigt. Es ist aber auch möglich, mehrere Server parallel zu betreiben.&lt;br /&gt;
&lt;br /&gt;
Dieses Modul kann seit November 2018 mit allen drei IO-Modul-Varianten zusammen eingesetzt werden, also sowohl mit {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} bzw. [[MQTT2_CLIENT]] oder [[MQTT (Modul)|MQTT]](00_MQTT.pm), und seit Rev. 23514 (Jan. 2021) wird für &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; iVm. den MQTT2-IO-Modulen keine zusätzliche Software mehr benötigt. &lt;br /&gt;
&lt;br /&gt;
Dabei erfolgt an dem zentralen &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039;-Gerät selbst nur eine Basiskonfiguration, die Standardwerte für alle anzubindenden Geräte bereitstellt, alle übrigen Einstellungen erfolgen durch Attribute an dem jeweiligs anzubindenden Gerät selbst. &lt;br /&gt;
&lt;br /&gt;
Beispiel: ein Aktor des Typs [[HomeMatic|CUL_HM]] kann über MQTT-Kommandos an den für ihn passenden Topic an- oder ausgeschaltet werden oder auch einfach nur seinen aktuellen Schaltzustand per MQTT-Protokoll publizieren.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
===Vorbereitung===&lt;br /&gt;
Im folgenden wird als MQTT-Server &#039;&#039;mosquitto&#039;&#039; verwendet, der in aktuellen Linux-Distributionen über die Paketverwaltung angeboten wird. Hier die Installation für Raspberry Pi OS: &lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get upgrade&lt;br /&gt;
 sudo apt-get install mosquitto&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein bereits vorhandener {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} verwendet werden.&lt;br /&gt;
&lt;br /&gt;
===Grundsätzliche Konfiguration===&lt;br /&gt;
Definition der Schnittstelle zum MQTT-Server (hier: auf demselben Raspberry):&lt;br /&gt;
&lt;br /&gt;
 defmod mqtt_io MQTT2_CLIENT 127.0.0.1:1883&lt;br /&gt;
 attr mqtt_io alias MQTT Broker&lt;br /&gt;
 attr mqtt_io devStateIcon .*active:none:disconnect .*disconnected:none:connect&lt;br /&gt;
 attr mqtt_io group MQTT&lt;br /&gt;
 attr mqtt_io icon mqtt&lt;br /&gt;
 attr mqtt_io room IO_Devices&lt;br /&gt;
&lt;br /&gt;
Wer möchte, kann den Status des FHEM-Servers per MQTT LWT mitteilen:&lt;br /&gt;
&lt;br /&gt;
Für MQTT2_CLIENT:&lt;br /&gt;
 attr mqtt_io lwt system/&amp;lt;fhem-name&amp;gt;/connection/status connection lost&lt;br /&gt;
 attr mqtt_io lwtRetain 1&lt;br /&gt;
 attr mqtt_io msgAfterConnect -r system/&amp;lt;fhem-name&amp;gt;/connection/status connected&lt;br /&gt;
 attr mqtt_io msgBeforeDisconnect -r system/&amp;lt;fhem-name&amp;gt;/connection/status disconnected&lt;br /&gt;
&lt;br /&gt;
Alternativ: für [[MQTT (Modul)|MQTT]]&lt;br /&gt;
 attr mqtt last-will retain:1 system/&amp;lt;fhem-name&amp;gt;/connection/status connection lost&lt;br /&gt;
 attr mqtt on-connect retain:1 {Log3(&amp;quot;mqtt&amp;quot;,3,&amp;quot;connected to MQTT server&amp;quot;);;1} system/&amp;lt;fhem-name&amp;gt;/connection/status connected&lt;br /&gt;
 attr mqtt on-disconnect retain:1 {Log3(&amp;quot;mqtt&amp;quot;,3,&amp;quot;disconnected from MQTT server&amp;quot;);;1} system/&amp;lt;fhem-name&amp;gt;/connection/status disconnected&lt;br /&gt;
&lt;br /&gt;
===Definition der Generic Bridge===&lt;br /&gt;
Der Name &#039;&#039;mqttGenericBridge&#039;&#039; kann dabei frei gewählt werden:&lt;br /&gt;
 defmod mqttGenericBridge MQTT_GENERIC_BRIDGE&lt;br /&gt;
 attr mqttGenericBridge IODev mqtt_io&lt;br /&gt;
 attr mqttGenericBridge alias MQTT generic bridge&lt;br /&gt;
 attr mqttGenericBridge group MQTT&lt;br /&gt;
 attr mqttGenericBridge room IO_Devices&lt;br /&gt;
 attr mqttGenericBridge stateFormat dev: device-count in: incoming-count out: outgoing-count&lt;br /&gt;
&lt;br /&gt;
Damit sind die wesentlichen Vorarbeiten abgeschlossen, und die &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; kann bereits dafür genutzt werden, beliebige Reading- oder Attribut-Änderungen von FHEM-Devices über MQTT zu publishen oder entsprechende Anweisungen umzusetzen. Es wird jedoch empfohlen, zunächst noch einige grundlegende Einstellungen vorzunehmen. Hierfür - sowie dann auch für die Konfiguration der weiteren Devices, die an MQTT angebunden werden sollen, steht als Hilfsmittel [[attrTemplate]] zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Basisangaben in der MQTT_GENERIC_BRIDGE selbst===&lt;br /&gt;
[[Datei:MGB attrTemplate Base.PNG|400px|thumb|attrTemplate base_settings_to_MQTT_GENERIC_BRIDGE]]Zunächst werden die Basisangaben zur Struktur der zu verwendenden MQTT-Topics sowie - bei Verwendung eines MQTT2-Interface-Moduls - die &#039;&#039;clientOrder&#039;&#039; konfiguriert:&lt;br /&gt;
 set mqttGenericBridge attrTemplate base_settings_to_MQTT_GENERIC_BRIDGE&lt;br /&gt;
Dies kann direkt über die Detailansicht des Geräts mqttGenericBridge erfolgen, siehe der nebenstehende screenshot, aus dem auch zu entnehmen ist, was das attrTemplate an Änderungen der Konfiguration vornehmen wird. Dies sind zwei Aspekte:&lt;br /&gt;
Zum einen wird eine Variable namens $base in Sende- und in Empfangsrichtung festgelegt. In Senderichtung (pub:) besteht diese nur aus dem Namen der &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039;, in Empfangsrichtung (sub:) aus dem Namen sowie dem Topic-Anteil &#039;&#039;set&#039;&#039;. Diese Angaben können im Prinzip beliebig geändert werden, es muss lediglich darauf geachtet werden, dass die Angaben unterschiedlich sind, sonst kann es zu unbeabsichtigten Schleifen kommen!&lt;br /&gt;
[[Datei:MGB attrTemplate Base M2IO options.PNG|400px|thumb|attrTemplate Anfrage der gewünschten Konfigurationsoption]]Zum anderen wird - sofern ein  &#039;&#039;MQTT2_CLIENT&#039;&#039; und &#039;&#039;MQTT2_SERVER&#039;&#039; als Interface verwendet wird - je nach Wahl des Nutzers in dem dann erscheinenden Dialogfeld - die clientOrder festgelegt. Wer hier unschlüssig ist, sollte die empfohlene Variante wählen, um Probleme im Zusammenspiel mit der &#039;&#039;autocreate&#039;&#039;-Funktion dieser Interface-Typen möglichst zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In vielen [[Dokumentationsstruktur#Internet, Blogs usw.|im Internet zu findenden Anleitungen]] wird pauschal das Attribut &#039;&#039;globalPublish&#039;&#039; gesetzt. Dieses führt allerdings dazu, dass zum einen sehr viele unwichtige Daten (oder eben ggf. auch unbeabsichtigt: eigentlich besser geheim zu haltende Daten?) an den MQTT-Server übermittelt werden, und zum anderen eine aufwändige Nachbearbeitung auf der Gegenseite erforderlich werden kann. Daher wird hiervon &#039;&#039;&#039;ausdrücklich abgeraten!&#039;&#039;&#039; Stattdessen kann man relativ einfach über den attrTemplate-Mechanismus (nur) die Informationen über MQTT verfügbar machen, die in der Regel für externe Anwendungen auch benötigt werden.}}&lt;br /&gt;
&lt;br /&gt;
==Basics zur Konfiguration der anzubindenden Geräte==&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Auch wer plant, später die Kommandos mit einer ganz anderen Software zu versenden, sollte zunächst den Weg über die Linux-Konsole und die Tools &#039;&#039;mosquitto_sub&#039;&#039; und &#039;&#039;mosquitto_pub&#039;&#039; gehen. So läßt sich die Funktionalität von FHEM und der MQTT_GENERIC_BRIDGE zunächst ohne weitere Störeinflüsse prüfen und andere User können leichter helfen, falls Probleme auftreten sollten.}}&lt;br /&gt;
Um gezielt einzelne Werte zu senden und auch nur gewünschte Anweisungen zu erhalten, ist stattdessen eine auf das jeweilige Gerät angepasste Konfiguration der Schnittstelle zu empfehlen. Um die hier dargestellten Schritte und deren Wirksamkeit zu prüfen, sollte der Verkehr von und zum MQTT-Server beobachtet werden. Im Folgenden werden hierfür die Programme &#039;&#039;mosquitto_sub&#039;&#039; und &#039;&#039;mosquitto_pub&#039;&#039; aus dem Paket &#039;&#039;mosquitto-clients&#039;&#039; verwendet. Auf einem &#039;&#039;Raspberry Pi OS&#039;&#039; können diese mit &amp;lt;code&amp;gt;sudo apt-get install mosquitto-clients&amp;lt;/code&amp;gt; installiert werden. Beide Programme funktionieren auch mit einem MQTT2_SERVER.&lt;br /&gt;
&lt;br /&gt;
Den Verkehr auf der Linux-Konsole kann man mit &lt;br /&gt;
 mosquitto_sub -h 127.0.0.1 -i fhem-test -v -t mqttGenericBridge/# -t system/# &lt;br /&gt;
verfolgen, gegebenenfalls sind Username und Passwort zu ergänzen, falls die Einstellungen am Server dies erfordern (siehe &#039;&#039;manpage&#039;&#039; zu &#039;&#039;mosquitto_sub&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Readingwerte publishen===&lt;br /&gt;
====mqttPublish====&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Der Name der Attribute kann abweichen, falls ein anderes &#039;&#039;MQTT-Präfix&#039;&#039; über das &#039;&#039;Define&#039;&#039; in der &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; gesetzt ist. Hier wird davon ausgegangen, dass dieses nicht geändert wurde.}}&lt;br /&gt;
&lt;br /&gt;
Um Reading-Werte von einem Gerät zu versenden, wird das Attribut &#039;&#039;mqttPublish&#039;&#039; verwendet. Im einfachsten Fall wird festgelegt, welche Readings versendet werden sollen, und unter welchem Topic. Für einen beliebigen Temperatursensor könnte dies z.B. so aussehen:&lt;br /&gt;
 attr mySensor mqttPublish temperature:topic={&amp;quot;$base/$device/$name&amp;quot;}&lt;br /&gt;
In der Linux.Konsole, in der &#039;&#039;mosquitto_sub&#039;&#039; läuft, sollte jetzt bei jeder Aktualisierung des Sensor-Werts anzeigen, dass eine entsprechende Message an den MQTT-Server gesendet wurde. Dies geschieht [[Event|Event-basiert]], so dass sich hier ggf. auch insbesondere Einstellungen im Attribut [[Event-on-change-reading|event-on-change-reading]] auf die Häufigkeit der Aktualisierung auswirken.&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Readings erfasst werden, für einen typischen kombinierten Temperatur- und Luftfeuchtigkeitssensor könnte dies z.B. so aussehen:&lt;br /&gt;
 attr mySensor mqttPublish temperature|humidity:topic={&amp;quot;$base/$device/$name&amp;quot;}&lt;br /&gt;
oder auch so:&lt;br /&gt;
 attr mySensor mqttPublish temperature|humidity|battery:topic={&amp;quot;$base/$device/$name&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Falls (!) erforderlich oder gewünscht, kann auch ein &#039;&#039;*&#039;&#039; als &#039;&#039;wildcard&#039;&#039; verwendet werden. Dann werden alle Readings gepublisht:&lt;br /&gt;
 attr mySensor mqttPublish *:topic={&amp;quot;$base/$device/$name&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
====mqttAlias====&lt;br /&gt;
Verfolgt man den Verkehr eine Zeitlang, wird die Bedeutung der Variablen klarer: &#039;&#039;$base&#039;&#039; entspricht der Angabe aus den &#039;&#039;globalDefaults&#039;&#039; an der &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039;, &#039;&#039;$device&#039;&#039; wird durch den Namen des Geräts in FHEM erstetzt, und &#039;&#039;$name&#039;&#039; entspricht (noch) dem Namen des Readings. &lt;br /&gt;
Bis hierhin könnte man also auch statt einer MQTTT_GENERIC_BRIDGE problemlos ein [[notify]] verwenden, um die Events für direkte publish-Anweisungen am jeweiligen Interface-Modul (z.B. MQTT2_CLIENT) auszuwerten.&lt;br /&gt;
&lt;br /&gt;
Eine &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; bietet jedoch auch für das Publishen erweiterte Funktionalitäten an. Die erste: Z.B. kann der Parameter &#039;&#039;$name&#039;&#039; - etwa zur [[DevelopmentGuidelinesReadings|Standardisierung der Namensstruktur der Readings]] - mit Hilfe des Attributs &#039;&#039;mqttAlias&#039;&#039; verändert werden. Durch die folgende Einstellung würde z.B. ein &#039;&#039;battery&#039;&#039;-Wert unter dem Topic-Teil &#039;&#039;batteryPercent&#039;&#039; versendet und das Reading &#039;&#039;measured-temp&#039;&#039; unter &#039;&#039;temperature&#039;&#039;:&lt;br /&gt;
 attr mySensor mqttAlias battery=batteryPercent measured-temp=temperature&lt;br /&gt;
&lt;br /&gt;
====state====&lt;br /&gt;
Da das Reading &#039;&#039;state&#039;&#039; in FHEM in der Regel eine Art Hauptzustand eines Geräts beschreibt, wird für die weiter unten dargestellten &#039;&#039;attrTemplate&#039;&#039; dieses Reading kein &#039;&#039;$name&#039;&#039;-Anteil im Topic versendet. Ein einfaches &amp;quot;ein-aus&amp;quot;-Gerät kann man dieser Vorgabe folgend daher so konfigurieren:&lt;br /&gt;
 attr myRelay mqttPublish state:topic={&amp;quot;$base/$device&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Für ein dimmbares Licht (das als Reading &#039;&#039;pct&#039;&#039; kennt) kombiniert man beides:&lt;br /&gt;
 attr myDimmer mqttPublish state:topic={&amp;quot;$base/$device&amp;quot;} pct:topic={&amp;quot;$base/$device/$name&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Und zu guter letzt noch als farbiges (mit Reading &#039;&#039;rgb&#039;&#039;) und dimmbares Licht:&lt;br /&gt;
 attr myRGBLight mqttPublish state:topic={&amp;quot;$base/$device&amp;quot;} pct|rgb:topic={&amp;quot;$base/$device/$name&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
===Geräte steuern===&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Kommt als MQTT-Server MQTT2_SERVER zum Einsatz, ist beim publishen via &#039;&#039;mosquitto_pub&#039;&#039; zwingend eine &#039;&#039;ClientID&#039;&#039; mit anzugeben, andernfalls werden die so generierten Messages eventuell nicht ausgewertet!}}Um Geräte über die MQTT-Schnittstelle bedienen zu können, wird zum einen eine Software benötigt, mit der man entsprechende publish-Anweisungen generieren kann. Dies kann z.B. das bereits genannte &#039;&#039;mosquitto_pub&#039;&#039; sein.&lt;br /&gt;
====mqttSubscribe====&lt;br /&gt;
Spiegelbildlich zum o.g. &#039;&#039;mqttPublish&#039;&#039;-Attribut wird über das jeweilige &#039;&#039;mqttSubscribe&#039;&#039;-Attribut festgelegt, welche Topics für das FHEM-Gerät ausgewertet werden sollen und welchen Readings diese zugeordnet sind. &lt;br /&gt;
Für ein einfaches &amp;quot;ein-aus&amp;quot;-Gerät verwendet man daher denselben Attributwert wie für das &#039;&#039;mqttPublish&#039;&#039;:&lt;br /&gt;
 attr myRelay mqttSubscribe state:stopic={&amp;quot;$base/$device&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Da wir oben in &#039;&#039;globalDefaults&#039;&#039; für &#039;&#039;sub:$base=mqttGenericBridge/set&#039;&#039; festgelegt haben, muss die Schaltanweisung allerdings an einen anderen Topic erfolgen als die Statusmeldung, die wir wegen des &#039;&#039;mqttPublish&#039;&#039;-Attributs erhalten - auf diese Weise können unbeabsichtigte Schleifen unterbunden werden.  &lt;br /&gt;
&lt;br /&gt;
Um jetzt mit &#039;&#039;mosquitto_pub&#039;&#039; eine passende Anweisung zu erzeugen, benötigen wir eine weitere (ssh-Linux-) Konsole, über die wir dann auf dem MQTT-Weg schalten können - vorausgesetzt, das Gerät &#039;&#039;myRelay&#039;&#039; kann den Befehl &amp;lt;code&amp;gt;set myRelay on&amp;lt;/code&amp;gt; (bzw. &#039;&#039;off&#039;&#039;) verarbeiten. Auch hier wären ggf. die Zugangsdaten entsprechend der &#039;&#039;manpage&#039;&#039; zu ergänzen:&lt;br /&gt;
 mosquitto_pub -h 127.0.0.1 -i fhem-test -t mqttGenericBridge/set/myRelay -m on&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;mosquitto_sub&#039;&#039; auf der Linux-Konsole sollte jetzt zunächst die Schaltanweisung (Topic mit &#039;&#039;set-Element&#039;&#039;) wie auch die Readingänderung am Device vermeldet werden.&lt;br /&gt;
&lt;br /&gt;
====Geräte mit mehreren Settern====&lt;br /&gt;
Das Prinzip dürfte jetzt klarer sein, also versuchen wir es direkt mit unserer farbigen Leuchte:&lt;br /&gt;
 attr myRGBLight mqttSubscribe state:stopic={&amp;quot;$base/$device&amp;quot;} pct|rgb:stopic={&amp;quot;$base/$device/$name&amp;quot;}&lt;br /&gt;
Und schon sollte diese über &#039;&#039;msoquitto_pub&#039;&#039; bzw. MQTT schalt- und dimmbar sein und Farbänderungen entgegennehmen - und natürlich den zugehörigen Status zurückmelden.&lt;br /&gt;
&lt;br /&gt;
====mqttAlias====&lt;br /&gt;
Auch bei den Supscriptions besteht die Möglichkeit, &#039;&#039;mqttAlias&#039;&#039; zu verwenden und die Namen über diesen Weg zu verändern. Dies kann insbesondere sinnvoll sein, um in externen Anwendungen dann (dort) dieselben Vorlagen nutzen zu können.&lt;br /&gt;
&lt;br /&gt;
====topic, stopic und atopic====&lt;br /&gt;
In obigem Beispiel haben wir in &#039;&#039;mqttSubscribe&#039;&#039; das Schlüsselwort &#039;&#039;stopic&#039;&#039; (die Kurzform von &#039;&#039;set-topic&#039;&#039;) verwendet. Dieses bewirkt bei einer entsprechenden MQTT-Nachricht dasselbe wie der FHEM-Befehl &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; &amp;lt;reading&amp;gt; &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;, also &amp;lt;code&amp;gt;set myRGBLight pct 70&amp;lt;/code&amp;gt;. Daneben gibt es die weiteren Schlüsselwörter &#039;&#039;topic&#039;&#039; und &#039;&#039;atopic&#039;&#039;. &lt;br /&gt;
* &#039;&#039;topic&#039;&#039; (Langform: readings-topic) entspicht einer &#039;&#039;setreading&#039;&#039;-Anweisung. Dabei wird dann lediglich der Readingwert aktualisiert, allerdings (falls Hardware gesteuert werden könnte) aber kein Schaltbefehl an die Hardware gesendet. In Installationen ohne MQTT2-Interface kann dies dazu genutzt werden, [[Dummy|dummy]]-Geräte ähnlich flexibel zu verwenden wie [[MQTT2_DEVICE]].&lt;br /&gt;
* &#039;&#039;atopic&#039;&#039; (Langform: attr-topic) schließlich dient dazu, Attributwerte zu ändern. &#039;&#039;atopic&#039;&#039; kann auch in &#039;&#039;mqttPublish&#039;&#039; eingesetzt werden, um Änderungen der Attribut-Werte an den MQTT-Server zu übermitteln.&lt;br /&gt;
&lt;br /&gt;
===Weitere Optionen===&lt;br /&gt;
&#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; bietet weitere Attribute, die im Zusammenspiel teils sehr umfassende weitere Möglichkeiten ergeben, Geräte an MQTT anzubinden. Einige der Möglichkeiten, insbesondere, über &#039;&#039;expression&#039;&#039; beliebigen Perl-Code zur Auswertung bzw. Strukturierung der Daten zu verwenden, sind in den Grundzügen weiter unten dargestellt. &lt;br /&gt;
&lt;br /&gt;
==Standardisierung via attrTemplate==&lt;br /&gt;
Insbesondere zur Anbindung externer Lösungen ist es jedoch häufig ausreichend, die Geräte-Daten in einer etwas strukturierten Weise aufzubereiten. Dies ist das Ziel der für &#039;&#039;MQTT_GENERIC_BRIDGE&#039;&#039; entwickelten &#039;&#039;attrTemplate&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
(tbc)&lt;br /&gt;
&lt;br /&gt;
==Konfigurationsmöglichkeiten für Fortgeschrittene==&lt;br /&gt;
&lt;br /&gt;
===expression===&lt;br /&gt;
&lt;br /&gt;
 attr ZWave_THERMOSTAT_20 mqttGB1Alias reportedState=actuator&lt;br /&gt;
 attr ZWave_THERMOSTAT_20 mqttGB1Publish desired-temp|temperature|reportedState:topic={&amp;quot;$base/$device/$name&amp;quot;} temperature:expression={$value=~m,(-?\d+(\.\d+)?),?::round($1,1):undef} reportedState:expression={$value=~m,dim.(\d+),?$1:undef}&lt;br /&gt;
 attr ZWave_THERMOSTAT_20 mqttGB1Subscribe desired-temp:stopic={&amp;quot;$base/$device/$name&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
===JSON===&lt;br /&gt;
json2nameValue() und toJSON() via expression &lt;br /&gt;
&lt;br /&gt;
===publishes an mehrere Topics===&lt;br /&gt;
&amp;quot;das Ausrufezeichen&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(Noch nachzubearbeiten, aus dem Thread Anwendungsfälle und Beispiele für MQTT_GENERIC_BRIDGE - https://forum.fhem.de/index.php/topic,91642.msg841367.html#msg841367)&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
eine Reading an einem beliebigen Device per MQTT setzen (für State-Reading soll state verwendet werden)&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;device-name&amp;gt; mqttSubscribe &amp;lt;reading-name&amp;gt;:topic=&amp;lt;topic&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(anstatt &#039;topic&#039; kann für eine bessere Lesbarkeit &#039;readings-topic&#039; verwendet werden)&lt;br /&gt;
&lt;br /&gt;
ein Set-Befehl an einem beliebigen Device mit dem per MQTT gesendeten Wert ausführen&lt;br /&gt;
(für set ohne namen (set on, set off) soll state verwendet werden)&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;device-name&amp;gt; mqttSubscribe &amp;lt;set-befehl&amp;gt;:stopic=&amp;lt;topic&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(anstatt &#039;stopic&#039; kann für eine bessere Lesbarkeit &#039;set-topic&#039; verwendet werden)&lt;br /&gt;
&lt;br /&gt;
ein Attribut an einem beliebigen Device per MQTT setzen&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;device-name&amp;gt; mqttSubscribe &amp;lt;attribut-name&amp;gt;:atopic=&amp;lt;topic&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(anstatt &#039;atopic&#039; kann für eine bessere Lesbarkeit &#039;attr-topic&#039; verwendet werden)&lt;br /&gt;
&lt;br /&gt;
eine Änderung eines Readings per MQTT senen&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;device-name&amp;gt; mqttPublish &amp;lt;readings-name&amp;gt;:topic=&amp;lt;topic&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
eine Änderung eines Attributes per MQTT senen&lt;br /&gt;
 attr &amp;lt;device-name&amp;gt; mqttPublish &amp;lt;attribut-name&amp;gt;:atopic=&amp;lt;topic&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Verwendung von Variablen&lt;br /&gt;
Es können mit dem Attribute mqttDefaults Variablen definiert werden, die in mqttPublish und mqttSubscribe verwendet werden können:&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;device-name&amp;gt; mqttDefaults base={&amp;quot;allgemeinerPfad/&amp;quot;}&lt;br /&gt;
...&lt;br /&gt;
attr &amp;lt;device-name&amp;gt; mqttPublish &amp;lt;reading-name&amp;gt;:topic={&amp;quot;$base/irgendEinName&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Weiterhin können in Topics folgende vordefinierte Variablen verwendet werden:&lt;br /&gt;
$reading - aktuell zu verarbeitende Reading&lt;br /&gt;
$device - aktulles Gerät&lt;br /&gt;
$name - Die Variable $name wird im Unterschied zu $reading ggf. ueber die in &#039;mqttAlias&#039; definierten Aliases beeinflusst. (s. Commandref für mqttAlias)&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;device-name&amp;gt; mqttPublish &amp;lt;reading-name&amp;gt;:topic={&amp;quot;$base/$device/$name&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mehrere Readings auf einmal&lt;br /&gt;
Es können für einen Topic (sinnigerweise mit Variablen) auch mehrere Readings gleichzeitig angegeben werden. Diese müssen in diesem Fall durch ein | getrennt werden:&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;device-name&amp;gt; mqttPublish &amp;lt;reading-name1&amp;gt;|&amp;lt;reading-name2&amp;gt;:topic={&amp;quot;$base/$device/$name&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wildcards&lt;br /&gt;
mit einem * kann ein Topic für alle Readings zusammen definiert werden:&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
attr &amp;lt;device-name&amp;gt; mqttPublish *:topic={&amp;quot;$base/$device/$name&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Subscribe können in der Topic-Definition auch MQTT-Wildcards (+ und #) verwendet werden.&lt;br /&gt;
Falls der Reading-Name mit einem &#039;*&#039;-Zeichen am Anfang definiert wird, gilt dieser als &#039;Platzhalter&#039;. Der tatsaechliche Name der Reading (und ggf. des Geraetes) wird dabei durch Variablen aus dem Topic definiert ($reading, $name). Im Topic wirken diese Variablen als Wildcards, macht natuerlich nur Sinn, wenn Reading-Name auch nicht fest definiert ist (also faengt mit &#039;*&#039; an). &lt;br /&gt;
&lt;br /&gt;
-----------------&lt;br /&gt;
&lt;br /&gt;
Sensoren-Werte von einer FHEM-Instanz in eine andere übertragen&lt;br /&gt;
&lt;br /&gt;
Definition für ein HomeMatic-Device (Dirk&#039;s-Sensor + Verwendung von DevPoint-Modul):&lt;br /&gt;
(es werden gezielt bestimmte Werte übertragen)&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
defmod &amp;lt;sensor-device-name&amp;gt; CUL_HM xxxxxx&lt;br /&gt;
attr &amp;lt;sensor-device-name&amp;gt; model HB-UW-Sen-THPL-I&lt;br /&gt;
...&lt;br /&gt;
attr &amp;lt;sensor-device-name&amp;gt; mqttDefaults base=haus/wohnzimmer&lt;br /&gt;
attr &amp;lt;sensor-device-name&amp;gt; mqttPublish humidity|luminosity|dewpoint|absoluteHumidity:topic={&amp;quot;$base/klima/$name&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition eines Empfänger-Dummy:&lt;br /&gt;
(es werden alle Werte bei passenden Topics empfangen)&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
defmod &amp;lt;dummy-device-name&amp;gt; dummy&lt;br /&gt;
attr &amp;lt;dummy-device-name&amp;gt; readingList absoluteHumidity dewpoint humidity luminosity temperature vapourPressure&lt;br /&gt;
attr &amp;lt;dummy-device-name&amp;gt; mqttDefaults base=haus/wohnzimmer&lt;br /&gt;
attr &amp;lt;dummy-device-name&amp;gt; mqttSubscribe *:topic={&amp;quot;$base/klima/$reading&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
« Letzte Änderung: 11 Januar 2019, 21:31:38 von hexenmeister »&lt;br /&gt;
&lt;br /&gt;
-------------------------&lt;br /&gt;
&lt;br /&gt;
Aktoren, die in einer FHEM-Instanz definiert sind, aus einer anderen schalten&lt;br /&gt;
Switch&lt;br /&gt;
&lt;br /&gt;
Definition eines Schalters (EnOcean FSR14)&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
defmod &amp;lt;actor-device-name&amp;gt; EnOcean 0000000B&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; IODev FGW14&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; alias Licht&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; devStateIcon off:light_light_dim_00@gray on:light_light_dim_100@yellow .*:hourglass&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; eep A5-38-08&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; group Beleuchtung&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; gwCmd switching&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; icon light_downlight&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; manufID 00D&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; mqttPublish state:topic=haus/wohnzimmer/licht/top/state&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; mqttSubscribe state:stopic=haus/wohnzimmer/licht/top/set&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; room Wohnzimmer&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; subDef 0010000B&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; subType gateway&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; webCmd on:off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
Aktoren, die in einer FHEM-Instanz definiert sind, aus einer anderen schalten&lt;br /&gt;
Dimmer&lt;br /&gt;
&lt;br /&gt;
Aktor-Definition:&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
defmod &amp;lt;actor-device-name&amp;gt; CUL_HM xxxxxx&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; model HM-LC-Dim1TPBU-FM&lt;br /&gt;
...&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; mqttPublish pct:topic=haus/wohnzimmer/licht/level state:topic=haus/wohnzimmer/licht/state&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; mqttSubscribe pct:stopic=haus/wohnzimmer/licht/set&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
Aktoren, die in einer FHEM-Instanz definiert sind, aus einer anderen schalten&lt;br /&gt;
Shutters / Blinds&lt;br /&gt;
&lt;br /&gt;
Aktor-Definition:&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
defmod &amp;lt;actor-device-name&amp;gt; CUL_HM xxxxxx&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; model HM-LC-Bl1PBU-FM&lt;br /&gt;
...&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; mqttPublish pct:topic=haus/wohnzimmer/rollo/all/position state:topic=haus/wohnzimmer/rollo/all/state&lt;br /&gt;
attr &amp;lt;actor-device-name&amp;gt; mqttSubscribe pct:stopic=haus/wohnzimmer/rollo/all/set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ist so nicht vorgesehen, ein reading = ein Topic.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a) beim device-count werden nur Geräte gezählt, die mit eigenen mqtt*-Attributen versehen sind. Bei einer globalen Definition &#039;globalPublish&#039; kann die Bridge nicht (ohne weiteres) wissen, welche Geräte angesprochen werden sollen. Daher wird auch nichts gezählt.&lt;br /&gt;
&lt;br /&gt;
b) mqttSubscribe ist gedacht für diejenigen Geräte, die per MQTT &#039;versorgt&#039; werden sollen. Die Bridge selbst gehört nicht dazu. Aus technischen Gründen kann es sein, dass diese Attribute trotzdem vom FHEM angeboten werden, gesetzt werden können sie jedoch nicht, die Bridge  &#039;währt&#039; sich dagegen.&lt;br /&gt;
Ein &#039;globalSubscribe&#039; gibt es nicht. Ich habe mich entschieden, diese Festure nicht anzubieten. Bei unbedachten Verwendung könnte ein großes Sicherheitsrisiko entstehen. Einfach diese Attribute an den gewünschgten Devices erstellen.&lt;br /&gt;
&lt;br /&gt;
Die Definition lautet &#039;fhem room=MQTT_BRIDGE_DEVICES&#039;. Der erste Parameter (wie im Commandref steht) ist der Prefix für die Optionsattribute. Ist für Sonderfälle gedacht, wenn mehr als eine Bridge im System vorhanen ist. Deine Parameter heißen also &#039;fhemSubscribe&#039; etc.&lt;br /&gt;
&lt;br /&gt;
Bin nun draufgekommen das dieses fehlerhafte Verhalten (Bridge geht nicht nach restart so lange bis man im User Interface DEF und &amp;quot;modify&amp;quot; geklickt hat)  nur dann auftritt wenn device-count = 0 ist.  Nun hab ich ein Device mit einem &amp;quot;fhemSubscribe&amp;quot; Attribut ausgestattet ... und nun lebt die Bridge auch nach einem Restart. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Du kannst aber mit * alle Readings greifen und dann mit Perlmitteln in der expression filtern.&lt;br /&gt;
&lt;br /&gt;
irgendwie so (ungetestet):&lt;br /&gt;
Code: [Auswählen]&lt;br /&gt;
&lt;br /&gt;
desired-temp!info:expression={if($reading=~/SMAEM12345678.*/){$value}else{undef})}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY/Schnellstart&amp;diff=37553</id>
		<title>RHASSPY/Schnellstart</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY/Schnellstart&amp;diff=37553"/>
		<updated>2022-09-18T09:03:10Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: obsoletes Bild entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Rhasspy Webinterface.png|thumb|right|Das Rhasspy-Webinterface nach erfolgreicher Installation und Aufruf des ersten Intents (GetTime)]]&lt;br /&gt;
&lt;br /&gt;
==Installation von Rhasspy==&lt;br /&gt;
Empfohlen wird, Rhasspy als [https://www.docker.com/ Docker Container] zu installieren. Und zwar aus folgenden Gründen:&lt;br /&gt;
* Alle Software-Abhängigkeiten sind aufgelöst&lt;br /&gt;
* Es kommt zu keinen Konflikten mit Abhängigkeiten anderer Anwendungen (Python-Version, Paket-Versionen, ...)&lt;br /&gt;
* Wird der Container wieder gelöscht, ist Rhasspy vollständig vom System entfernt&lt;br /&gt;
Soll Docker verwendet werden, finden sich am [[#Anhang|Ende dieser Anleitung]] zwei Docker-Compose Dateien für den schnellen Einstieg. &lt;br /&gt;
Dazu bitte &#039;&#039;&#039;mit einer Ausnahme&#039;&#039;&#039; der Anleitung in der [https://rhasspy.readthedocs.io/en/latest/#getting-started offiziellen Dokumentation] folgen.&lt;br /&gt;
Die Ausnahme ergibt sich daraus, dass für den schnellen Einstieg der &#039;&#039;interne&#039;&#039; MQTT-Server von Rhasspy genutzt werden soll. Dieser ist auf dem Port 12183 erreichbar, der beim Start des Docker Containers auch mit &#039;&#039;exposed&#039;&#039; werden muss. &lt;br /&gt;
&lt;br /&gt;
Das Kommando zum Starten des Docker-Images lautet deshalb korrekterweise&lt;br /&gt;
&lt;br /&gt;
 docker run -d -p 12101:12101 -p 12183:12183\&lt;br /&gt;
      --name rhasspy \&lt;br /&gt;
      --restart unless-stopped \&lt;br /&gt;
      -v &amp;quot;$HOME/.config/rhasspy/profiles:/profiles&amp;quot; \&lt;br /&gt;
      -v &amp;quot;/etc/localtime:/etc/localtime:ro&amp;quot; \&lt;br /&gt;
      --device /dev/snd:/dev/snd \&lt;br /&gt;
      rhasspy/rhasspy \&lt;br /&gt;
      --user-profiles /profiles \&lt;br /&gt;
      --profile en&lt;br /&gt;
&lt;br /&gt;
Danach bitte alle weiteren in der nachfolgenden Anleitung beschriebenen Schritte ausführen. Der &amp;quot;Schnellstart&amp;quot; ist erst abgeschlossen, wenn im [https://rhasspy.readthedocs.io/en/latest/#web-interface Web-Interface von Rhasspy] der gesprochene Testsatz &#039;&#039;&#039;&#039;&#039;wie spät ist es&#039;&#039;&#039;&#039;&#039; erkannt wird und links als erkannter Intent &#039;&#039;&#039;&#039;&#039;GetTime&#039;&#039;&#039;&#039;&#039; angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
==Installation des FHEM Moduls==&lt;br /&gt;
Das RHASSPY-Modul ist seit Sept. 2022 über das reguläre FHEM-update verfügbar und muss nicht mehr gesondert in das Modulverzeichnis kopiert werden.&lt;br /&gt;
&lt;br /&gt;
==Einrichtung des MQTT2_CLIENT==&lt;br /&gt;
[[File:Rhasspy02.png|right|thumb|Ein erfolgreich mit Rhasspy verbundenes MQTT2_CLIENT Device]]&lt;br /&gt;
Rhasspy kommuniziert hauptsächlich über das [[MQTT]]-Protokoll, und zwar sowohl Rhasspy-intern, als 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 und die für FHEM relevanten Daten über einen [[MQTT2_CLIENT]] bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel geht davon aus, dass Rhasspy auf dem selben Gerät installiert ist, auf dem auch FHEM läuft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Läuft Rhasspy auf einem anderen Server und/oder wird ein anderer Port verwendet, sind die passenden Daten im obigen &#039;&#039;defmod&#039;&#039; entsprechend anzupassen. Typischerweise ist der Rhasspy-interne MQTT-Server eines extern laufenden Rhasspy unter der Portnummer 12183 zu erreichen, die Definition wäre dann also&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT &amp;lt;IP-Adresse&amp;gt;:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hat alles funktioniert, steht &#039;&#039;&#039;opened&#039;&#039;&#039; im &#039;&#039;STATE&#039;&#039; dieses Devices.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Define eines RHASSPY Devices ==&lt;br /&gt;
Läuft der Rhasspy-Dienst auf derselben Maschine mit den Standardeinstellungen, genügt für ein erstes Kennenlernen:&lt;br /&gt;
 define rhasspy RHASSPY&lt;br /&gt;
Für einen entfernten Rhasspy-Dienst muss angeben werden, wo dessen &#039;&#039;&#039;Web-Interface&#039;&#039;&#039; zu erreichen ist:&lt;br /&gt;
 defmod rhasspy RHASSPY baseUrl=http://192.168.1.210:12101&lt;br /&gt;
&lt;br /&gt;
Dieser Schritt war erfolgreich, wenn &lt;br /&gt;
* im Device rhasspy ein Reading &#039;&#039;&#039;intents&#039;&#039;&#039; vorhanden ist, das z.B. den Wert &#039;&#039;GetTime&#039;&#039; enthält, und &lt;br /&gt;
* &#039;&#039;&#039;STATE&#039;&#039;&#039; dieses Devices auf &#039;&#039;online&#039;&#039; gegangen ist.&lt;br /&gt;
&lt;br /&gt;
==Spracheinstellungen==&lt;br /&gt;
===Basissprache===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Wird die Sprache im Device global nach Definition des RHASSPY-Devices geändert, kann es notwendig sein, die DEF des RHASSPY-Devices einmal ohne Änderungen zu bearbeiten (z.B. ein Leerzeichen anfügen).}}&lt;br /&gt;
[[File:Rhasspy05.png|thumb|rhasspy mit deutscher Spracheinstellung]]&lt;br /&gt;
In diesem Beispiel soll deutsch mit dem Sprachassistenten gesprochen werden. Das bedeutet&lt;br /&gt;
# Rhasspy - also die Anwendung im Docker-Container - muss ein deutsches Profil verwenden&lt;br /&gt;
# rhasspy - also das FHEM-Device - muss auf die deutsche Sprache eingestellt sein&lt;br /&gt;
# Eine deutsche [[#Sprachdatei|Sprachdatei]] muss installiert sein&lt;br /&gt;
&lt;br /&gt;
Welche Sprache das Device rhasspy verwendet, ist am &#039;&#039;&#039;Internal&#039;&#039;&#039; &#039;&#039;LANGUAGE&#039;&#039; zu erkennen.&lt;br /&gt;
&lt;br /&gt;
Sollte dieses Internal nicht &#039;&#039;&#039;de&#039;&#039;&#039; anzeigen, gibt es zwei Möglichkeiten, dies zu ändern:&lt;br /&gt;
# im FHEM-Device &#039;&#039;&#039;global&#039;&#039;&#039; wird das  Attribut &#039;&#039;language&#039;&#039; auf &#039;&#039;DE&#039;&#039; eingestellt oder&lt;br /&gt;
# die Definition des rhasspy-Devices um &#039;&#039;language=de&#039;&#039; ergänzt.&lt;br /&gt;
&lt;br /&gt;
  defmod rhasspy RHASSPY language=de&lt;br /&gt;
&lt;br /&gt;
===Sprachdatei===&lt;br /&gt;
Das Modul RHASSPY enthält einige vorgefertigte Antwortsätze für diverse Situationen. Um diese von Englisch auf Deutsch umzustellen, wird eine zusätzliche (Muster-) Sprachdatei benötigt, die man mit folgendem Befehl erhält:&lt;br /&gt;
 { Svn_GetFile(&#039;contrib/RHASSPY/rhasspy-de.cfg&#039;, &#039;./rhasspy-de.cfg&#039;) }&lt;br /&gt;
&lt;br /&gt;
Ergänzend muss dem Device rhasspy mitgeteilt werden, wo diese zu finden ist: &lt;br /&gt;
 attr rhasspy languageFile ./rhasspy-de.cfg&lt;br /&gt;
&lt;br /&gt;
Dieser Schritt war erfolgreich, wenn der Befehl &amp;lt;code&amp;gt;list rhasspy&amp;lt;/code&amp;gt; einen Abschnitt &#039;&#039;lng&#039;&#039; enthält, der deutsche Antworten auflistet.&lt;br /&gt;
&lt;br /&gt;
== Erste Interaktion ==&lt;br /&gt;
[[File:Rhasspy06.png|thumb|Anpassung eines erstens Intents nach der Schnellstart-Anleitung]]&lt;br /&gt;
Um dem Sprachassistenten jetzt eine Antwort auf eine Frage zu entlocken, muss zuerst im Webinterface von Rhasspy - also in der Anwendung im Docker-Container - im Menüpunkt [https://rhasspy.readthedocs.io/en/latest/tutorials/#training Sentences] ein Intent erstellt werden. Für diese Schnellstart-Anleitung wird aber einfach der standardmäßig in Rhasspy vorhandene Intent &#039;&#039;[GetTime]&#039;&#039; verwendet. Um diesen aber benutzen zu können, muss er vorher umbenannt werden. Jede Instanz des RHASSPY-Moduls reagiert nur auf Intents, die &amp;quot;für sie&amp;quot; bestimmt und daher entsprechend gekennzeichnet sind. Diese Kennungzeichnung besteht aus:&lt;br /&gt;
# dem &#039;&#039;&#039;&#039;&#039;language&#039;&#039;-Kürzel&#039;&#039;&#039; (z.B. &amp;lt;code&amp;gt;de&amp;lt;/code&amp;gt;),&lt;br /&gt;
# der &#039;&#039;&#039;&#039;&#039;fhemId&#039;&#039;&#039;&#039;&#039; (z.B. &amp;lt;code&amp;gt;fhem&amp;lt;/code&amp;gt;) und&lt;br /&gt;
# dem &#039;&#039;&#039;Intent-Namen&#039;&#039;&#039; (z.B. &amp;lt;code&amp;gt;GetTime&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Der Name des Intents ist daher in der &#039;&#039;sentences.ini&#039;&#039; wie folgt zu ändern:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät ist es&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt kann der Sprachassistent nach der aktuellen Uhrzeit gefragt werden. Ist alles richtig konfiguriert, wird er diese Frage auf deutsch beantworten und die Readings des Moduls werden mit entsprechenden Werten befüllt.&lt;br /&gt;
&lt;br /&gt;
==Ein Gerät mit Rhasspy verbinden==&lt;br /&gt;
[[File:Rhasspy08.png|thumb|Erfolgreich befüllter Slot mit dem Alias der Lampe]]&lt;br /&gt;
[[File:Rhasspy07.png|thumb|Erfolgreich erstellte Helper für eine Lampe im RHASSPY Modul]]&lt;br /&gt;
Wenn nach dieser Anleitung vorgegangen wurde, ist das Modul so konfiguriert, dass es Rhasspy alle FHEM-Devices bekannt macht, bei denen das Attribut &#039;&#039;&#039;genericDeviceType&#039;&#039;&#039; definiert ist.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung eines FHEM-Devices mit Rhasspy sind also folgende Schritte auszuführen:&lt;br /&gt;
# &#039;&#039;&#039;genericDeviceType&#039;&#039;&#039; Attribut bei einem Device setzen (z.B. &#039;&#039;switch&#039;&#039;)&lt;br /&gt;
# einen &amp;quot;sprechbaren&amp;quot; Namen im Attribut &#039;&#039;&#039;alias&#039;&#039;&#039; vergeben&lt;br /&gt;
# &amp;lt;code&amp;gt;set rhasspy update devicemap&amp;lt;/code&amp;gt; ausführen, um das Device Rhasspy bekannt zu machen&lt;br /&gt;
&lt;br /&gt;
Anhand einer Lampe &amp;quot;Office&amp;quot;, die sich nur ein- und ausschalten lässt, könnte das z.B. so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Office genericDeviceType switch&lt;br /&gt;
attr Office alias Licht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;genericDeviceType&#039;&#039; &#039;&#039;&#039;switch&#039;&#039;&#039; gibt für ein Gerät vor, dass es sich nur ein- und ausschalten lässt. Beim Typ &#039;&#039;&#039;light&#039;&#039;&#039; z.B. könnte man auch noch die Helligkeit und die Farbe regulieren.&lt;br /&gt;
Der &#039;&#039;alias&#039;&#039; &#039;&#039;&#039;Licht&#039;&#039;&#039; bewirkt, dass in Zukunft einfach &amp;quot;Licht aus&amp;quot; oder &amp;quot;Licht an&amp;quot; gesagt werden kann. Dazu aber später mehr.&lt;br /&gt;
&lt;br /&gt;
Die Lampe ist somit fertig vorbereitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit Rhasspy auch von diesem Gerät erfährt, muss FHEM ihm davon erzählen. Das passiert, in dem folgender Befehl ausgeführt wird:&lt;br /&gt;
 set rhasspy update devicemap&lt;br /&gt;
Darauf hin werden mehrere Aktionen durchgeführt:&lt;br /&gt;
* Es werden in Rhasspy Slots erstellt, die später in Intents verwenden werden können&lt;br /&gt;
* Diese Slots werden mit den Daten befüllt, die in FHEM für die Verwendung in Rhasspy konfiguriert wurden. In diesem Fall nur der Alias dieser Lampe&lt;br /&gt;
* Ein Training von Rhasspy wird angestoßen, damit Rhasspy das Gerät in gesprochenen Sätzen erkennt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob alles funktioniert hat, lässt sich an drei Dingen erkennen:&lt;br /&gt;
# Es gibt neue Slots in Rhasspy bzw. bereits vorhandene wurden mit neuen Werten ergänzt&lt;br /&gt;
# Ein &amp;lt;code&amp;gt;list rhasspy&amp;lt;/code&amp;gt; enthält den Helper &#039;&#039;&#039;devicemap&#039;&#039;&#039; mit den konfigurierten Geräten und dessen Steuermöglichkeiten (&#039;&#039;intents&#039;&#039;)&lt;br /&gt;
# In den Readings &#039;&#039;udpateSlots&#039;&#039; und &#039;&#039;training&#039;&#039; des Moduls ist kein Fehler zu erkennen (unter Umständen die Seite im Browser aktualisieren, wenn die Readings noch nicht vorhanden sind)&lt;br /&gt;
&lt;br /&gt;
==Einen ersten Intent erstellen==&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Dieses Beispiel enthält bereits einige Sprech-Alternativen und optionale Elemente. Die vorhandenen Möglichkeiten sind zum Einen der offiziellen Dokumentation zu entnehmen, zur Vertiefung gibt es in den Links unten ein sehr informatives Video.}}&lt;br /&gt;
[[File:Rhasspy09.png|thumb|Ein erfolgreich von RHASSPY empfangener und umgesetzter Sprachbefehl]]&lt;br /&gt;
Um die konfigurierte Lampe schlussendlich auch steuern zu können, muss Rhasspy noch wissen, was nach einem erkannten Sprachbefehl anfangen soll. Dazu werden in Rhasspy Sentences/Intents erstellt. Im Falle dieser Lampe, reicht ein einfacher SetOnOff-Intent. Sie kann ja nicht mehr.&lt;br /&gt;
&lt;br /&gt;
Da der Intent aber potentiell für mehrere Geräte dienen können soll, wird es etwas komplizierter, als beim &#039;&#039;GetTime&#039;&#039; Intent. Allerdings hat dsa Modul schon passende Slots erstellt, die in eigenen Intents verwendet werden können. Zusätzlich müssen aber &#039;&#039;Tags&#039;&#039; verwendet, damit das Modul dann unterscheiden kann, ob ein von Rhasspy geliefertes Wort ein Gerät, ein Raum oder ein Nummernwert ist.&lt;br /&gt;
&lt;br /&gt;
Ein ganz einfacher Intent, um die Lampe ein- und ausschalten zu können, kann z.B. so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
schalte das $de.fhem.Device-SetOnOff{Device} ( an{Value:on} | aus{Value:off})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kurz umrissen bedeuten die Teile des Satzes:&lt;br /&gt;
* &#039;&#039;&#039;$de.fhem.Device-SetOnOff&#039;&#039;&#039; ist der Slot, der die Geräte enthält, die mit diesem Intent gesteuert werden sollen. Das Dollarzeichen am Anfang des Slots wird gerne vergessen, darauf also besonders gut aufpassen&lt;br /&gt;
* &#039;&#039;&#039;{Device}&#039;&#039;&#039; ist ein Tag, der dem FHEM-Modul und Rhasspy verrät, dass es sich bei diesem Wort um ein Device handelt. Wichtig bei Tags, die in Verbindung mit diesem Modul verwendet werden ist, dass sie &#039;&#039;&#039;immer&#039;&#039;&#039; mit einem Großbuchstaben beginnen!&lt;br /&gt;
* &#039;&#039;&#039;( ... | ... )&#039;&#039;&#039; ist eine Gruppe. Wobei die runden Klammern eine Gruppe beschreiben, die einzelnen Mitglieder dieser Gruppe werden durch die &amp;quot;Pipe&amp;quot; getrennt. In diesem konkreten Fall bedeutet es, der Wert kann &amp;quot;an&amp;quot; ODER &amp;quot;aus&amp;quot; sein&lt;br /&gt;
*&#039;&#039;&#039;{Value:on}&#039;&#039;&#039;/&#039;&#039;&#039;{Value:off}&#039;&#039;&#039; ist wieder ein Tag. Dieser gibt an, dass es sich beim übergebenen Wort um einen Wert handelt. Da das Modul aber die deutschen Wörter &amp;quot;an&amp;quot; und &amp;quot;aus&amp;quot; nicht versteht, müssen hier Synonyme verwendet werden. Das sind jeweils die Werte hinter dem Doppelpunkt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Da mit Erstellen des ersten Intents wieder Änderungen an der Konfiguration vorgenommen wurden, muss jetzt wieder ein &amp;lt;code&amp;gt;set rhasspy update all&amp;lt;/code&amp;gt; ausgeführt werden. In diesem Fall, damit das Modul vom neuen Intent erfährt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist man dieser Schnellstart-Anleitung gefolgt, können aus diesem Satz mit der vorhandenen Lampe jetzt zwei gesprochene Sätze gebildet werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht an&lt;br /&gt;
schalte das licht aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Infos, die daraus resultierend nach einem Sprachbefehl &amp;quot;schalte das licht an&amp;quot; im FHEM-Modul ankommen sind dann unter anderem:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;intent&amp;quot;:&amp;quot;SetOnOff&amp;quot;&lt;br /&gt;
&amp;quot;Device&amp;quot;:&amp;quot;licht&amp;quot;&lt;br /&gt;
&amp;quot;Value&amp;quot;:&amp;quot;on&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schlusswort==&lt;br /&gt;
Sind alle Punkte dieser Schnellstart-Anleitung erfolgreich abgeschlossen, kann damit begonnen werden, das Device rhasspy auf die eigenen Bedürfnisse anzupassen und weitere Geräte damit zu steuern. Alle Informationen dazu finden sich auf der Hauptseite von [[RHASSPY]] sowie in der [[RHASSPY/Vertiefung]].&lt;br /&gt;
&lt;br /&gt;
==Anhang==&lt;br /&gt;
===Docker-Compose File - Base===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
version: &#039;3&#039;&lt;br /&gt;
&lt;br /&gt;
services:&lt;br /&gt;
    rhasspy:&lt;br /&gt;
        image: &amp;quot;rhasspy/rhasspy&amp;quot;&lt;br /&gt;
        container_name: rhasspy&lt;br /&gt;
        restart: unless-stopped&lt;br /&gt;
        volumes:&lt;br /&gt;
            - &amp;quot;.config/rhasspy/profiles:/profiles&amp;quot;&lt;br /&gt;
            - /etc/timezone:/etc/timezone:ro&lt;br /&gt;
        ports:&lt;br /&gt;
            - &amp;quot;12101:12101&amp;quot;&lt;br /&gt;
            - &amp;quot;12183:12183&amp;quot;&lt;br /&gt;
        command: --user-profiles /profiles --profile de&lt;br /&gt;
        environment:&lt;br /&gt;
          - TZ=Europe/Berlin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Docker-Compose File - Satellite===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
version: &#039;3&#039;&lt;br /&gt;
&lt;br /&gt;
services:&lt;br /&gt;
    rhasspy:&lt;br /&gt;
        image: &amp;quot;rhasspy/rhasspy&amp;quot;&lt;br /&gt;
        container_name: rhasspy&lt;br /&gt;
        restart: unless-stopped&lt;br /&gt;
        volumes:&lt;br /&gt;
            - &amp;quot;.config/rhasspy/profiles:/profiles&amp;quot;&lt;br /&gt;
            - &amp;quot;/etc/localtime:/etc/localtime:ro&amp;quot;&lt;br /&gt;
            - &amp;quot;/etc/asound.conf:/etc/asound.conf&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
            - &amp;quot;12101:12101&amp;quot;&lt;br /&gt;
        command: --user-profiles /profiles --profile de&lt;br /&gt;
        devices:&lt;br /&gt;
          - &amp;quot;/dev/snd:/dev/snd&amp;quot;&lt;br /&gt;
        ipc: host&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Adroid-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY/Schnellstart&amp;diff=37552</id>
		<title>RHASSPY/Schnellstart</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY/Schnellstart&amp;diff=37552"/>
		<updated>2022-09-18T08:56:28Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: /* Installation des FHEM Moduls */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Rhasspy Webinterface.png|thumb|right|Das Rhasspy-Webinterface nach erfolgreicher Installation und Aufruf des ersten Intents (GetTime)]]&lt;br /&gt;
&lt;br /&gt;
==Installation von Rhasspy==&lt;br /&gt;
Empfohlen wird, Rhasspy als [https://www.docker.com/ Docker Container] zu installieren. Und zwar aus folgenden Gründen:&lt;br /&gt;
* Alle Software-Abhängigkeiten sind aufgelöst&lt;br /&gt;
* Es kommt zu keinen Konflikten mit Abhängigkeiten anderer Anwendungen (Python-Version, Paket-Versionen, ...)&lt;br /&gt;
* Wird der Container wieder gelöscht, ist Rhasspy vollständig vom System entfernt&lt;br /&gt;
Soll Docker verwendet werden, finden sich am [[#Anhang|Ende dieser Anleitung]] zwei Docker-Compose Dateien für den schnellen Einstieg. &lt;br /&gt;
Dazu bitte &#039;&#039;&#039;mit einer Ausnahme&#039;&#039;&#039; der Anleitung in der [https://rhasspy.readthedocs.io/en/latest/#getting-started offiziellen Dokumentation] folgen.&lt;br /&gt;
Die Ausnahme ergibt sich daraus, dass für den schnellen Einstieg der &#039;&#039;interne&#039;&#039; MQTT-Server von Rhasspy genutzt werden soll. Dieser ist auf dem Port 12183 erreichbar, der beim Start des Docker Containers auch mit &#039;&#039;exposed&#039;&#039; werden muss. &lt;br /&gt;
&lt;br /&gt;
Das Kommando zum Starten des Docker-Images lautet deshalb korrekterweise&lt;br /&gt;
&lt;br /&gt;
 docker run -d -p 12101:12101 -p 12183:12183\&lt;br /&gt;
      --name rhasspy \&lt;br /&gt;
      --restart unless-stopped \&lt;br /&gt;
      -v &amp;quot;$HOME/.config/rhasspy/profiles:/profiles&amp;quot; \&lt;br /&gt;
      -v &amp;quot;/etc/localtime:/etc/localtime:ro&amp;quot; \&lt;br /&gt;
      --device /dev/snd:/dev/snd \&lt;br /&gt;
      rhasspy/rhasspy \&lt;br /&gt;
      --user-profiles /profiles \&lt;br /&gt;
      --profile en&lt;br /&gt;
&lt;br /&gt;
Danach bitte alle weiteren in der nachfolgenden Anleitung beschriebenen Schritte ausführen. Der &amp;quot;Schnellstart&amp;quot; ist erst abgeschlossen, wenn im [https://rhasspy.readthedocs.io/en/latest/#web-interface Web-Interface von Rhasspy] der gesprochene Testsatz &#039;&#039;&#039;&#039;&#039;wie spät ist es&#039;&#039;&#039;&#039;&#039; erkannt wird und links als erkannter Intent &#039;&#039;&#039;&#039;&#039;GetTime&#039;&#039;&#039;&#039;&#039; angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
==Installation des FHEM Moduls==&lt;br /&gt;
[[File:Rhasspy03.png|thumb|right|Installation/Update des RHASSPY Moduls via Kommando-Feld]]&lt;br /&gt;
Das RHASSPY-Modul ist seit Sept. 2022 über das reguläre FHEM-update verfügbar und muss nicht mehr gesondert in das Modulverzeichnis kopiert werden.&lt;br /&gt;
&lt;br /&gt;
==Einrichtung des MQTT2_CLIENT==&lt;br /&gt;
[[File:Rhasspy02.png|right|thumb|Ein erfolgreich mit Rhasspy verbundenes MQTT2_CLIENT Device]]&lt;br /&gt;
Rhasspy kommuniziert hauptsächlich über das [[MQTT]]-Protokoll, und zwar sowohl Rhasspy-intern, als 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 und die für FHEM relevanten Daten über einen [[MQTT2_CLIENT]] bezogen werden.&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel geht davon aus, dass Rhasspy auf dem selben Gerät installiert ist, auf dem auch FHEM läuft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Läuft Rhasspy auf einem anderen Server und/oder wird ein anderer Port verwendet, sind die passenden Daten im obigen &#039;&#039;defmod&#039;&#039; entsprechend anzupassen. Typischerweise ist der Rhasspy-interne MQTT-Server eines extern laufenden Rhasspy unter der Portnummer 12183 zu erreichen, die Definition wäre dann also&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT &amp;lt;IP-Adresse&amp;gt;:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hat alles funktioniert, steht &#039;&#039;&#039;opened&#039;&#039;&#039; im &#039;&#039;STATE&#039;&#039; dieses Devices.&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Define eines RHASSPY Devices ==&lt;br /&gt;
Läuft der Rhasspy-Dienst auf derselben Maschine mit den Standardeinstellungen, genügt für ein erstes Kennenlernen:&lt;br /&gt;
 define rhasspy RHASSPY&lt;br /&gt;
Für einen entfernten Rhasspy-Dienst muss angeben werden, wo dessen &#039;&#039;&#039;Web-Interface&#039;&#039;&#039; zu erreichen ist:&lt;br /&gt;
 defmod rhasspy RHASSPY baseUrl=http://192.168.1.210:12101&lt;br /&gt;
&lt;br /&gt;
Dieser Schritt war erfolgreich, wenn &lt;br /&gt;
* im Device rhasspy ein Reading &#039;&#039;&#039;intents&#039;&#039;&#039; vorhanden ist, das z.B. den Wert &#039;&#039;GetTime&#039;&#039; enthält, und &lt;br /&gt;
* &#039;&#039;&#039;STATE&#039;&#039;&#039; dieses Devices auf &#039;&#039;online&#039;&#039; gegangen ist.&lt;br /&gt;
&lt;br /&gt;
==Spracheinstellungen==&lt;br /&gt;
===Basissprache===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Wird die Sprache im Device global nach Definition des RHASSPY-Devices geändert, kann es notwendig sein, die DEF des RHASSPY-Devices einmal ohne Änderungen zu bearbeiten (z.B. ein Leerzeichen anfügen).}}&lt;br /&gt;
[[File:Rhasspy05.png|thumb|rhasspy mit deutscher Spracheinstellung]]&lt;br /&gt;
In diesem Beispiel soll deutsch mit dem Sprachassistenten gesprochen werden. Das bedeutet&lt;br /&gt;
# Rhasspy - also die Anwendung im Docker-Container - muss ein deutsches Profil verwenden&lt;br /&gt;
# rhasspy - also das FHEM-Device - muss auf die deutsche Sprache eingestellt sein&lt;br /&gt;
# Eine deutsche [[#Sprachdatei|Sprachdatei]] muss installiert sein&lt;br /&gt;
&lt;br /&gt;
Welche Sprache das Device rhasspy verwendet, ist am &#039;&#039;&#039;Internal&#039;&#039;&#039; &#039;&#039;LANGUAGE&#039;&#039; zu erkennen.&lt;br /&gt;
&lt;br /&gt;
Sollte dieses Internal nicht &#039;&#039;&#039;de&#039;&#039;&#039; anzeigen, gibt es zwei Möglichkeiten, dies zu ändern:&lt;br /&gt;
# im FHEM-Device &#039;&#039;&#039;global&#039;&#039;&#039; wird das  Attribut &#039;&#039;language&#039;&#039; auf &#039;&#039;DE&#039;&#039; eingestellt oder&lt;br /&gt;
# die Definition des rhasspy-Devices um &#039;&#039;language=de&#039;&#039; ergänzt.&lt;br /&gt;
&lt;br /&gt;
  defmod rhasspy RHASSPY language=de&lt;br /&gt;
&lt;br /&gt;
===Sprachdatei===&lt;br /&gt;
Das Modul RHASSPY enthält einige vorgefertigte Antwortsätze für diverse Situationen. Um diese von Englisch auf Deutsch umzustellen, wird eine zusätzliche (Muster-) Sprachdatei benötigt, die man mit folgendem Befehl erhält:&lt;br /&gt;
 { Svn_GetFile(&#039;contrib/RHASSPY/rhasspy-de.cfg&#039;, &#039;./rhasspy-de.cfg&#039;) }&lt;br /&gt;
&lt;br /&gt;
Ergänzend muss dem Device rhasspy mitgeteilt werden, wo diese zu finden ist: &lt;br /&gt;
 attr rhasspy languageFile ./rhasspy-de.cfg&lt;br /&gt;
&lt;br /&gt;
Dieser Schritt war erfolgreich, wenn der Befehl &amp;lt;code&amp;gt;list rhasspy&amp;lt;/code&amp;gt; einen Abschnitt &#039;&#039;lng&#039;&#039; enthält, der deutsche Antworten auflistet.&lt;br /&gt;
&lt;br /&gt;
== Erste Interaktion ==&lt;br /&gt;
[[File:Rhasspy06.png|thumb|Anpassung eines erstens Intents nach der Schnellstart-Anleitung]]&lt;br /&gt;
Um dem Sprachassistenten jetzt eine Antwort auf eine Frage zu entlocken, muss zuerst im Webinterface von Rhasspy - also in der Anwendung im Docker-Container - im Menüpunkt [https://rhasspy.readthedocs.io/en/latest/tutorials/#training Sentences] ein Intent erstellt werden. Für diese Schnellstart-Anleitung wird aber einfach der standardmäßig in Rhasspy vorhandene Intent &#039;&#039;[GetTime]&#039;&#039; verwendet. Um diesen aber benutzen zu können, muss er vorher umbenannt werden. Jede Instanz des RHASSPY-Moduls reagiert nur auf Intents, die &amp;quot;für sie&amp;quot; bestimmt und daher entsprechend gekennzeichnet sind. Diese Kennungzeichnung besteht aus:&lt;br /&gt;
# dem &#039;&#039;&#039;&#039;&#039;language&#039;&#039;-Kürzel&#039;&#039;&#039; (z.B. &amp;lt;code&amp;gt;de&amp;lt;/code&amp;gt;),&lt;br /&gt;
# der &#039;&#039;&#039;&#039;&#039;fhemId&#039;&#039;&#039;&#039;&#039; (z.B. &amp;lt;code&amp;gt;fhem&amp;lt;/code&amp;gt;) und&lt;br /&gt;
# dem &#039;&#039;&#039;Intent-Namen&#039;&#039;&#039; (z.B. &amp;lt;code&amp;gt;GetTime&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Der Name des Intents ist daher in der &#039;&#039;sentences.ini&#039;&#039; wie folgt zu ändern:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät ist es&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt kann der Sprachassistent nach der aktuellen Uhrzeit gefragt werden. Ist alles richtig konfiguriert, wird er diese Frage auf deutsch beantworten und die Readings des Moduls werden mit entsprechenden Werten befüllt.&lt;br /&gt;
&lt;br /&gt;
==Ein Gerät mit Rhasspy verbinden==&lt;br /&gt;
[[File:Rhasspy08.png|thumb|Erfolgreich befüllter Slot mit dem Alias der Lampe]]&lt;br /&gt;
[[File:Rhasspy07.png|thumb|Erfolgreich erstellte Helper für eine Lampe im RHASSPY Modul]]&lt;br /&gt;
Wenn nach dieser Anleitung vorgegangen wurde, ist das Modul so konfiguriert, dass es Rhasspy alle FHEM-Devices bekannt macht, bei denen das Attribut &#039;&#039;&#039;genericDeviceType&#039;&#039;&#039; definiert ist.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung eines FHEM-Devices mit Rhasspy sind also folgende Schritte auszuführen:&lt;br /&gt;
# &#039;&#039;&#039;genericDeviceType&#039;&#039;&#039; Attribut bei einem Device setzen (z.B. &#039;&#039;switch&#039;&#039;)&lt;br /&gt;
# einen &amp;quot;sprechbaren&amp;quot; Namen im Attribut &#039;&#039;&#039;alias&#039;&#039;&#039; vergeben&lt;br /&gt;
# &amp;lt;code&amp;gt;set rhasspy update devicemap&amp;lt;/code&amp;gt; ausführen, um das Device Rhasspy bekannt zu machen&lt;br /&gt;
&lt;br /&gt;
Anhand einer Lampe &amp;quot;Office&amp;quot;, die sich nur ein- und ausschalten lässt, könnte das z.B. so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
attr Office genericDeviceType switch&lt;br /&gt;
attr Office alias Licht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;genericDeviceType&#039;&#039; &#039;&#039;&#039;switch&#039;&#039;&#039; gibt für ein Gerät vor, dass es sich nur ein- und ausschalten lässt. Beim Typ &#039;&#039;&#039;light&#039;&#039;&#039; z.B. könnte man auch noch die Helligkeit und die Farbe regulieren.&lt;br /&gt;
Der &#039;&#039;alias&#039;&#039; &#039;&#039;&#039;Licht&#039;&#039;&#039; bewirkt, dass in Zukunft einfach &amp;quot;Licht aus&amp;quot; oder &amp;quot;Licht an&amp;quot; gesagt werden kann. Dazu aber später mehr.&lt;br /&gt;
&lt;br /&gt;
Die Lampe ist somit fertig vorbereitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Damit Rhasspy auch von diesem Gerät erfährt, muss FHEM ihm davon erzählen. Das passiert, in dem folgender Befehl ausgeführt wird:&lt;br /&gt;
 set rhasspy update devicemap&lt;br /&gt;
Darauf hin werden mehrere Aktionen durchgeführt:&lt;br /&gt;
* Es werden in Rhasspy Slots erstellt, die später in Intents verwenden werden können&lt;br /&gt;
* Diese Slots werden mit den Daten befüllt, die in FHEM für die Verwendung in Rhasspy konfiguriert wurden. In diesem Fall nur der Alias dieser Lampe&lt;br /&gt;
* Ein Training von Rhasspy wird angestoßen, damit Rhasspy das Gerät in gesprochenen Sätzen erkennt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob alles funktioniert hat, lässt sich an drei Dingen erkennen:&lt;br /&gt;
# Es gibt neue Slots in Rhasspy bzw. bereits vorhandene wurden mit neuen Werten ergänzt&lt;br /&gt;
# Ein &amp;lt;code&amp;gt;list rhasspy&amp;lt;/code&amp;gt; enthält den Helper &#039;&#039;&#039;devicemap&#039;&#039;&#039; mit den konfigurierten Geräten und dessen Steuermöglichkeiten (&#039;&#039;intents&#039;&#039;)&lt;br /&gt;
# In den Readings &#039;&#039;udpateSlots&#039;&#039; und &#039;&#039;training&#039;&#039; des Moduls ist kein Fehler zu erkennen (unter Umständen die Seite im Browser aktualisieren, wenn die Readings noch nicht vorhanden sind)&lt;br /&gt;
&lt;br /&gt;
==Einen ersten Intent erstellen==&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Dieses Beispiel enthält bereits einige Sprech-Alternativen und optionale Elemente. Die vorhandenen Möglichkeiten sind zum Einen der offiziellen Dokumentation zu entnehmen, zur Vertiefung gibt es in den Links unten ein sehr informatives Video.}}&lt;br /&gt;
[[File:Rhasspy09.png|thumb|Ein erfolgreich von RHASSPY empfangener und umgesetzter Sprachbefehl]]&lt;br /&gt;
Um die konfigurierte Lampe schlussendlich auch steuern zu können, muss Rhasspy noch wissen, was nach einem erkannten Sprachbefehl anfangen soll. Dazu werden in Rhasspy Sentences/Intents erstellt. Im Falle dieser Lampe, reicht ein einfacher SetOnOff-Intent. Sie kann ja nicht mehr.&lt;br /&gt;
&lt;br /&gt;
Da der Intent aber potentiell für mehrere Geräte dienen können soll, wird es etwas komplizierter, als beim &#039;&#039;GetTime&#039;&#039; Intent. Allerdings hat dsa Modul schon passende Slots erstellt, die in eigenen Intents verwendet werden können. Zusätzlich müssen aber &#039;&#039;Tags&#039;&#039; verwendet, damit das Modul dann unterscheiden kann, ob ein von Rhasspy geliefertes Wort ein Gerät, ein Raum oder ein Nummernwert ist.&lt;br /&gt;
&lt;br /&gt;
Ein ganz einfacher Intent, um die Lampe ein- und ausschalten zu können, kann z.B. so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
schalte das $de.fhem.Device-SetOnOff{Device} ( an{Value:on} | aus{Value:off})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kurz umrissen bedeuten die Teile des Satzes:&lt;br /&gt;
* &#039;&#039;&#039;$de.fhem.Device-SetOnOff&#039;&#039;&#039; ist der Slot, der die Geräte enthält, die mit diesem Intent gesteuert werden sollen. Das Dollarzeichen am Anfang des Slots wird gerne vergessen, darauf also besonders gut aufpassen&lt;br /&gt;
* &#039;&#039;&#039;{Device}&#039;&#039;&#039; ist ein Tag, der dem FHEM-Modul und Rhasspy verrät, dass es sich bei diesem Wort um ein Device handelt. Wichtig bei Tags, die in Verbindung mit diesem Modul verwendet werden ist, dass sie &#039;&#039;&#039;immer&#039;&#039;&#039; mit einem Großbuchstaben beginnen!&lt;br /&gt;
* &#039;&#039;&#039;( ... | ... )&#039;&#039;&#039; ist eine Gruppe. Wobei die runden Klammern eine Gruppe beschreiben, die einzelnen Mitglieder dieser Gruppe werden durch die &amp;quot;Pipe&amp;quot; getrennt. In diesem konkreten Fall bedeutet es, der Wert kann &amp;quot;an&amp;quot; ODER &amp;quot;aus&amp;quot; sein&lt;br /&gt;
*&#039;&#039;&#039;{Value:on}&#039;&#039;&#039;/&#039;&#039;&#039;{Value:off}&#039;&#039;&#039; ist wieder ein Tag. Dieser gibt an, dass es sich beim übergebenen Wort um einen Wert handelt. Da das Modul aber die deutschen Wörter &amp;quot;an&amp;quot; und &amp;quot;aus&amp;quot; nicht versteht, müssen hier Synonyme verwendet werden. Das sind jeweils die Werte hinter dem Doppelpunkt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Da mit Erstellen des ersten Intents wieder Änderungen an der Konfiguration vorgenommen wurden, muss jetzt wieder ein &amp;lt;code&amp;gt;set rhasspy update all&amp;lt;/code&amp;gt; ausgeführt werden. In diesem Fall, damit das Modul vom neuen Intent erfährt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ist man dieser Schnellstart-Anleitung gefolgt, können aus diesem Satz mit der vorhandenen Lampe jetzt zwei gesprochene Sätze gebildet werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht an&lt;br /&gt;
schalte das licht aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Infos, die daraus resultierend nach einem Sprachbefehl &amp;quot;schalte das licht an&amp;quot; im FHEM-Modul ankommen sind dann unter anderem:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;intent&amp;quot;:&amp;quot;SetOnOff&amp;quot;&lt;br /&gt;
&amp;quot;Device&amp;quot;:&amp;quot;licht&amp;quot;&lt;br /&gt;
&amp;quot;Value&amp;quot;:&amp;quot;on&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Schlusswort==&lt;br /&gt;
Sind alle Punkte dieser Schnellstart-Anleitung erfolgreich abgeschlossen, kann damit begonnen werden, das Device rhasspy auf die eigenen Bedürfnisse anzupassen und weitere Geräte damit zu steuern. Alle Informationen dazu finden sich auf der Hauptseite von [[RHASSPY]] sowie in der [[RHASSPY/Vertiefung]].&lt;br /&gt;
&lt;br /&gt;
==Anhang==&lt;br /&gt;
===Docker-Compose File - Base===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
version: &#039;3&#039;&lt;br /&gt;
&lt;br /&gt;
services:&lt;br /&gt;
    rhasspy:&lt;br /&gt;
        image: &amp;quot;rhasspy/rhasspy&amp;quot;&lt;br /&gt;
        container_name: rhasspy&lt;br /&gt;
        restart: unless-stopped&lt;br /&gt;
        volumes:&lt;br /&gt;
            - &amp;quot;.config/rhasspy/profiles:/profiles&amp;quot;&lt;br /&gt;
            - /etc/timezone:/etc/timezone:ro&lt;br /&gt;
        ports:&lt;br /&gt;
            - &amp;quot;12101:12101&amp;quot;&lt;br /&gt;
            - &amp;quot;12183:12183&amp;quot;&lt;br /&gt;
        command: --user-profiles /profiles --profile de&lt;br /&gt;
        environment:&lt;br /&gt;
          - TZ=Europe/Berlin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Docker-Compose File - Satellite===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
version: &#039;3&#039;&lt;br /&gt;
&lt;br /&gt;
services:&lt;br /&gt;
    rhasspy:&lt;br /&gt;
        image: &amp;quot;rhasspy/rhasspy&amp;quot;&lt;br /&gt;
        container_name: rhasspy&lt;br /&gt;
        restart: unless-stopped&lt;br /&gt;
        volumes:&lt;br /&gt;
            - &amp;quot;.config/rhasspy/profiles:/profiles&amp;quot;&lt;br /&gt;
            - &amp;quot;/etc/localtime:/etc/localtime:ro&amp;quot;&lt;br /&gt;
            - &amp;quot;/etc/asound.conf:/etc/asound.conf&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
            - &amp;quot;12101:12101&amp;quot;&lt;br /&gt;
        command: --user-profiles /profiles --profile de&lt;br /&gt;
        devices:&lt;br /&gt;
          - &amp;quot;/dev/snd:/dev/snd&amp;quot;&lt;br /&gt;
        ipc: host&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Adroid-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37551</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37551"/>
		<updated>2022-09-18T08:54:48Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Installation auf reguläres update angepaßt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist seit September 2022 im regulären FHEM-update enthalten.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;siteId&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;autoTraining&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;), 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden und &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt;, das für Tests und andere Text-Eingabemöglichkeiten wichtig ist.&lt;br /&gt;
&lt;br /&gt;
=== baseUrl ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== devspec ===&lt;br /&gt;
&#039;&#039;devspec&#039;&#039; der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
&lt;br /&gt;
=== defaultRoom ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== language ===&lt;br /&gt;
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== fhemId ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== siteId ===&lt;br /&gt;
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als &#039;&#039;Satellit&#039;&#039; 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 &#039;&#039;language&#039;&#039;-Kürzel und der &#039;&#039;fhemId&#039;&#039; zusammengesetzt.&lt;br /&gt;
{{Hinweis|Für die Funktionalitäten &#039;&#039;test_sentence&#039;&#039;, &#039;&#039;test_file&#039;&#039;, &#039;&#039;msgDialog&#039;&#039; und &#039;&#039;AMAD.*&#039;&#039; ist es &#039;&#039;&#039;zwingend erforderlich&#039;&#039;&#039;, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}&lt;br /&gt;
&lt;br /&gt;
=== prefix ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== useGenericAttrs ===&lt;br /&gt;
Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen und die automatisierte Eigenschaftenerkennung. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== encoding ===&lt;br /&gt;
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== handleHotword ===&lt;br /&gt;
Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#rhasspyHotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autoTraining ===&lt;br /&gt;
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 &amp;quot;0&amp;quot;, wird diese Funktion deaktiviert, alle anderen numerischen Werte werden als Änderung dieses Timeouts (in Sekunden) interpretiert&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;autoTraining=60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteId, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set-Befehle (SET) ==&lt;br /&gt;
&lt;br /&gt;
=== customSlot ===&lt;br /&gt;
Erstellt einen neuen - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
* &amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
* &amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fetchSiteIds ===&lt;br /&gt;
Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
Sendet eine WAV Datei an Rhasspy, &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== speak ===&lt;br /&gt;
Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
&lt;br /&gt;
Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== textCommand ===&lt;br /&gt;
Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
Mangels siteId erfolgt hier keine Rückmeldung zum ausgeführten Kommando.&lt;br /&gt;
&lt;br /&gt;
=== trainRhasspy ===&lt;br /&gt;
Startet das Training von Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&#039;&#039;update&#039;&#039; kennt diverse Abstufungen:&lt;br /&gt;
&lt;br /&gt;
==== update devicemap ====&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update devicemap_only ====&lt;br /&gt;
Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update slots ====&lt;br /&gt;
Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
&lt;br /&gt;
Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
* de.fhem.AllKeywords  (Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
* de.fhem.Device&lt;br /&gt;
* de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
* de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
* de.fhem.Group&lt;br /&gt;
* de.fhem.Room&lt;br /&gt;
* de.fhem.MediaChannels&lt;br /&gt;
* de.fhem.Color&lt;br /&gt;
* de.fhem.NumericType&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== slots_no_training ====&lt;br /&gt;
Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update language ====&lt;br /&gt;
Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
&lt;br /&gt;
Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update intent_filter ====&lt;br /&gt;
Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#intentFilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update all ====&lt;br /&gt;
Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== volume ===&lt;br /&gt;
Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float). Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden sollte, v.a. wenn das [[#autoTraining|autoTraining]] in der DEF deaktiviert wurde!}}&lt;br /&gt;
&lt;br /&gt;
== Get-Befehle (GET) ==&lt;br /&gt;
=== export_mapping ===&lt;br /&gt;
Liefert für das angegebene Device ein &amp;quot;klassisches&amp;quot; &#039;&#039;rhasspyMapping&#039;&#039;, das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen (z.B. bei &#039;&#039;SetScene&#039;&#039; und dem Szenen-Format für &#039;&#039;HUEBridge&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== test_file ===&lt;br /&gt;
Anzugeben ist der Dateiname (einschl. Pfad)&lt;br /&gt;
&lt;br /&gt;
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 &#039;_result.txt&#039; endet. &#039;&#039;stop&#039;&#039; 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.&lt;br /&gt;
Für diese Funktion ist es zwingend erforderlich, dass die &#039;&#039;siteId&#039;&#039; der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
=== test_sentence ===&lt;br /&gt;
Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei &#039;&#039;test_file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#rhasspyShortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen|Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
Um das Verhalten von RHASSPY beeinflussen zu können, können neben den bei den Attributen verfügbaren &#039;&#039;Tweaks&#039;&#039; auch die folgenden Readings genutzt - und v.a. auch im laufenden Betrieb immer weider geändert - werden:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Ein Beispiel, mit dem dies per Sprachkommando erfolgt, ist in &#039;&#039;contrib&#039;&#039; zu finden, mit der mobilen Satelliten per Funktionsaufruf in einem [[#rhasspyIntents|rhasspyIntent]] einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung (bzw. nach Abschluss aller Änderungen) an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#update devicemap|update devicemap]]&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Falls man Slots händisch befüllt, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der &#039;&#039;devspec&#039;&#039; im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== genericDeviceType ===&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels [[#gdt2groups|gdt2groups]] aus [[#rhasspyTweaks|rhasspyTweaks]])&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
=== rhasspyName ===&lt;br /&gt;
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 (&#039;&#039;alias&#039;&#039;), z.B. in Auswahldialogen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== rhasspyRoom ===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden (der erste Wert ist wieder der &#039;&#039;Hauptraum&#039;&#039; für Auswahldialoge etc.).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
&lt;br /&gt;
=== rhasspyGroup ===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== rhasspyMapping ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings ====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== rhasspySpecials ===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==== rhasspyChannels ====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== rhasspyColors ====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
\[deutlich{Factor:2}] ( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Factor&amp;lt;/code&amp;gt; Dieser Wert wird mit der Standard-Schrittweite (&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; im Mapping) multipliziert&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DeviceOverview_anpassen&amp;diff=37513</id>
		<title>DeviceOverview anpassen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DeviceOverview_anpassen&amp;diff=37513"/>
		<updated>2022-08-04T14:09:32Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Hinweis auf Vorsicht bei eventMap eingefügt + Beispiel für funktionales devStateIcon&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite enthält einen systematischen Überblick über die verschiedenen Attribute, mit deren Hilfe das Erscheinungsbild und die Funktionalität eines [[Gerät|Geräts]] in [[FHEMWEB]] eingestellt und verändert werden kann. Dabei geht es im Folgenden um den sogenannten &#039;&#039;deviceOverview&#039;&#039;, mit der ein Gerät in der Raumdarstellung erscheint, wobei hier nur das Erscheinungsbild in f18 auf einem großen Bildschirm behandelt wird.&lt;br /&gt;
&lt;br /&gt;
==Überblick==&lt;br /&gt;
===Attribute===&lt;br /&gt;
Es stehen für alle Geräte in FHEM folgende Attribute zur Verfügung, die sich teilweise wechselseitig beeinflussen und überlagern:&lt;br /&gt;
*{{Link2CmdRef|Lang=de|Anker=icon|Label=icon}}&lt;br /&gt;
*[[webCmd]]&lt;br /&gt;
*[[eventMap]]&lt;br /&gt;
*{{Link2CmdRef|Lang=de|Anker=webCmdLabel|Label=webCmdLabel}}&lt;br /&gt;
*{{Link2CmdRef|Lang=de|Anker=cmdIcon|Label=cmdIcon}}&lt;br /&gt;
*{{Link2CmdRef|Lang=de|Anker=widgetOverride|Label=widgetOverride}}&lt;br /&gt;
*{{Link2CmdRef|Lang=de|Anker=stateFormat|Label=stateFormat}}&lt;br /&gt;
*[[devStateIcon]]&lt;br /&gt;
{{Hinweis|Wer einen schnellen Überblick über die diversen Widgets und webCmdLabel sucht, kann [[FHEMWEB/Widgets|hier]] fündig werden.}}&lt;br /&gt;
&lt;br /&gt;
===Allgemeines zum deviceOverview===&lt;br /&gt;
Grundsätzlich ist der deviceOverview in verschiedene &#039;&#039;&#039;Bereiche&#039;&#039;&#039; eingeteilt, die zum Teil nur mit Inhalten gefüllt werden, wenn auch ein entsprechendes Attribut vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;icon&#039;&#039; &amp;lt;Gerätename&amp;gt; &#039;&#039;STATE&#039;&#039;/&#039;&#039;devStateIcon&#039;&#039; &#039;&#039;webCmd&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beispiele: &lt;br /&gt;
* ein &#039;&#039;icon&#039;&#039; wird nur angezeigt, wenn das entsprechende Attribut spezifiziert ist. Ansonsten beginnt der deviceOverview mit dem Gerätenamen.&lt;br /&gt;
* ist ein &#039;&#039;devStateIcon&#039;&#039; spezifiziert, verdrängt dieses in der Regel die &#039;&#039;STATE&#039;&#039;-Darstellung&lt;br /&gt;
* entsprechendes gilt ggf. für eine eventMap&lt;br /&gt;
* ist keines der genannten Attribut definiert und vom jeweiligen Modul wird kein &#039;&#039;set&#039;&#039; bereitgestellt, besteht die Ansicht nur aus dem Gerätenamen und dem derzeitigen Inhalt des Internals &#039;&#039;STATE&#039;&#039;. &#039;&#039;STATE&#039;&#039; wird dabei mangels stateFormat-Attribut aus dem Reading &#039;&#039;state&#039;&#039; abgeleitet (ggf. unter Berücksichtigung von eventMap) . Ist auch dieses nicht vorhanden, erscheinen drei ???.&lt;br /&gt;
&lt;br /&gt;
==webCmd &amp;amp; Co==&lt;br /&gt;
Der rechte Bereich wird mit Hilfe der Attribute webCmd, eventMap, cmdIcon, widgetOverride und webCmdLabel beeinflußt.&lt;br /&gt;
Dabei bestimmt webCmd, welche Kommandos angezeigt werden, mit eventMap&amp;lt;ref&amp;gt;dabei sind komplexere Perl-Angaben möglich, z.B. &amp;lt;code&amp;gt; attr tasmota_test eventMap { dev=&amp;gt;{&#039;^(.*)POWER(.?): OFF$&#039;=&amp;gt;&#039;$1POWER$2: off&#039;, &#039;^(.*)POWER(.?): ON$&#039;=&amp;gt;&#039;$1POWER$2: on&#039;} }&amp;lt;/code&amp;gt; &amp;lt;/ref&amp;gt; werden diese intern ggf. in andere (Modul-)Befehle bzw. Reading-Inhalte umgewandelt und cmdIcon ermöglicht es, den Kommando-Text durch Symbole zu ersetzen. Mittels webCmdLabel kann eine Beschriftung vorangestellt werden und widgetOverride ein anderes Widget ausgewählt werden, als das, das für das Setzen eines bestimmten Readings standardmäßig verwendet wird. Weitere Hinweise zu diesen Attributen sind den oben verlinkten Artikeln zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Hier soll anhand eines virtuellen Tür- oder Fensterkontakts die Funktionsweise der verschiedenen Attribute erläutert werden. Dazu wird zunächst mit &amp;lt;code&amp;gt;define Virtueller_Tuerkontakt CUL_HM 112233&amp;lt;/code&amp;gt; ein CUL_HM-Gerät generiert und mit &amp;lt;code&amp;gt;set Virtueller_Tuerkontakt virtual 1&amp;lt;/code&amp;gt; ein weiteres CUL_HM-Gerät für dessen ersten Kanal. Diesen &amp;lt;code&amp;gt;Virtueller_Tuerkontakt_Btn1&amp;lt;/code&amp;gt; verwenden wir im Folgenden. &lt;br /&gt;
{{Hinweis|Die folgenden Ausführungen dienen der Erläuterung! Insbesondere eventMap verändert auch das Verhalten eines Gerätes, was in vielen Fällen nicht in der Form im Voraus bedacht wird. Es ist zwar sprachlich leichter zu erfassen, wenn der Zustand einer Tür als &amp;quot;offen&amp;quot; gekennzeichnet ist, aber eine Sprachsteuerung hat damit möglicherweise das Problem, dass sie nicht feststellen kann, was der Zustand dieser Tür ist. Versieht man das mit einem passenden devStateIcon (s.u.), ist der Zustand auch optisch auf einen Blick gut zu erfassen, und Probleme wie das aufgezeigte lassen sich auf diesem Weg direkt vermeiden.}}&lt;br /&gt;
[[Datei:Virtueller Btn 1 neu erstellt.png]]&lt;br /&gt;
&lt;br /&gt;
Dieser hat zunächst einen unbekannten STATE (&#039;&#039;???&#039;&#039;) und ein bereits gesetzes webCMD-Attribut &#039;&#039;press short:press long&#039;&#039;. Für die Verwendung als Tuerkontakt soll dieser jedoch nicht kurze oder lange Tastendrücke als Information versenden, sondern soll offen- bzw. geschlossen-Nachrichten senden. Wir ändern das daher und klicken auf eines der angebotenen webCmd. &lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 webCmd postEvent open:postEvent closed&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtueller TK postEvent.png]]&lt;br /&gt;
&lt;br /&gt;
Da dies nicht unbedingt optisch ansprechend ist, und wir vielleicht lieber eine Anzeige in unserer Sprache haben wollen, übersetzten wir das zwischen unserer Sprache und der des Türkontakts. Hierfür ändern wir das webCmd-Attribut auf &#039;&#039;offen:geschlossen&#039;&#039; und ergänzen  &lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 eventMap /postEvent open:offen/postEvent closed:geschlossen/&lt;br /&gt;
Da hier die zu übersetzenden Befehle Leerzeichen enthalten, muss statt des eigentlich üblichen Leerzeichens als Trenner zwischen den einzelnen Angaben etwas anderes festgelegt werden, hier wird &amp;quot;/&amp;quot; verwendet. Wenn jetzt &#039;&#039;offen&#039;&#039; gedrückt wird, sehen wir, dass sich nicht nur die Anzeige geändert hat:&lt;br /&gt;
&lt;br /&gt;
[[Datei:WebCmd offen geschlossen.png]]&lt;br /&gt;
&lt;br /&gt;
Jetzt sind auch state bzw. STATE und die Anzeige des entsprechenden Bereichs nicht mehr deckungsgleich. In state ist &#039;&#039;set_postEvent open&#039;&#039; enthalten, in der Anzeige erscheint aber &#039;&#039;set_offen&#039;&#039;.  &lt;br /&gt;
Um statt des Texts ein passendes Symbol anzuzeigen, legen wir nun ein cmdIcon-Attribut fest:&lt;br /&gt;
  attr Virtueller_Tuerkontakt_Btn1 cmdIcon offen:fts_door_slide_open geschlossen:fts_door_slide&lt;br /&gt;
&lt;br /&gt;
[[Datei:Tuerkontakt cmdIcon.png]]&lt;br /&gt;
&lt;br /&gt;
Wer es farbig mag:&lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 cmdIcon offen:fts_door_slide_open@red geschlossen:fts_door_slide@green&lt;br /&gt;
Mit vorangestellter Beschreibung: &lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 webCmdLabel Auf:Zu&lt;br /&gt;
&lt;br /&gt;
==STATE==&lt;br /&gt;
Ist kein &#039;&#039;stateFormat&#039;&#039; und kein &#039;&#039;devStateIcon&#039;&#039; spezifiziert, enthält der Bereich &amp;quot;STATE&amp;quot; den aktuellen Inhalt des Readings &#039;&#039;state&#039;&#039;.&lt;br /&gt;
===stateFormat===&lt;br /&gt;
Mit diesem Attribut kann festgelegt werden, welcher Textinhalt für &#039;&#039;STATE&#039;&#039; verwendet werden soll. Es kann z.B. einfach eine Einheit hinzugefügt werden:&lt;br /&gt;
 attr Aussentemperatur_Nord stateFormat state °C&lt;br /&gt;
&lt;br /&gt;
[[Datei:DevState Text mit formatiertem state.png]]&lt;br /&gt;
&lt;br /&gt;
Oder es können die Inhalte mehrerer Readings übernommen und formatiert werden: &lt;br /&gt;
 attr MYSENSOR_97 stateFormat T: temperature2°C, H: humidity3%rH, P: pressure1 hPa, Status: state&lt;br /&gt;
&lt;br /&gt;
[[Datei:MySensors stateFormat.png]]&lt;br /&gt;
&lt;br /&gt;
Es kann für stateFormat auch Perl-Code festgelegt werden. Auf die geschweiften Klammern achten z.B.:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{if (ReadingsVal(&amp;quot;MYSENSOR_97&amp;quot;,&amp;quot;contact&amp;quot;,&amp;quot;&amp;quot;) =~ &amp;quot;open.*&amp;quot;) {&amp;quot;open&amp;quot; . ReadingsTimestamp(&amp;quot;MYSENSOR_97&amp;quot;,&amp;quot;contact&amp;quot;,&amp;quot;&amp;quot;)} else {ReadingsVal(&amp;quot;MYSENSOR_97&amp;quot;,&amp;quot;state&amp;quot;,&amp;quot;&amp;quot;)}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Hinweis|Bei Verwendung von Perl-Code in stateFormat sollte jedoch darauf geachtet werden, dass ein lesbarer Text zurückgeliefert wird! Für grafische Ausgaben soll und kann devStateIcon iVm. Perl-Code verwendet werden.}}&lt;br /&gt;
&lt;br /&gt;
===devStateIcon===&lt;br /&gt;
Wird ein devStateIcon spezifiziert, verdrängt dies die Anzeige des STATE&amp;lt;ref&amp;gt;vorausgesetzt, in der Perl-Variante wird ein gültiges Ergebnis zurückgeliefert&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Text-Variante====&lt;br /&gt;
Es kann zum einen einfach ein bestimmter Text jeweils durch ein passendes Icon ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
1. Beispiel:&lt;br /&gt;
 attr Virtueller_Tuerkontakt devStateIcon set_offen:fts_door_slide_open set_geschlossen:fts_door_slide&lt;br /&gt;
Das ganze kann mit einer Farbangaben kombiniert sein: &lt;br /&gt;
 attr Virtueller_Tuerkontakt devStateIcon set_offen:fts_door_slide_open@red set_geschlossen:fts_door_slide@green&lt;br /&gt;
Schließlich kann man auch noch einen Befehl festlegen, der beim Klicken auf das Symbol ausgeführt werden soll:&lt;br /&gt;
 attr Virtueller_Tuerkontakt devStateIcon set_offen:fts_door_slide_open:geschlossen set_geschlossen:fts_door_slide:offen&lt;br /&gt;
bzw. mit Farbangabe:&lt;br /&gt;
 attr Virtueller_Tuerkontakt devStateIcon set_offen:fts_door_slide_open@red:geschlossen set_geschlossen:fts_door_slide@green:offen&lt;br /&gt;
Damit wäre in obigem Beispiel webCmd und webCmdLabel nicht mehr erforderlich und könnte gelöscht werden.&lt;br /&gt;
Die folgenden Attribute sind für eine Bedienung ausreichend:&lt;br /&gt;
 defmod Virtueller_Tuerkontakt_Btn1 CUL_HM 11223301&lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 cmdIcon offen:fts_door_slide_open@red geschlossen:fts_door_slide@green&lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 devStateIcon set_offen:fts_door_slide_open@red:geschlossen set_geschlossen:fts_door_slide@green:offen&lt;br /&gt;
 attr Virtueller_Tuerkontakt_Btn1 eventMap /postEvent open:offen/postEvent closed:geschlossen/&lt;br /&gt;
[[Datei:Tuerkontakt defStateIcon only.png]]&lt;br /&gt;
&lt;br /&gt;
Noch einfacher: Das ganze ohne eventMap-Umbenennungen - dafür mit direkten set-Anweisungen aus dem devStateIcon heraus:&lt;br /&gt;
 attr Virtueller_Tuerkontakt_EZ devStateIcon .*open:fts_window_1w_open@red:postEvent+closed .*closed:fts_window_1w@green:postEvent+open&lt;br /&gt;
 attr Virtueller_Tuerkontakt_EZ icon fts_door_right_open&lt;br /&gt;
 attr Virtueller_Tuerkontakt_EZ webCmd :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Beispiel mit Regex&amp;lt;ref&amp;gt;Der Rollladenstatus ist hier invertiert, also 80% entspricht einem leicht geschlossenen Rollladen&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 attr Rollladen devStateIcon 0:fts_shutter_100 100:fts_shutter_10 9\d.*:fts_shutter_10 8\d.*:fts_shutter_20 7\d.*:fts_shutter_30 6\d.*:fts_shutter_40 5\d.*:fts_shutter_50 4\d.*:fts_shutter_60 3\d.*:fts_shutter_70 2\d.*:fts_shutter_80 1\d.*:fts_shutter_90 0\d.*:fts_shutter_100&lt;br /&gt;
&lt;br /&gt;
====Multi-Icon-Variante====&lt;br /&gt;
Seit 19.02.2019 ist es möglich, auch mehrere Icons zu nutzen, um den Zustand mehrerer Readings zu visualisieren. Beispiel 1 für den Zustand einer Tür samt Schloß:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Tuer geoeffnet.png]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Tuer nicht-verschlossen.png]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Tuer zu.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod keller_flur_tuer ESPEasy 192.168.144.181 80 ESPBridge Keller_Sensoren_flur_holzhalle&lt;br /&gt;
attr keller_flur_tuer alias Tür Holzhalle&lt;br /&gt;
attr keller_flur_tuer devStateIcon 1.on:fts_door@green 1.off:fts_door_open@red\&lt;br /&gt;
2.on:secur_locked@green 2.off:secur_open@red&lt;br /&gt;
attr keller_flur_tuer icon hue_room_frontdoor&lt;br /&gt;
attr keller_flur_tuer stateFormat 1:mk\&lt;br /&gt;
2:rsk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Anm.: rsk und mk sind jeweils die Namen der Readings für die Tür bzw. das Schloss&lt;br /&gt;
&lt;br /&gt;
Beispiel 2: holiday-Datei:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Holiday-multiicon.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod ferien holiday&lt;br /&gt;
attr ferien alias Ferien Baden-Württemberg&lt;br /&gt;
attr ferien devStateIcon [^(none|Heute|Morgen)].*:scene_party none:scene_office&lt;br /&gt;
attr ferien icon time_calendar&lt;br /&gt;
attr ferien stateFormat Heute: \&lt;br /&gt;
state\&lt;br /&gt;
Morgen: \&lt;br /&gt;
tomorrow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Anm.: Die regex beim devStateIcon wandelt alles, das nicht &amp;quot;none&amp;quot;, &amp;quot;heute&amp;quot; oder &amp;quot;Morgen&amp;quot; ist in das scene_party-Icon um .&lt;br /&gt;
&lt;br /&gt;
====Perl-Variante====&lt;br /&gt;
Schließlich kann in dem Attribut Perl-Code enthalten sein, der dann auch komplexe Anweisungen enthalten kann. Beispiele:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 1:&#039;&#039;&#039; Aufruf von Code aus einem Modul - regelbare Lampe mit toggle beim Klicken:&lt;br /&gt;
  attr MQTT2_zigbee_0x90fd9ffffe65db16 devStateIcon {zigbee2mqtt_devStateIcon255($name)}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel 2:&#039;&#039;&#039; MySensors-Node mit farbiger Anzeige, ob regelmäßig Kontakt besteht&amp;lt;ref&amp;gt;Die Funktion &#039;&#039;FW_makeImage&#039;&#039; ist in der [[DevelopmentFHEMWEB-API]] näher erläutert&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; attr MYSENSOR_97 devStateIcon {my $alivecolor = &#039;lan_rs485@red&#039;;;$alivecolor=&#039;lan_rs485@green&#039; if (ReadingsVal($name, &amp;quot;state&amp;quot;, &amp;quot;dead&amp;quot;) eq &amp;quot;alive&amp;quot;);;&amp;quot;&amp;lt;div&amp;gt;&amp;quot; . FW_makeImage(&amp;quot;$alivecolor&amp;quot;,&amp;quot;lan_rs485&amp;quot;) . FW_makeImage(&amp;quot;temp_temperature&amp;quot;,&amp;quot;temp_temperature&amp;quot;) . ReadingsVal($name,&amp;quot;temperature2&amp;quot;,0) .&amp;quot;°C &amp;quot;. FW_makeImage(&amp;quot;humidity&amp;quot;,&amp;quot;humidity&amp;quot;). ReadingsVal($name,&amp;quot;humidity3&amp;quot;,0) . &amp;quot;%rH&amp;lt;/div&amp;gt;&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;[[Datei:MySensors devStateIcon Perl.png]]&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiel 3:&#039;&#039;&#039; 4-Kanaliges Tasmota-Gerät mit Anzeige aller 4 Kanäle und toggle-Funktion auf jedem der Icons: &lt;br /&gt;
///tbd&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
=== ReadingsProxy für fernotron-Rolladen ===&lt;br /&gt;
[[Datei:Fernotron deviceoverview.jpg]]&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod Rolladen_Buero readingsProxy Rolladen_Buero&lt;br /&gt;
attr Rolladen_Buero alias Büro&lt;br /&gt;
attr Rolladen_Buero cmdIcon auf:fts_shutter_up stopp:fts_shutter_manual zu:fts_shutter_down&lt;br /&gt;
attr Rolladen_Buero eventMap u:auf d:zu s:stopp&lt;br /&gt;
attr Rolladen_Buero room Rolläden&lt;br /&gt;
attr Rolladen_Buero setFn { fhem(&#039;&amp;quot;sudo /home/pi/fernotron-control/FernotronRemote.sh 2 2 &#039;. $CMD .&#039;&amp;quot;&#039;) }&lt;br /&gt;
attr Rolladen_Buero setList u d s&lt;br /&gt;
attr Rolladen_Buero webCmd auf:stopp:zu&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hinweise==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Frontends]]&lt;br /&gt;
[[Kategorie:FHEM-Verwendung]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=37508</id>
		<title>MQTT2-Module - Praxisbeispiele</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&amp;diff=37508"/>
		<updated>2022-07-19T13:57:06Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Milight: Klarstellung, dass die Hardware an sich funktional sein muss und nicht zwingend alles empfangen werden kann.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einführung: MQTT bzw. MQTT2 in FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. &lt;br /&gt;
&lt;br /&gt;
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht&amp;lt;ref&amp;gt;Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden&amp;lt;/ref&amp;gt;. MQTT2_DEVICE unterstützt u.a. auch die &#039;&#039;setExtensions&#039;&#039; direkt, also z.B. &#039;&#039;on-for-timer&amp;lt;ref&amp;gt;Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die &#039;&#039;split&#039;&#039;-Varianten der attrTemplate-Einrichtung zu verwenden.&amp;lt;/ref&amp;gt;&#039;&#039; sowie &#039;&#039;[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]&#039;&#039;&amp;lt;ref&amp;gt;Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muss dies dort per Attribut eingeschaltet werden&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Einstellungen und Hinweise ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für [[autocreate]] in Verbindung mit MQTT2_SERVER &#039;&#039;&#039;zwingend&#039;&#039;&#039; jeder über MQTT kommunizierende Client eine ClientID angeben muss. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch &amp;quot;Wegwerf&amp;quot;-ClientID&#039;s. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit &#039;&#039;&#039;MQTT2_SERVER als Server (&amp;quot;Broker&amp;quot;)&#039;&#039;&#039;, für diesen sollte dabei &#039;&#039;autocreate&#039;&#039; &#039;&#039;&#039;nicht deaktiviert&#039;&#039;&#039; sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden&amp;lt;ref&amp;gt;Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) ebenfalls aktiv ist.&amp;lt;/ref&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Beispiel&amp;lt;ref&amp;gt;MQTT2_SERVER verwendet als default-Einstellung für &#039;&#039;autocreate&#039;&#039; &#039;&#039;simple&#039;&#039;, ohne dass ein entsprechendes Attribut gesetzt werden müsste. Die Einstellung &#039;&#039;complex&#039;&#039; empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 define MQTT2_FHEM_Server MQTT2_SERVER 1883 global&lt;br /&gt;
&lt;br /&gt;
Falls der MQTT Broker mit Hilfe von [[allowed]] abgesichert wurde, muss in den Geräten ebenfalls User bzw. Passwort eingetragen werden, damit eine MQTT Kommunikation möglich ist.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muss ggf. die &amp;quot;\&amp;quot; entfernen!}}&lt;br /&gt;
&lt;br /&gt;
=== MQTT-Einstellungen in den Geräten ===&lt;br /&gt;
Die Beispiele gehen davon aus, dass die einzubindenden Geräte &#039;&#039;&#039;&#039;&#039;mit den default-Einstellungen&#039;&#039;&#039;&#039;&#039; für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere &#039;&#039;&#039;keine Veränderungen der topic-Pfade&#039;&#039;&#039; vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen.  }}&lt;br /&gt;
&lt;br /&gt;
=== auto-Konfigurations-features ===&lt;br /&gt;
Viele firmwares und Dienste bieten Möglichkeiten an, einer Controller-Software (insbesondere homeassistant) Hilfsdaten zur automatisierten Konfiguration bereitzustellen. Da FHEM diese Daten nicht zu ihrem ursprünglichen Zweck verwenden kann, werden hierdurch lediglich zusätzliche Readings erzeugt, mit denen man als User in der Regel wenig anfangen kann. Es wird daher empfohlen, derartige features &#039;&#039;&#039;abzuschalten&#039;&#039;&#039;. Wo dies nicht möglich ist, sollte man eine passende [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp]] setzen bzw. diese passend erweitern!&lt;br /&gt;
&lt;br /&gt;
=== Schritt für Schritt ===&lt;br /&gt;
Hier werden in der Regel fertige Konfigurationen für häufige Anwendungsfälle (beispielhaft) dargestellt. In [[MQTT2_DEVICE - Schritt für Schritt]] ist etwas mehr über die Vorgehensweise bei der Zusammenstellung der verschiedenen Attribute und deren Zusammenwirken zu erfahren.&lt;br /&gt;
&lt;br /&gt;
== zigbee2mqtt ==&lt;br /&gt;
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]&lt;br /&gt;
[https://www.zigbee2mqtt.io zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.&lt;br /&gt;
&lt;br /&gt;
Einzelheiten zur Vorgehensweise sind auf der Detailseite [[Zigbee2mqtt|zigbee2mqtt]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Tasmota ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] (&#039;&#039;&#039;T&#039;&#039;&#039;heo &#039;&#039;&#039;A&#039;&#039;&#039;rends &#039;&#039;&#039;S&#039;&#039;&#039;onoff &#039;&#039;&#039;M&#039;&#039;&#039;QTT &#039;&#039;&#039;O&#039;&#039;&#039;ver &#039;&#039;&#039;T&#039;&#039;&#039;he &#039;&#039;&#039;A&#039;&#039;&#039;ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. &lt;br /&gt;
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter &#039;&#039;&amp;lt;nowiki&amp;gt;topic = %topic% (tasmota)&amp;lt;/nowiki&amp;gt;&#039;&#039; ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung &#039;&#039;DVES_%06X&#039;&#039; zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem  Eingabefeld für &#039;&#039;&amp;quot;client ...&amp;quot;&#039;&#039;, siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem &amp;quot;sprechenden Namen&amp;quot; kann dann innerhalb von FHEM - mittels &#039;&#039;rename&#039;&#039; oder ggf. mit einem &#039;&#039;alias&#039;&#039; - erfolgen.}}&lt;br /&gt;
=== MQTT2_DEVICE ===&lt;br /&gt;
Dieses sollte bei aktiviertem &#039;&#039;autocreate&#039;&#039; am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen - Schalter ===&lt;br /&gt;
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD&lt;br /&gt;
 attr MQTT2_DVES_9B01BD IODev m2server&lt;br /&gt;
 attr MQTT2_DVES_9B01BD devStateIcon on:FS20.on:off off:FS20.off:on&lt;br /&gt;
 attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\&lt;br /&gt;
    DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }&lt;br /&gt;
 attr MQTT2_DVES_9B01BD room MQTT2_DEVICE&lt;br /&gt;
 attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\&lt;br /&gt;
    off cmnd/DVES_9B01BD/POWER off\&lt;br /&gt;
    reboot cmnd/DVES_9B01BD/Restart 1&lt;br /&gt;
 attr MQTT2_DVES_9B01BD webCmd on:off:reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manuelle Anpassungen - Dimmer ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Dieses Beispiel ist nur bedingt zur Nachahmung zu empfehlen: Prinzipiell kann man Readings und setter in MQTT2_DEVICE fast nach Belieben benennen. Wählt man allerdings &amp;lt;i&amp;gt;FHEM-typische&amp;lt;/i&amp;gt; Namen, kann dies sehr zur Vereinfachung beitragen. Z.B. wird eine Sprachssteuerung bei einem Dimmer üblicherweise automatisch korrekt eingestellt werden, wenn der für die Helligkeit zuständige setter z.B. &amp;lt;i&amp;gt;pct&amp;lt;/i&amp;gt; (oder &amp;lt;i&amp;gt;brightness&amp;lt;/i&amp;gt;) heißt, oder eine abzufragende Temperatur &amp;lt;i&amp;gt;temperature&amp;lt;/i&amp;gt;. Entsprechendes gilt im Rahmen von &amp;lt;i&amp;gt;devspec-Abfragen&amp;lt;/i&amp;gt;.}}Bei einem Dimmer sind einige zusätzliche Anpassungen vorzunehmen. Ein Dimmer wird über &#039;&#039;&#039;POWER&#039;&#039;&#039; geschaltet und über &#039;&#039;&#039;Dimmer&#039;&#039;&#039; gedimmt. Damit das funktioniert, müssen ein stateFormat und devStateIcon zusammenarbeiten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr MQTT2_DVES_2DF34D devStateIcon 10\d.*:dim100%@orange:off 1\d.*:dim12%@orange:off 2\d.*:dim18%@orange:off 3\d.*:dim31%@orange:off 4\d.*:dim43%@orange:off 5\d.*:dim50%@orange:off 6\d.*:dim62%@orange:off 7\d.*:dim68%@orange:off 8\d.*:dim81%@orange:off 9\d.*:dim93%@orange:off 0:FS20.off:on .*:FS20.off@orange:off&lt;br /&gt;
 attr MQTT2_DVES_2DF34D stateFormat {if(ReadingsVal($name,&amp;quot;POWER&amp;quot;,0)eq&amp;quot;off&amp;quot;){0}else{ReadingsVal($name,&amp;quot;Dimmer&amp;quot;,0)}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nun kann man über das Icon ein- und ausschalten und der Zustand des Dimmers wird korrekt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Es fehlt noch ein Slider, um auch dimmen zu können. Zusätzlich muss setList noch um Dimmer erweitert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 attr MQTT2_DVES_2DF34D setList on cmnd/dimmer/POWER on\&lt;br /&gt;
 off cmnd/dimmer/POWER off\&lt;br /&gt;
 Dimmer cmnd/dimmer/Dimmer&lt;br /&gt;
 attr MQTT2_DVES_2DF34D webCmd Dimmer&lt;br /&gt;
 attr MQTT2_DVES_2DF34D widgetOverride Dimmer:slider,0,1,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
===== Allgemeines =====&lt;br /&gt;
Für gängige Tasmota-Geräte stehen &#039;&#039;templates&#039;&#039; bereit, mit denen sich diese schnell konfigurieren lassen. &lt;br /&gt;
Beachten Sie dazu den Abschnitt &#039;&#039;attrTemplate&#039;&#039; in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}&lt;br /&gt;
&lt;br /&gt;
===== Kein passendes attrTemplate vorhanden? =====&lt;br /&gt;
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das &amp;quot;&#039;&#039;tasmota_basic&#039;&#039;&amp;quot; anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults &amp;quot;ON&amp;quot; bzw. &amp;quot;OFF&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Allerdings stellt dieses das &#039;&#039;autocreate&#039;&#039; an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das &#039;&#039;autocreate&#039;&#039;-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im &#039;&#039;jsonMap&#039;&#039;-Attribut nur die Angabe &amp;quot;&#039;&#039;POWER1:state&#039;&#039;&amp;quot; zu belassen.&lt;br /&gt;
&lt;br /&gt;
=== on-for-timer ===&lt;br /&gt;
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen &#039;&#039;setter&#039;&#039; in der &#039;&#039;setList&#039;&#039; werden die &#039;&#039;&#039;SetExtensions&#039;&#039;&#039; verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:&lt;br /&gt;
&lt;br /&gt;
==== delay ==== &lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (Attributeingabe via FHEMWEB!):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1*10; &#039;cmnd/DVES_575127/Backlog POWER1 1; delay &#039;.$duration.&#039;; POWER1 0&#039;}&lt;br /&gt;
&lt;br /&gt;
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe [https://tasmota.github.io/docs/Commands/#delay Commands - Tasmota Delay]), also 6 Minuten.&lt;br /&gt;
&lt;br /&gt;
====pulseTime ====&lt;br /&gt;
Zeile zur Erweiterung der &#039;&#039;setList&#039;&#039; (s.o.):&lt;br /&gt;
 on-for-timer {my $duration = $EVTPART1 &amp;lt; 11.2 ? $EVTPART1*10 : $EVTPART1+100; &#039;CMNDTOPIC/Backlog pulseTime1 &#039;.$duration.&#039;; POWER1 1&#039;}&lt;br /&gt;
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit &#039;&#039;delay&#039;&#039;. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren &amp;quot;normalen&amp;quot; Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites &#039;&#039;save&#039;&#039; nur bis zum nächsten reboot des Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Da nach dem ersten pulseTime setzten, diese immer benutzt wird, kann man mit einem kleine Workaround das Device normal arbeiten lassen. Dafür wird bei jedem anderem Befehl, aus der PulseTime, der Timer deaktiviert.&lt;br /&gt;
Hierfür machen wir uns zu nutzen, dass man mehrere Befehle gleichzeitig an Tasmota senden kann (backlog). Ob diese Lösung auch mit anderen MQTT Firmwares funktioniert, kann ich nicht sagen. Es wurde lediglich mit Tasmota getestet.&lt;br /&gt;
Wir senden also, bevor wir den eigentlich Tasmota Befehl zum Ein- oder Ausschalten schicken, einen Befehl zum deaktivieren des Timers: &amp;quot;pulseTime 0&amp;quot;&lt;br /&gt;
Hier ein Beispiel: (das entsprechende device &amp;quot;DEV_611F3E&amp;quot; muss gegen das eigene ersetzt werden)&lt;br /&gt;
 off:noArg    cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 0&lt;br /&gt;
 on:noArg     cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 1 &lt;br /&gt;
 toggle:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 2&lt;br /&gt;
&lt;br /&gt;
=== zigbee2tasmota ===&lt;br /&gt;
[https://tasmota.github.io/docs/Zigbee/ zigbee2tasmota] ist eine Erweiterung der Tasmota-firmware für Microcontroller, insbesondere dem ESP8266 (und ESP32)(link), über die einige ZigBee-Chipsätze (insbesondere TI CC2530) als [[ZigBee#Koordinator_.28ZigBee_coordinator.2C_ZC.29|Coordinator]] eingebunden werden können, um ein ZigBee-Netzwerk aufzubauen.&lt;br /&gt;
{{Hinweis|Stand 08/2020 war die Einbindung anderer Chipsätze erst in einem Alpha-Stadium; die Zahl der über einen CC2530 einbindbaren ZigBee-Geräte ist daher derzeit relativ begrenzt (ca. 16)!}}&lt;br /&gt;
Auch für diese Lösung stehen einige &#039;&#039;attrTemplate&#039;&#039; zur Verfügung. Nähere Informationen hierzu sind dem Artikel [[Zigbee2Tasmota-MQTT]] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
== ESPurna ==&lt;br /&gt;
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool&#039;sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als &amp;quot;on&amp;quot; oder &amp;quot;off&amp;quot; oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.&lt;br /&gt;
&lt;br /&gt;
== Shelly ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.&lt;br /&gt;
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit &amp;quot;split&amp;quot; im Namen weitere Geräte angelegt und konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Standardmäßig senden die Shelly-Geräte ihren kompletten Status alle 30 Sekunden. Dies kann man über den Parameter &#039;&#039;mqtt_update_period&#039;&#039; in den &#039;&#039;settings&#039;&#039; ändern, allerdings ist dieser nur über die HTTP-Schnittstelle des Shelly verfügbar. Um diese Statusupdates abzustellen, kann über den Browser folgender Befehl verwendet werden:&lt;br /&gt;
 http://&amp;lt;ip-des-shelly&amp;gt;/settings?mqtt_update_period=0, &lt;br /&gt;
Soweit bekannt, werden dann nur statische updates ausgeschaltet, z.B. für das Relay bzw. angeschlossene Taster oder Schalter; insbesondere Verbrauchswerte werden dennoch aktualisiert.&lt;br /&gt;
&lt;br /&gt;
=== Shelly1 ===&lt;br /&gt;
&lt;br /&gt;
=== Shellybulb ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate  angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
 Internals:&lt;br /&gt;
   CFGFN     &lt;br /&gt;
   CID        shellybulb_3CC533&lt;br /&gt;
   DEF        shellybulb_3CC533&lt;br /&gt;
   DEVICETOPIC MQTT2_shellybulb_3CC533&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   NAME       MQTT2_shellybulb_3CC533&lt;br /&gt;
   NR         246&lt;br /&gt;
   STATE      ???&lt;br /&gt;
   TYPE       MQTT2_DEVICE&lt;br /&gt;
   READINGS:&lt;br /&gt;
     2018-12-12 19:28:08   status_blue     0&lt;br /&gt;
     2018-12-12 19:28:08   status_brightness 61&lt;br /&gt;
     2018-12-12 19:28:08   status_effect   0&lt;br /&gt;
     2018-12-12 19:28:08   status_gain     26&lt;br /&gt;
     2018-12-12 19:28:08   status_green    0&lt;br /&gt;
     2018-12-12 19:28:08   status_ison     true&lt;br /&gt;
     2018-12-12 19:28:08   status_mode     color&lt;br /&gt;
     2018-12-12 19:28:08   status_red      255&lt;br /&gt;
     2018-12-12 19:28:08   status_temp     3250&lt;br /&gt;
     2018-12-12 19:28:08   status_white    0&lt;br /&gt;
 Attributes:&lt;br /&gt;
   IODev      MQTT2_FHEM_Server&lt;br /&gt;
   readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, &#039;status_&#039;) }&lt;br /&gt;
   room       MQTT2_DEVICE&lt;br /&gt;
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate &amp;quot;shellybulb&amp;quot; auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.&lt;br /&gt;
&lt;br /&gt;
=== Shelly Plug S ===&lt;br /&gt;
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb &amp;gt; 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:&lt;br /&gt;
  attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state =&amp;gt; $EVTPART0&amp;lt;100?&amp;quot;off&amp;quot;:&amp;quot;on&amp;quot; } }&lt;br /&gt;
Der Status des MQTT2 Devices zeigt dann bei &amp;lt;100W &amp;quot;off&amp;quot; und sonst &amp;quot;on&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
=== HTTP-Commands ===&lt;br /&gt;
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.&lt;br /&gt;
&lt;br /&gt;
== Shelly Gen2 ==&lt;br /&gt;
=== Vorbereitung ===&lt;br /&gt;
Shelly mit dem WLAN verbinden, entweder über die Shelly APP oder per Laptop auf den Offenen AP des Shelly verbinden und dann übers WebUI des Shelly mit dem Heimischen WLAN verbinden. Über die APP geht dies meist etwas einfach und schneller, besonders wenn man mehrere Shelly Geräte hinzufügen möchte. Durch die BT Unterstützung der Gen2 Geräte, klappt dies meist auch deutlich schneller und zuverlässiger als noch bei Gen 1 Geräten. &lt;br /&gt;
Nachdem der Shelly mit dem WLAN verbunden ist, sollte die Firmware überprüft und gegebenenfalls aktualisiert werden (Stand Anfang 2022 scheint die firmware noch nicht voll ausgereift gewesen zu sein, da dass insbesondere die MQTT-Schnittstelle immer wieder überarbeitet wurde). Bitte KEINE BETA Versionen installieren, wenn nicht dazu aufgefordert wurde.&lt;br /&gt;
Nach dem, durch das Update ausgelösten, Neustart kurz Prüfen ob die Uhrzeit passt, wenn trotz richtiger Zeitzone die Uhrzeit nicht stimmt hilft ein weiterer Neustart.&lt;br /&gt;
Nun auf Networks| Internet (leider in APP und WebUI unterschiedlich), hier auf MQTT und die Einstellungen für den verwendeten MQTT Server treffen. Diese Einstellungen werden auch wieder durch Neustart übernommen.&lt;br /&gt;
=== Shelly Plus 1 ===&lt;br /&gt;
Zunächst muss man einen Statusupdate des Shelly erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
defmod MQTT2_shellyplus1_441793a34044 MQTT2_DEVICE shellyplus1_441793a34044&lt;br /&gt;
attr MQTT2_shellyplus1_441793a34044 readingList shellyplus1_441793a34044:shellyplus1-441793a34044/online:.* online\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/status/mqtt:.* { json2nameValue($EVENT) }\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/events/rpc:.* { json2nameValue($EVENT) }\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/status/sys:.* { json2nameValue($EVENT) }\&lt;br /&gt;
shellyplus1_441793a34044:shellyplus1-441793a34044/status/switch_0:.* { json2nameValue($EVENT) }&lt;br /&gt;
attr MQTT2_shellyplus1_441793a34044 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 IODev m2s&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 available_updates_beta_version 0.10.0-beta6&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 cfg_rev 7&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 connected true&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 dst shellyplus1-441793a34044/events&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_free 237568&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_size 458752&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 id 0&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 mac 441793A34044&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 method NotifyStatus&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 online true&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 output false&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_mqtt_connected true&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_id 0&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_output false&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_source WS_in&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tC 39.88&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tF 103.78&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 params_sys_available_updates_beta_version 0.10.0-beta6&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_ts 1646474952.66&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_rssi -57&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_ssid WLAN-Alex&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_sta_ip 192.168.177.167&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_status got ip&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_free 179764&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_size 249456&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 restart_required false&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 source WS_in&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 src shellyplus1-441793a34044&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tC 39.9&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tF 103.9&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 time 11:08&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 unixtime 1646474911&lt;br /&gt;
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 uptime 7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über die set Anweisung unterhalb der Device Übersicht können wir ein attrTemplate wählen; shellyPlus_1&lt;br /&gt;
Es erscheint eine kurze Übersicht was im Template enthalten ist, dieses befindet sich noch im Aufbau und wird aktuell von der Community aufgebaut und weiterentwickelt. Mit einem Klick auf „set“ laden wir das Template und übernehmen die Einstellungen für den Shelly Plus 1.&lt;br /&gt;
Damit ist der Shelly bereit, im Status wird neben dem Namen auch der Onlinestatus des Shellys (grüner | roter Punkt) so wie eine Lampe mit Toggle (on | off) Funktion und die Temperatur des Shellys angezeigt. Darüber hinaus verschwindet die Lampe und wird durch einen klickbaren Hinweis ersetzt, wenn ein Neustart des Shellys nötig ist.&lt;br /&gt;
&lt;br /&gt;
=== Tipps ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=So nimmt man bei Verwendung eines normalen Schalters (eine Stellung EIN eine AUS) gerne den „Flip“ Mode – damit wird der Shelly IMMER umgeschaltet, egal in welche Stellung der Schalter sich bewegt („Kreuzschaltung“). Diese Einstellungen trifft man grundlegend im WebUI des Shelly (oder  APP) unter „Channel settings“.&lt;br /&gt;
Für den „Flip“ müssen wir die Grundeinstellung des „Power on default“ auch ändern (gleiche Seite) - persönlich wähle ich „Restore last“, also: nach Stromausfall wird der letzte Zustand wieder hergestellt; grundsätzlich gehen alle Modi außer „Match input“.&lt;br /&gt;
}}&lt;br /&gt;
Das aktuelle Template wurde um die Funktion erweitert, den Button Mode umzuschalten. In den meisten Fällen legt man sich auf eine Schaltmethode fest, welche zum Hardware Setup passt.&lt;br /&gt;
&lt;br /&gt;
Manchmal will man aber vielleicht den Hardware Schalter deaktivieren, nennen wir es „Kindersicherung“. Bei Shelly heißt das „detached“.&lt;br /&gt;
Diese Funktion wurde ins Template als „in_mode“ Übernommen. Mögliche set Befehle sind „flip“, „detached“ „toggle“. Bedingung zur Verwendung ist: „relay power on default“ darf NICHT „Match input“ sein. Sollte Follow statt Flip bevorzugt werden, müsste entsprechende Zeile in der setList von „flip“ auf „follow“ angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Der Befehlt lässt sich mit dem webCmd in_mode auch schnell zugänglich in die Übersicht vom Shelly setzen, so erhält man neben dem Status ein Dropdown mit flip detached  und toggle zum schnellen umschalten. Mit webCmdLabel kann man noch einen Namen für das Dropdown setzen.&lt;br /&gt;
&lt;br /&gt;
== OpenMQTTGateway ==&lt;br /&gt;
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich [https://github.com/1technophile/OpenMQTTGateway OpenMQTTGateway] an, z.B. wird für das Auslesen vieler BLE-Seonsoren lediglich ein ESP32-Board ohne Zusatzhardware (ab ca. 5,- Euro in Fernost erhältlich) benötigt, auf das dann eine vorkompilierte firmware geflasht wird (hierfür wird ein USB-seriell-Wandler benötigt).&lt;br /&gt;
&lt;br /&gt;
Nähere Details sind im Artikel [[OpenMQTTGateway]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== 8-Port-Ethernet Board ==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse&lt;br /&gt;
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
In diesem {{Link2Forum|Topic=107536|Message=1016379|LinkText=Forenbeitrag}} bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.&lt;br /&gt;
&lt;br /&gt;
== Milight-Bridge ==&lt;br /&gt;
=== Vorbemerkung ===&lt;br /&gt;
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von &#039;&#039;openmili&#039;&#039; eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel. Allerdings lassen sich manche MiLight-Geräte nicht an die Bridge anlernen, und es werden auch nicht alle Fernbedienungs-Typen voll unterstützt.&lt;br /&gt;
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway&amp;lt;ref&amp;gt;Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist und die zu steuernden Leuchtmittel mit dem Hub bereits verbunden (gepairt) sind bzw. entsprechende Fernbedienungs-Signale empfangen werden können (bei vorhandenem pairing eines Leuchtmittels an die Fernbedienung).&lt;br /&gt;
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen am MiLight-Hub ===&lt;br /&gt;
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.&lt;br /&gt;
Die Einstellungen für &#039;&#039;MQTT topic pattern&#039;&#039; usw. können auf den default-Werten&amp;lt;ref&amp;gt;Diese sind: &amp;lt;br&amp;gt;&#039;&#039;milight/:device_id/:device_type/:group_id&#039;&#039; für &amp;quot;topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/updates/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;update topic pattern&amp;quot;&amp;lt;br&amp;gt;&#039;&#039;milight/states/:hex_device_id/:device_type/:group_id&#039;&#039; für &amp;quot;state topic pattern&amp;quot;. Der Autor hat derzeit folgende Infotypen zum Senden markiert: &amp;quot;status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color&amp;quot; (enthält eventuell zu viele Angaben. Bei einem Eventhandler muss man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).&amp;lt;/ref&amp;gt; belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (&#039;&#039;MQTT Client Status Topic&#039;&#039;), tragen Sie &#039;&#039;milight/LWT&#039;&#039; ein und aktivieren &#039;&#039;Detailed&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Devices ===&lt;br /&gt;
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]&lt;br /&gt;
==== Bridge ====&lt;br /&gt;
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:&lt;br /&gt;
 defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses Device wird nun das &#039;&#039;template&#039;&#039; &#039;&#039;&#039;esp_milight_hub_bridge&#039;&#039;&#039; angewandt.&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Leuchtmittel ====&lt;br /&gt;
&lt;br /&gt;
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:&lt;br /&gt;
 defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, &#039;1_&#039;, $JSONMAP) }&lt;br /&gt;
 attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE&lt;br /&gt;
&lt;br /&gt;
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Devices werden genauso erstellt. &lt;br /&gt;
&lt;br /&gt;
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template &#039;&#039;X_01a_esp_milight_hub_make_rgbw_group&#039;&#039; verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt &#039;&#039;&#039;eine Kopie&#039;&#039;&#039;, die dann modifiziert wird. Diese Kopie ist unter dem Namen &#039;&#039;milight_&amp;lt;RemoteID&amp;gt;_0&#039;&#039; im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepasst werden. &lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele:&lt;br /&gt;
Beispiel für ein RGB-CCT-Device:&lt;br /&gt;
 defmod Licht_Wz_all MQTT2_DEVICE&lt;br /&gt;
 attr Licht_Wz_all IODev MQTT2_Broker&lt;br /&gt;
 attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/&lt;br /&gt;
 attr Licht_Wz_all group Licht&lt;br /&gt;
 attr Licht_Wz_all icon light_control&lt;br /&gt;
 attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 &lt;br /&gt;
 attr Licht_Wz_all room Wohnzimmer&lt;br /&gt;
 attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;ON&amp;quot;}\&lt;br /&gt;
 off milight/0x5D02/rgb_cct/0 {&amp;quot;status&amp;quot;:&amp;quot;OFF&amp;quot;}\&lt;br /&gt;
 level milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 next_mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_up milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode_speed_down milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 device_id milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 effect milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 mode milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}\&lt;br /&gt;
 commands milight/0x5D02/rgb_cct/0 {&amp;quot;$EVTPART0&amp;quot;:&amp;quot;$EVTPART1&amp;quot;}&lt;br /&gt;
 attr Licht_Wz_all sortby 1&lt;br /&gt;
 attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue&lt;br /&gt;
 attr Licht_Wz_all webCmdLabel command\ &lt;br /&gt;
 :brightness:saturation\&lt;br /&gt;
 :color_temp:hue&lt;br /&gt;
==== Ein Leuchtmittel, mehrere Fernbedienungen ====&lt;br /&gt;
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen &amp;quot;hört&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\&lt;br /&gt;
 milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }&lt;br /&gt;
&lt;br /&gt;
==== Fernbedienung als Input-Device nutzen ====&lt;br /&gt;
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.&lt;br /&gt;
Um hier nur Differenz-Meldungen direkt an die betreffende myUtils-Funktion zu übergeben und doppelte Events zu verhindern, sollte hier die readingList so angepasst werden, dass nur Messages aus dem &amp;quot;updates&amp;quot;-Zweig ausgewertet werden: &lt;br /&gt;
 defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0&lt;br /&gt;
 attr MiLight_RC1_0 readingList milight/states/0xABCD/fut089/[0-8]:.* {}&lt;br /&gt;
 milight/updates/0xABCD/fut089/0:.* { FHEM::attrT_MiLight_Utils::MPDcontrol(&#039;myMPD&#039;,$EVENT, &#039;Yamaha_Main&#039;) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/1:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW(&#039;Licht_Stehlampe_links&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/2:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW(&#039;Licht_Stehlampe_rechts&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/3:.* { FHEM::attrT_MiLight_Utils::four_Lights_matrix($EVENT, &#039;Licht_WoZi_Vorn_Aussen&#039;, &#039;Licht_WoZi_Vorn_Mitte&#039;, &#039;Licht_WoZi_Hinten_Aussen&#039;, &#039;Licht_WoZi_Hinten_Mitte&#039;) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/4:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Jalousie_WZ&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/5:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Rollladen_WZ_SSO&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/6:.* { FHEM::attrT_MiLight_Utils::shuttercontrol(&#039;Rollladen_WZ_SSW&#039;,$EVENT) }\&lt;br /&gt;
 milight/updates/0x5D47/fut089/7:.* {}\&lt;br /&gt;
 milight/updates/0x5D47/fut089/8:.* {}&lt;br /&gt;
 attr MiLight_RC_WZ stateFormat CommandSet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== eBus ==&lt;br /&gt;
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition am eBus ===&lt;br /&gt;
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.&lt;br /&gt;
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. &#039;&#039;ebusd/%circuit/%name&#039;&#039;.&lt;br /&gt;
 --accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name&lt;br /&gt;
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic &#039;&#039;ebusd&#039;&#039; verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit &#039;&#039;ebus...&#039;&#039; zu beginnen!}}&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung und Definition  in FHEM ===&lt;br /&gt;
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem &#039;&#039;&#039;&#039;&#039;vor&#039;&#039;&#039;&#039;&#039; den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der &#039;&#039;readingList&#039;&#039; enthalten, die vom ebus stammen. Da wir die &#039;&#039;readingList&#039;&#039; anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche &#039;&#039;readingList&#039;&#039;-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.&lt;br /&gt;
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-&amp;quot;Sammeldevices&amp;quot; genutzt werden, und dessen &#039;&#039;CID&#039;&#039; auf &#039;&#039;ebusd&#039;&#039; geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der &#039;&#039;readingList&#039;&#039; des &amp;quot;Sammeldevices&amp;quot; gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. &lt;br /&gt;
&lt;br /&gt;
Sind die Vorbereitungen abgeschlossen, aktivieren wir &#039;&#039;autocreate&#039;&#039; wieder, allerdings wählen wir als autocreate-Methode &#039;&#039;complex&#039;&#039; aus, da der eBus-Dämon teilweise&amp;lt;ref&amp;gt;Dies betrifft vorrangig die Statusmeldungen&amp;lt;/ref&amp;gt; eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt&amp;lt;ref&amp;gt;Bei Verwendung des MQTT2_CLIENT wird dann die &#039;&#039;readingList&#039;&#039; am bereits definierten MQTT2_DEVICE aus der Kopie des &amp;quot;Sammeldevice&amp;quot; automatisch wieder erstellt bzw. gefüllt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;ebus-Bridge&amp;quot; ====&lt;br /&gt;
Auf das von &#039;&#039;autocreate&#039;&#039; erstellte MQTT2_DEVICE wird nunmehr das template &#039;&#039;eBus_daemon_splitter&#039;&#039; angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. &lt;br /&gt;
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen &#039;&#039;uptime&#039;&#039;, alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. &lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;attrTemplate&#039;&#039; läd eine weitere &#039;&#039;attrTemplate&#039;&#039;-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. &lt;br /&gt;
==== &amp;quot;ebusd_bai&amp;quot; und weitere Geräte ====&lt;br /&gt;
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}&lt;br /&gt;
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens &#039;&#039;MQTT2_ebus_bai&#039;&#039; angelegt worden sein.&lt;br /&gt;
&lt;br /&gt;
== Sonos2Mqtt ==&lt;br /&gt;
Aus einem Versuch heraus ist ein {{Link2Forum|Topic=111711|LinkText=kleines Projekt}} geworden: Die Sonos Umgebung mit Hilfe von sonos2mqtt als generisches MQTT2_DEVICE komfortabel in FHEM einzubinden.&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von ein paar Templates ist die grundlegende Einbindung in FHEM nach einer kleinen Installation auf Systemebene schnell erledigt. Es läuft derzeit noch zahlreiche Entwicklung und Ideenfindung, die Fortschritte sind live im Thread oder [[Sonos2mqtt|konsolidiert im Wiki]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Setup im System ===&lt;br /&gt;
Für dies Funktion wird der nodejs Server [https://github.com/svrooij/sonos2mqtt sonos2mqtt] benötigt. Entweder installiert man den lokal, irgendwo im Netzwerk oder nutzt den [[MQTT2-Module - Praxisbeispiele#Verwendung des Docker Containers|Docker Container.]]&lt;br /&gt;
&lt;br /&gt;
Der nodejs Server sonos2mqtt kann aus Sicht von FHEM irgendwo im Netzwerk stehen - aber er muss im gleichen Netzwerk wie die Sonosplayer stehen. Das UPNP Sonosnetzwerk funktioniert nicht über Netzwerksegmente hinweg.&lt;br /&gt;
&lt;br /&gt;
Eine Beschreibung aller Startparameter für sonos2mqtt findet man [https://svrooij.io/sonos2mqtt/getting-started.html in der offiziellen Doku].&lt;br /&gt;
&lt;br /&gt;
Erreicht der nodejs Server sonos2mqtt den MQTT Server nicht über - default: localhost, Port 1883, keine Anmeldung&amp;quot; - muss der Parameter --mqtt  gesetzt werden! &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800&amp;lt;/code&amp;gt;            # alles gesetzt&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://192.168.0.3:1800&amp;lt;/code&amp;gt;                                                                 # IP Adresse und Port gesetzt, keine Anmeldung am MQTT Server&lt;br /&gt;
:&amp;lt;code&amp;gt;--mqtt mqtt://192.168.0.3&amp;lt;/code&amp;gt;                                                                           # IP Adresse gesetzt, Port ist Standard 1883&lt;br /&gt;
&lt;br /&gt;
Erfolgt der Start mit pm2, werden die Parameter mit einem &#039;&#039;zusätzlichen&#039;&#039; doppelten Bindestrich (--) hinter dem nodejs Modul übergeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
pm2 start sonos2mqtt -- --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lokales Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: nodejs und pm2 ist installiert und für alle Benutzer verfügbar. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo npm install -g sonos2mqtt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Je nach Entwicklungsstand sind auch Betaversionen verfügbar. Für aktuelle Betaversionen wird dieser Zusatz beim Setup verwendet. -&amp;gt; sonosmqtt@3.1.0-beta.1&lt;br /&gt;
&lt;br /&gt;
Wird der sonos2mqtt Server auf einer anderen Maschine eingerichtet, ist der Start entsprechend diesem Absatz [[MQTT2-Module - Praxisbeispiele#Autostart von sonos2mqtt im System mit pm2 .28Alternative.29|Autostart von Sonos2mqtt im System mit pm2]] einzurichten.&lt;br /&gt;
&lt;br /&gt;
=== Setup in FHEM ===&lt;br /&gt;
Man definiert lediglich ein Bridge Device, der Rest wird automatisch erledigt.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung: &lt;br /&gt;
* autocreate im System ist aktiv. &lt;br /&gt;
* Der verwendete MQTT2_SERVER steht auf &#039;&#039;&#039;autocreate simple&#039;&#039;&#039; (default/Standard).&lt;br /&gt;
* Templates aktuell - FHEM uptodate oder bei Bedarf in der FHEM Kommandozeile aktualisieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ Svn_GetFile(&amp;quot;FHEM/lib/AttrTemplate/mqtt2.template&amp;quot;, &amp;quot;FHEM/lib/AttrTemplate/mqtt2.template&amp;quot;, sub(){ AttrTemplate_Initialize() }) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei der Anwendung des Templates für die Bridge wird das Attribut devicetopic ausgelesen oder auf default sonos gesetzt! &lt;br /&gt;
&lt;br /&gt;
Wird ein anderer Devicetopic verwendet, muss der bei der Anlage der Bridge gesetzt werden!&lt;br /&gt;
&lt;br /&gt;
Diese Zeilen einzeln in der FHEM Kommandozeile oder als Block in der Raw Definition. &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define SonosBridge MQTT2_DEVICE&lt;br /&gt;
attr SonosBridge room MQTT2_DEVICE&lt;br /&gt;
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Template sonos2mqtt_bridge_comfort:&lt;br /&gt;
* setzt das Template sonos2mqtt_bridge auf das Device,&lt;br /&gt;
* lädt die Datei 99_sonos2mqttUtils.pm aus dem contrib Ordner nach,&lt;br /&gt;
* definiert ein notify, dies erledigt im weiteren Betrieb die automatische Konfiguration der automatisch erzeugten MQTT2_DEVICEs. &lt;br /&gt;
** mit dem Template sonos2mqtt_speaker (das Template kann auch manuell auf vorhandene Player angewendet werden, die automatische Erzeugung der Player wird aber empfohlen)&lt;br /&gt;
** Ermittelt Detailinformation des jeweiligen Players (vor allem IP Adresse und Modelnumber)&lt;br /&gt;
** Lädt die Sonosgeräte Icons von den UPNP Devices herunter&lt;br /&gt;
** erweitert das setList input Kommando um den TV Eingang (HDMI, spdif) bzw. Line_IN Eingang falls vorhanden (Modelnumber)&lt;br /&gt;
* Die Player werden automatisch einzeln erzeugt wenn sie mqtt Nachrichten senden (Play/Stop) oder (alle sofort) wenn der sonos2mqtt Server gestartet wird. &lt;br /&gt;
&lt;br /&gt;
==== Wozu dient die Bridge? ====&lt;br /&gt;
Sie stellt ein paar wesentliche Funktionen zu Verfügung&lt;br /&gt;
# Auffangen von nicht benötigten MQTT Nachrichten.&lt;br /&gt;
# Erzeugung/Weiterleitung von Nachrichten für die einzelnen Player - damit auch die Erzeugung von separaten Playern nach dem Schema MQTT2_RINCON12345678901234567.&lt;br /&gt;
# Statusanzeige sonos2mqtt als Reading connected (0 offline, 1 connected, 2 Player connected).&lt;br /&gt;
Sie kann zusätzlich als zentrales Device verwendet werden, um die Sonos Umgebung abzubilden, z.B. Readings für Favoriten  u.ä.&lt;br /&gt;
&lt;br /&gt;
==== Start sonos2mqtt lokal ====&lt;br /&gt;
Der Start / Stop des sonos2mqtt Servers innerhalb von FHEM ist nur lokal simpel möglich. Ist der Server irgendwo im Netzwerk oder im Docker Container, muss man andere Möglichkeiten finden. Der Neustart aus FHEM ist zwar praktisch, aber nicht erforderlich. &lt;br /&gt;
&lt;br /&gt;
Wird eine existierenden Sonos Landschaft inhaltlich verändert (Player dazu/weg), muss der Server neu gestartet werden. Werden Player temporär abgeschaltet, merkt das der Server nach einer Zeit selbst, oder man forciert dies mit einem CheckSubscription an der Bridge.&lt;br /&gt;
&lt;br /&gt;
Soll das Modul sonos2mqtt mit seinen default Einstellungen gestartet werden, genügt dieser kurze Befehl (in der FHEM Kommandozeile):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;pm2 start sonos2mqtt&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Tipp: Verwendet man anstatt &amp;quot;Befehl&amp;quot; den Syntax {qx(Befehl)} in der FHEM Kommandozeile, wirkt der Befehl zwar blockierend aber die Ausgabe erfolgt im Browser und nicht im Logfile. Mit dem Parameter -s erfolgt keine Ausgabe.&lt;br /&gt;
&lt;br /&gt;
==== Autostart von sonos2mqtt mit FHEM ====&lt;br /&gt;
Der Code startet sowohl das sonso2mqtt Modul sofort und implementiert ein notify für den zukünftigen automatischen Start beim Start von FHEM.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start &amp;quot;pm2 -s start sonos2mqtt&amp;quot;&lt;br /&gt;
trigger n_pm2_sonos start&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Autostart von sonos2mqtt im System mit pm2 (Alternative) ===&lt;br /&gt;
Der obige Code startet das sonos2mqtt nodejs Modul mit pm2 beim Start von FHEM. Sollte das nicht funktionieren oder nicht ins gesamte Konzept passen (weil z.B. mehrere nodejs Module geladen werden) kann der automatische Start direkt im System erfolgen. Zunächst dafür das oben eventuell schon definierte notify löschen!&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
delete n_pm2_sonos&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der Start des Modul muss nicht mit erhöhten Rechten geschehen! Im Terminal folgendes eingeben (unter dem angemeldeten Benutzer wird sonos2mqtt später immer gestartet):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pm2 start sonos2mqtt&lt;br /&gt;
pm2 startup&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der letzte Befehl &amp;quot;redet&amp;quot;, d.h. es gibt eine Ausgabe in der Art:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[PM2] To setup the Startup Script, copy/paste the following command:&lt;br /&gt;
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man tut einfach genau das, was dasteht: die letzte Zeile kopieren und wieder einfügen und ausführen. Danach muss man die Konfiguration von pm2 noch sichern:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pm2 save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verwendung des Docker Containers ===&lt;br /&gt;
Ergänzend zur [https://svrooij.io/sonos2mqtt/getting-started.html#run-sonos2mqtt-in-docker Original Doku:]&lt;br /&gt;
&lt;br /&gt;
Beim Container findet die Konfiguration der Verbindung zum FHEM in den Environment Variablen statt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
environment:&lt;br /&gt;
  - SONOS2MQTT_DEVICE=192.168.56.207 # hier muss einer der Sonos Lautsprecher stehen&lt;br /&gt;
  - SONOS2MQTT_MQTT=mqtt://192.168.56.121:1883 # mqtt2_server FHEM, erweiterter Syntax siehe oben&lt;br /&gt;
  - SONOS_LISTENER_HOST=192.168.56.121 # Docker host IP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sonos2mqtt mit mehr Komfort ===&lt;br /&gt;
Im Wiki Artikel [[Sonos2mqtt]] geht es weiter.&lt;br /&gt;
&lt;br /&gt;
== Owntracks GPS Tracking in FHEM ==&lt;br /&gt;
Das hier gezeiget Beispiel verwendet eine MQTT Instanz im Internet, die mit einem MQTT2_CLIENT angebunden wird. Da wenig Traffic benötigt wird, genügt z.B. eine kostenfreie Instanz z.B. bei myqtthub (Stand. Dezember 2020)&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man einen MQTT2_SERVER auch direkt verfügbar machen, wenn man sich sicher ist was man da tut! Siehe {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}}. Das Bridge Device wird dabei genau so benötigt, nur der IODev ist dann der MQTT2_SERVER.&lt;br /&gt;
&lt;br /&gt;
=== owntracks auf dem Smartphone konfigurieren ===&lt;br /&gt;
Menü / Einstellung / Verbindung &lt;br /&gt;
&lt;br /&gt;
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):&lt;br /&gt;
* Modus -&amp;gt; MQTT&lt;br /&gt;
* Hostname  -&amp;gt; &lt;br /&gt;
** Hostnamen: host.cloud.com &lt;br /&gt;
** Port: 8883 &lt;br /&gt;
** ClientID: ID vom Provider &lt;br /&gt;
** WebSockets (nicht nutzen)&lt;br /&gt;
* Identifikation -&amp;gt; &lt;br /&gt;
** Benutzername: user-name &lt;br /&gt;
** Passwort: user-password &lt;br /&gt;
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)&lt;br /&gt;
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte)&lt;br /&gt;
* Sicherheit -&amp;gt; TLS aktivieren&lt;br /&gt;
=== Definition in FHEM ===&lt;br /&gt;
Der MQTT2_CLIENT wird so eingerichtet, man braucht eine andere ClientID als auf dem Smartphone! Stimmt alles sollte das Gerät sofort open anzeigen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MQTT2_CLIENT einrichten, autocreate simpel&lt;br /&gt;
define mqtt2Cloud MQTT2_CLIENT host.cloud.com:8883&lt;br /&gt;
attr mqtt2Cloud SSL 1&lt;br /&gt;
attr mqtt2Cloud autocreate simple&lt;br /&gt;
attr mqtt2Cloud clientId fhem1&lt;br /&gt;
attr mqtt2Cloud room MQTT2_IO&lt;br /&gt;
attr mqtt2Cloud username user-name&lt;br /&gt;
set mqtt2Cloud password user-password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Für die automatische Erzeugung der Trackergeräte in FHEM richtig man zuerst ein Bridge Device ein:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define MQTT2_Cloud_bridge MQTT2_DEVICE&lt;br /&gt;
attr MQTT2_Cloud_bridge IODev mqtt2Cloud&lt;br /&gt;
attr MQTT2_Cloud_bridge autocreate 1&lt;br /&gt;
attr MQTT2_Cloud_bridge room MQTT2_DEVICE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dies wird entweder mit dem Template allgemein  konfiguriert&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set MQTT2_Cloud_bridge attrTemplate MQTT2_CLIENT_general_bridge&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;oder manuell nur für owntracks eingerichtet&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr MQTT2_Cloud_bridge bridgeRegexp owntracks/[^/]+/([^/:]+).* &amp;quot;owntracks_$1&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;MQTT2 Geräte für owntracks werden jetzt automatisch mit dem Namen MQTT2_owntracks_&amp;lt;GeräteID&amp;gt; erzeugt. Diese werden einfach mit dem Template owntracks_device fertig konfiguriert. Bei einem IOS Gerät kann man danach noch das Template owntracks_device_IOS als Erweiterung anwenden.&lt;br /&gt;
&lt;br /&gt;
==== Anwesenheitserkennung ====&lt;br /&gt;
Die Anwesenheit kann im owntracks Device direkt für die selbst definierten Plätze abgelesen werden: entweder steht im reading place der jeweilige Ort oder away. Um hier noch eine gewisse Einheitlichkeit in der Verwendung zu bekommen kann man ein PRESENCE Device verwenden: &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define OT_Mi6 PRESENCE event MQTT2_owntracks_mi6:place:.away MQTT2_owntracks_mi6:place:.&amp;lt;Home&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Im Move Modus erfolgt die Erkennung sehr schnell und damit einige Sekunden eher als eine BT Erkennung im Haus - der Akkuverbrauch steigt enorm. Im Significant Modus kann es schon mal ein paar Minuten dauern - ein relevanter Akku Verbrauch ist nicht erkennbar.&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Hinweise ==&lt;br /&gt;
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===&lt;br /&gt;
Nutzt man das rawEvents-Attribut am MQTT2-IO&amp;lt;ref&amp;gt;z.B. &amp;lt;code&amp;gt;attr MQTT2_FHEM_Server rawEvents .*&amp;lt;/code&amp;gt;, der regex-Filter kann wie üblich angepasst werden&amp;lt;/ref&amp;gt;, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.&lt;br /&gt;
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit &amp;lt;code&amp;gt;attr mqtt2_server verbose 5&amp;lt;/code&amp;gt; auch alles ins FHEM-Log schreiben lassen.&lt;br /&gt;
&lt;br /&gt;
=== autocreate funktioniert anscheinend nicht? ===&lt;br /&gt;
In der Regel wird bei neu eingehenden MQTT-Messages über &#039;&#039;autocreate&#039;&#039; ein neues Device erstellt, wenn Nachrichten von einem bisher unbekannten Gerät kommen. Geschieht dies nicht, sollten folgende Punkte geprüft werden:&lt;br /&gt;
# (nur bei MQTT2_SERVER:) Der Client muss eine ClientID angeben, diese darf nicht den defaults von &#039;&#039;mosquito_sub&#039;&#039; entsprechen.&lt;br /&gt;
# Ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (&#039;&#039;TYPE=autocreate&#039;&#039;) muss vorhanden und aktiv sein.&lt;br /&gt;
# &#039;&#039;autocreate&#039;&#039; am IO muss eingeschaltet sein, was für MQTT2_SERVER bedeutet, dass es nicht auf &amp;quot;0&amp;quot; stehen darf (hier ist dann &#039;&#039;simple&#039;&#039; die aktive Voreinstellung), für MQTT2_CLIENT sollte ebenfalls &#039;&#039;simple&#039;&#039; verwendet werden; dies muss hier allerdings explizit gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Wird dann immer noch kein Device erstellt, gibt es in aller Regel ein Device, das bereits einen entsprechenden Eintrag in der readingList enthält, oder es sind keine Nachrichten eingegangen. Überprüfen Sie daher dann ggf. die Einstellungen am Client-Gerät (z.B. im Web-Interface des Shelly oder Tasmota-geflashten ESP8266).&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;autocreate&#039;&#039; am Device schließlich bestimmt, ob die &#039;&#039;readingsList&#039;&#039; erweitert werden darf, wenn Informationen über bisher nicht über die readingList abgedeckte Topics empfangen werden und vom MQTT2-IO als zu diesem Device/ClientID gehörend identifiziert wurden.&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Die per attrTemplate jeweils erzeugten Konfigurationen sind Einrichtungsbeispiele, die v.a. eine in sich konsistenze Zusammenstellung der verschiedenen Attribute enthalten. Es steht jedem User frei, diese Ausgangsbasis dann nach seinem Belieben zu ändern. Spätere Änderungen des verwendeten attrTemplate wirken sich nicht automatisch auf die durch frühere Versionen oder den User nachkonfigurierte Geräte aus! Da es vorkommen kann, dass sich die per MQTT übermittelten Daten und Topics ändern, wenn z.B. eine firmware aktualisiert wurden, kann dies Anpassungen am jeweiligen Template erforderlich machen. Grundsätzlich sollen die per attrTemplate für MQTT2_DEVICE verfügbaren attrTemplate jeweils für die aktuellste verfügbare stabile firmware-Version passen.}}&lt;br /&gt;
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; genutzt werden. &lt;br /&gt;
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate: Es werden nicht alle templates angezeigt ===&lt;br /&gt;
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]&lt;br /&gt;
&lt;br /&gt;
=== attrTemplate und Sprachsteuerung ===&lt;br /&gt;
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von &#039;&#039;[[AttrTemplate|attrTemplate]]&#039;&#039; dem betreffenden Hauptartikel zu entnehmen.&lt;br /&gt;
&lt;br /&gt;
=== bridgeRegexp ===&lt;br /&gt;
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch &#039;&#039;&#039;&#039;&#039;einem&#039;&#039;&#039;&#039;&#039; &#039;&#039;MQTT2_DEVICE&#039;&#039; zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. In dem nebenstehenden Schaubild wären dies die Geräte &#039;&#039;A&#039;&#039; bis &#039;&#039;D&#039;&#039;. Das &#039;&#039;&#039;Attribut&#039;&#039;&#039; &#039;&#039;bridgeRegexp&#039;&#039; kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem &#039;&#039;&#039;anderen Device&#039;&#039;&#039; (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als &#039;&#039;newClientId&#039;&#039; hinterlegte Angabe verwendet. In nebenstehendem Schaubild ist dies exemplarisch für die Gerätegruppe &#039;&#039;D&#039;&#039; mit dem &#039;&#039;bridge&#039;&#039;-Device &#039;&#039;D&#039;&#039; und dessen &#039;&#039;Satelliten&#039;&#039; &#039;&#039;D1&#039;&#039; bis &#039;&#039;D4&#039;&#039; dargestellt.&lt;br /&gt;
Dementsprechend sind in den hier aufgeführten Beispielen &#039;&#039;bridgeRegexp&#039;&#039;-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren, wie z.B. für über hier dargestellten &#039;&#039;zigbee2mqtt&#039;&#039; oder &#039;&#039;zigbee2tasmota&#039;&#039;. Ein Sonderfall hierbei ist das template &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem &#039;&#039;mosquitto&#039;&#039;-Server und würden sonst alle einem einem MQTT2_DEVICE zugewiesen.&lt;br /&gt;
&lt;br /&gt;
=== Ständig neue Devices? ===&lt;br /&gt;
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:&lt;br /&gt;
==== Vergabe einer ClientID ====&lt;br /&gt;
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). &lt;br /&gt;
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID&#039;s. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.&lt;br /&gt;
&lt;br /&gt;
==== Löschen der ClientID aus der readingList usw. ====&lt;br /&gt;
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den &#039;&#039;default&#039;&#039; &amp;quot;sonoff&amp;quot; zu ändern).&lt;br /&gt;
Beispielsweise wäre &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt; zu ändern in &amp;lt;code&amp;gt;attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }&amp;lt;/code&amp;gt;&lt;br /&gt;
Die über &#039;&#039;attrTemplate&#039;&#039; verfügbaren Konfigurationen verwenden in der Regel keine ClientID&#039;s bzw. entfernen diese.&lt;br /&gt;
&lt;br /&gt;
=== Wildcards in readingList und setList ===&lt;br /&gt;
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;readingList&#039;&#039; werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise durch einen &amp;quot;/&amp;quot;) kann man so schreiben: &amp;quot;[^/]+&amp;quot; (entspricht: &amp;quot;Mindestens ein Zeichen, das kein Schrägstrich ist&amp;quot;). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;setList&#039;&#039; gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht &amp;quot;+&amp;quot; für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es &amp;quot;Gruppen-Topics&amp;quot;, auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.&lt;br /&gt;
&lt;br /&gt;
=== Die JSON-Daten sollen ausnahmsweise nicht ausgepackt werden ===&lt;br /&gt;
In manchen Fällen ist das automatische Auspacken der JSON-Payload nicht erwünscht. In diesen Fällen kann man einfach den gewünschten Reading-Namen in die readingList eintragen, statt der Anweisung, den JSON an json2NameValue() zu übergeben. Aus&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* { json2nameValue($EVENT) }\&lt;br /&gt;
owntracks/clouduser/mi6/waypoints:.* { json2nameValue($EVENT) }\&lt;br /&gt;
owntracks/clouduser/mi6/event:.* { json2nameValue($EVENT) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
wird dann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* json_mi6\&lt;br /&gt;
owntracks/clouduser/mi6/waypoints:.* json_waypoints\&lt;br /&gt;
owntracks/clouduser/mi6/event:.* json_event&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erforderlichenfalls kann man die Einträge auch doppelt erstellen, um sowohl den JSON wie auch die ausgepackten Readings zu erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Die JSON-Daten vor dem auspacken manipulieren ===&lt;br /&gt;
Aus diversen Gründen kann es zweckmäßig sein, einen bestimmten Wert der JSON-Payload zu ignorieren.&lt;br /&gt;
Z.B. sendet ein Client statt eines Messwertes die Info &amp;quot;bad&amp;quot;. Dieser Fehlerwert soll aus der JSON-Payload &amp;quot;ausgefiltert&amp;quot; werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr DEVICE readingList &amp;lt;your topic&amp;gt;:.* { my $rets = json2nameValue($EVENT,&#039;&#039;,$JSONMAP);; my %cleaned = map { $_,$rets-&amp;gt;{$_} } grep { &#039;bad&#039; ne $rets-&amp;gt;{$_} } keys %{$rets};; return \%cleaned }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder auch einen Wert umzubenennen wenn die JSON-Payload nur ein Objekt beinhaltet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr DEVICE readingList &amp;lt;your topic&amp;gt;:.* {my %h=(0=&amp;gt;&#039;SofortLaden&#039;,1=&amp;gt;&#039;MinPV&#039;,2=&amp;gt;&#039;NurPV&#039;,3=&amp;gt;&#039;Stop&#039;,4=&amp;gt;&#039;Standby&#039;);; return {ChargeMode=&amp;gt;$h{$EVENT}}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unnötige Konfigurationsinformationen verwerfen ===&lt;br /&gt;
Siehe Einleitung und den [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp-Abschnitt zu MQTT2_CLIENT]].&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Themen ===&lt;br /&gt;
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====&lt;br /&gt;
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeugen kann. So kann man z.B. Messdaten eines Systems über ein &#039;&#039;notify&#039;&#039; iVm. einer einfachen &#039;&#039;publish&#039;&#039;-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.&lt;br /&gt;
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten &#039;&#039;bridgeRegexp&#039;&#039; automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:&lt;br /&gt;
 attr MQTT2_myMqttServer bridgeRegexp \&lt;br /&gt;
   SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* &amp;quot;mgb2_$1&amp;quot;&lt;br /&gt;
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema &#039;&#039;SmartHome/MqttGenericBridge2/&amp;lt;Device-Name&amp;gt;/&amp;lt;Reading-Name&amp;gt;&#039;&#039; versendet.&lt;br /&gt;
&lt;br /&gt;
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====&lt;br /&gt;
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in  {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}&lt;br /&gt;
&lt;br /&gt;
näher erläutert.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}&lt;br /&gt;
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}&lt;br /&gt;
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}&lt;br /&gt;
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}&lt;br /&gt;
* {{Link2Forum|Topic=116162|LinkText=Der MQTT-Workshop für MQTT2-Module}}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Blocking_Call&amp;diff=37502</id>
		<title>Blocking Call</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Blocking_Call&amp;diff=37502"/>
		<updated>2022-07-18T08:29:52Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel soll Hinweise und Best Practices im Umgang mit dem Modul Blocking.pm und den daraus bereitgestellten Funktionen bieten.&lt;br /&gt;
&lt;br /&gt;
= Allgemein =&lt;br /&gt;
&lt;br /&gt;
Das Modul Blocking.pm wurde von Rudolf König entwickelt, um in FHEM Funktionsaufrufe zu ermöglichen, die relativ viel Zeit in Anspruch nehmen und normalerweise FHEM damit zum Stillstand (für die Dauer der Ausführung der Funktion) bringen würde. &lt;br /&gt;
&lt;br /&gt;
Um so etwas zu verhindern, kann man mit Hilfe von Blocking.pm eine Funktion über einen Fork des Hauptprozesses unabhängig davon abarbeiten und das Ergebnis dieser Funktion optional an den Hauptprozess übergeben.&lt;br /&gt;
&lt;br /&gt;
= Benutzung =&lt;br /&gt;
&lt;br /&gt;
Das Modul stellt primär die Funktion BlockingCall() zur Verfügung um eine Perl-Funktion &amp;quot;non-blocking&amp;quot; auszuführen. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlockingCall($blockingFn, $arg, $finishFn, $timeout, $abortFn, $abortArg);&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument !! Optional !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$blockingFn&amp;lt;/code&amp;gt;&#039;&#039;&#039; || nein || &amp;quot;speedtest_DoSpeedtest&amp;quot; || Der Name der Perlfunktion, die &amp;quot;non-blocking&amp;quot; ausgeführt werden soll (ohne Klammern, nur der reine Funktionsname).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt;&#039;&#039;&#039; || nein || &amp;lt;nowiki&amp;gt;&amp;quot;DeviceName|Argument1|Argument2&amp;quot;&amp;lt;/nowiki&amp;gt; || Das Funktionsargument, das der blockingFn übergeben werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$finishFn&amp;lt;/code&amp;gt;&#039;&#039;&#039; || ja || &amp;quot;speedtest_SpeedtestDone&amp;quot; || Die Funktion, die mit dem Funktionsergebnis der blockingFn als Parameter aufgerufen werden soll, sobald diese zuende ist. Diese Funktion wird dabei mit dem Returnwert als erstes Argument aufgerufen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$timeout&amp;lt;/code&amp;gt;&#039;&#039;&#039; || ja || 120 || Sofern eine finishFn verwendet wird, kann ein optionales Timeout gesetzt werden, sobald der Aufruf abgebrochen wird, sobald dieser timeout in Sekunden verstrichen ist.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$abortFn&amp;lt;/code&amp;gt;&#039;&#039;&#039; || ja|| speedtest_SpeedtestAborted|| Wenn der Aufruf aufgrund eines überschrittenen Timeouts abgebrochen wird, so wird die abortFn aufgerufen, sofern eine definiert ist.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$abortArg&amp;lt;/code&amp;gt;&#039;&#039;&#039; || ja|| $hash || Im Falle eines Abruchs soll die abortFn mit diesem Argument aufgerufen werden. (Dient primär der Zuordnung eines solchen Abbruchs für Modulentwickler.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion BlockingCall() gibt bei Erfolg eine Hashreferenz mit mehreren Items zurück. Dieser Hash ist folgendermaßen aufgebaut.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash-&amp;gt;{pid}&amp;lt;/code&amp;gt;&#039;&#039;&#039; || → Die Prozess-Id, unter der dieser Aufruf abgearbeitet wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash-&amp;gt;{fn}&amp;lt;/code&amp;gt;&#039;&#039;&#039; || →  Der Name der blockigen, der mit diesem Aufruf abgearbeitet wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash-&amp;gt;{finishFn}&amp;lt;/code&amp;gt;&#039;&#039;&#039; || →  Der Name der finishFn, die diesen Aufruf nach Erfolg verarbeiten wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash-&amp;gt;{abortFn}&amp;lt;/code&amp;gt;&#039;&#039;&#039; || →  Der Name der abortFn, die im Fehlerfall aufgerufen wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash-&amp;gt;{abortArg}&amp;lt;/code&amp;gt;&#039;&#039;&#039; || →  Das Argument, das im Fehlerfall an die abortFn übergeben werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Einschränkungen =&lt;br /&gt;
&lt;br /&gt;
Aktuell sind beim Einsatz von Blocking.pm folgende Einschränkungen zu beachten.&lt;br /&gt;
&lt;br /&gt;
* Veränderungen an internen Variablen von FHEM (Device Hashes, Timers, usw.) werden innerhalb eines BlockingCalls durchgeführt und sind dort auch sichtbar, haben aber keinerlei Einfluss auf den eigentlichen FHEM Hauptprozess und alle Definitionen. Solche Veränderungen müssen an die finishFn delegiert werden (z.B. durch zusätzliche Rückgabewerte), da es sich um einen Fork-Prozess handelt, der sich nach Abschluss des BlockingCall selbst zerstört.&lt;br /&gt;
* Wenn viele Definitionen aktiv sind, welche BlockingCalls parallel starten kann es zu einem relativ hohen Memory-Footprint kommen aufgrund mehrfach laufenden Fork-Prozessen. Dies kann auf schwachbrüstiger Hardware zu Speicherengpässen führen. Ab FHEM Revision 11917 lassen sich die maximal parallel laufenden BlockingCalls durch das globale Attribut &amp;lt;code&amp;gt;blockingCallMax&amp;lt;/code&amp;gt; begrenzen (Standardwert: &#039;&#039;unbegrenzt&#039;&#039;). Sofern die maximale parallele Anzahl an BlockingCalls erreicht ist, werden weitere Calls in eine Warteschlange eingereiht und ausgeführt, sobald laufende Calls beendet werden.&lt;br /&gt;
&lt;br /&gt;
= Blocking.pm für Modulentwickler =&lt;br /&gt;
&lt;br /&gt;
Blocking.pm ist aktuell sowohl für Enduser, als auch für Modulentwickler gedacht. Die Benutzung in einem Modul birgt allerdings einige Stolperfallen, auf die hier näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== return-Wert von BlockingCall immer in $hash abspeichern ==&lt;br /&gt;
&lt;br /&gt;
Die Funktion BlockingCall() gibt als return-Wert einen Hash mit mehreren Informationen zurück. Dieser Ergebnis-Hash ist in mehrerer Hinsicht sehr wichtig für die Benutzung in einem Modul, dazu in den folgenden Punkten mehr.&lt;br /&gt;
&lt;br /&gt;
Eine gute Möglichkeit ist es dieses Ergebnis unterhalb von $hash-&amp;gt;{helper} zu platzieren. So sieht es der Enduser nicht, kann aber bei Bedarf via list-Befehl angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Beispiel:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 $hash-&amp;gt;{helper}{RUNNING_PID} = BlockingCall( &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;…&amp;lt;/font&amp;gt; );&lt;br /&gt;
&lt;br /&gt;
== Sicherstellen, dass immer nur ein BlockingCall gleichzeitig läuft ==&lt;br /&gt;
&lt;br /&gt;
Sobald ein BlockingCall läuft könnte man rein theoretisch direkt einen weiteren BlockingCall starten usw. Dadurch würden mehrer parallele Durchläufe nebenher laufen und könnten den FHEM-Server dadurch unnötig belasten oder sogar auch überlasten. Daher sollte man immer beim Start eines BlockingCall prüfen, ob bereits ein weiterer BlockingCall läuft oder bei mehreren parallelen Blocking Calls eine entsprechende Prüfung einführen um die maximale  Anzahl an gleichzeitigen BlockingCalls innerhalb einer Definition zu begrenzen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;$hash-&amp;gt;{helper}{RUNNING_PID} = BlockingCall(…)&amp;lt;/font&amp;gt; unless(exists($hash-&amp;gt;{helper}{RUNNING_PID}));&lt;br /&gt;
Dies funktioniert nur dann, wenn man in der finishFn (und später auch abortFn) $hash-&amp;gt;{helper}{RUNNING_PID} wieder löscht. Somit ist immer sichergestellt, dass nur ein BlockingCall zur gleichen Zeit läuft. Wenn gerade ein BlockingCall aktiv ist aufgrund eines Set-Befehls, könnte man eine Meldung ausgeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Beispiel:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 BlockingCall(&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&amp;quot;speedtest_DoSpeedtest&amp;quot;, $name.&amp;quot;|&amp;quot;.$server, &amp;lt;/font&amp;gt;&amp;quot;speedtest_SpeedtestDone&amp;quot;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;, 120, …&amp;lt;/font&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
 speedtest_SpeedtestDone($)&lt;br /&gt;
 {&lt;br /&gt;
  …&lt;br /&gt;
  delete($hash-&amp;gt;{helper}{RUNNING_PID});&lt;br /&gt;
  …&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Nutzung von abortFn und abortArg ==&lt;br /&gt;
&lt;br /&gt;
Mal angenommen man führt einen BlockingCall aus und dieser wird innerhalb des gesetzten Timeouts von 5 Sekunden nicht durchgeführt. Dann erhält man kein Ergebnis via der gesetzten finishFn. Das kann dazu führen, das ein InternalTimer nicht mehr neu gestartet werden kann, der zyklisch diesen BlockingCall ausführen soll um Daten zu ermitteln oder einen Status. &lt;br /&gt;
&lt;br /&gt;
Um einen solchen Abbruch aufgrund des erreichten Timeouts innerhalb eines Moduls zu erkennen, muss der BlockingCall mit einer abortFn und einem abortArg gestartet werden.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;abortFn&#039;&#039;&#039; - die Funktion die im Falle eines Abbruch des Aufrufs gestartet werden soll&lt;br /&gt;
* &#039;&#039;&#039;abortArg&#039;&#039;&#039; - das Argument mit der diese Funktion aufgerufen werden soll. Dies díent in einer Modulumgebung der Zuordnung des korrekten Devices bei mehreren Definitionen. Üblicherweise wird hierfür $hash verwendet.&lt;br /&gt;
&lt;br /&gt;
 BlockingCall(&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&amp;quot;speedtest_DoSpeedtest&amp;quot;, $name.&amp;quot;|&amp;quot;.$server,&amp;quot;speedtest_SpeedtestDone&amp;quot;, 120,&amp;lt;/font&amp;gt; &amp;quot;speedtest_SpeedtestAborted&amp;quot;, $hash);&lt;br /&gt;
&lt;br /&gt;
 sub&lt;br /&gt;
 speedtest_SpeedtestAborted($)&lt;br /&gt;
 {&lt;br /&gt;
   my ($hash) = @_;&lt;br /&gt;
 &lt;br /&gt;
   delete($hash-&amp;gt;{helper}{RUNNING_PID});&lt;br /&gt;
 &lt;br /&gt;
   Log3 $hash-&amp;gt;{NAME}, 3, &amp;quot;BlockingCall for &amp;quot;.$hash-&amp;gt;{NAME}.&amp;quot; was aborted&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   RemoveInternalTimer($hash);&lt;br /&gt;
   InternalTimer(&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;gettimeofday()+10, …&amp;lt;/font&amp;gt;) # falls mit disable-Attribut gearbeitet wird, muss dieses hier geprüft werden&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== BlockingCall muss als Argument eine Referenz auf das Ursprungs-Device enthalten ==&lt;br /&gt;
&lt;br /&gt;
Um später die Ergebnisse korrekt zuordnen zu können, ist es wichtig das korrekte Device zu kennen. Normalerweise wird in FHEM dazu der $hash-Zeiger verwendet um auf das entsprechende Device zu verweisen. Als Argumente für die BlockingFn können Hashes, Zeiger und sonstiges verwendet werden. Wichtig dabei ist, dass man aus den Argumenten irgendwie den Device-Namen ableiten kann, da man diesen später in der finishFn über die Variable $defs{…} wieder in die $hash-Referenz umwandeln kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Beispiel&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 BlockingCall(&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&amp;quot;speedtest_DoSpeedtest&amp;quot;,&amp;lt;/font&amp;gt; &amp;lt;b&amp;gt;$hash-&amp;gt;{NAME}&amp;lt;/b&amp;gt;.&amp;quot;|&amp;quot;.$server&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;,…&amp;lt;/font&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
 sub&lt;br /&gt;
 speedtest_DoSpeedtest($)&lt;br /&gt;
 {&lt;br /&gt;
  my ($string) = @_;&lt;br /&gt;
  my ($name, $server) = split(&amp;quot;\\|&amp;quot;, $string);&lt;br /&gt;
 &lt;br /&gt;
  …&lt;br /&gt;
 &lt;br /&gt;
  return &amp;quot;&amp;lt;b&amp;gt;$name&amp;lt;/b&amp;gt;|$speedarr[0]|$speedarr[1]|$speedarr[2]&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 sub&lt;br /&gt;
 speedtest_SpeedtestDone($)&lt;br /&gt;
 {&lt;br /&gt;
  my ($string) = @_;&lt;br /&gt;
 &lt;br /&gt;
  return unless(defined($string));&lt;br /&gt;
 &lt;br /&gt;
  my @a = split(&amp;quot;\\|&amp;quot;,$string);&lt;br /&gt;
  my &amp;lt;b&amp;gt;$hash&amp;lt;/b&amp;gt; = &amp;lt;b&amp;gt;$defs{$a[0]}&amp;lt;/b&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
  …&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Rückgabewerte des BlockingCalls nur als Einzeiler-String ==&lt;br /&gt;
&lt;br /&gt;
Bei Funktionen die mit BlockingCall aufgerufen werden muss der Rückgabewert entweder eine Zahl, oder ein einzeiliger String sein, da dieser über den Telnetprompt als Perl-Befehl ( &#039;&#039;{finishFn(&amp;quot;returnvalue&amp;quot;)}&#039;&#039; )  zurückgegeben wird. &lt;br /&gt;
&lt;br /&gt;
Wenn man mehrere separate Werte zurückgeben möchte, kann man diese entweder mit einem Trennzeichen (z.B. Pipe) versehen, oder bei einem Text mit Zeilenumbrüchen alles mit Base64 oder Hex encoden.&lt;br /&gt;
&lt;br /&gt;
So kann man z.B. den Rückgabestring &amp;quot;Wert1|Wert2|Wert3&amp;quot; verwenden und diesen anschließend mit split() wieder in ein Array verwandeln und dann via Index gezielt darauf zugreifen.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit auch kompliziertere Datenstrukturen zurückzugeben ist &amp;lt;code&amp;gt;JSON-&amp;gt;new-&amp;gt;encode()&amp;lt;/code&amp;gt; (Perl-Modul JSON) oder &amp;lt;code&amp;gt;toJSON&amp;lt;/code&amp;gt; (aus fhem.pl) zum serialisieren und &amp;lt;code&amp;gt;JSON-&amp;gt;new-&amp;gt;decode()&amp;lt;/code&amp;gt; zum deserialisieren zu verwenden. Achtung: Man kann hierfür zwar auch &amp;lt;code&amp;gt;encode_json&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;decode_json&amp;lt;/code&amp;gt; aus dem Perl-Modul JSON verwenden, sollte dabei aber beachten, dass hierdurch auch das encoding geändert wird! Außerdem führen unerwartete Rückgaben (mit Ausnahme von der Serialisierung durch &amp;lt;code&amp;gt;toJSON&amp;lt;/code&amp;gt;) ggf. dazu, dass FHEM komplett beendet wird; alle decoding- und encoding-Anweisungen aus dem JSON-Modul sollten daher unbedingt durch eine  (Block-) &amp;lt;code&amp;gt;eval&amp;lt;/code&amp;gt;-Anweisung geschützt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
my $decoded;&lt;br /&gt;
if ( !eval { $decoded  = JSON-&amp;gt;new-&amp;gt;decode($content) ; 1 } ) {&lt;br /&gt;
   Log3($hash-&amp;gt;{NAME}, 1, &amp;quot;JSON decoding error in BlockingCall return: $@&amp;quot;);&lt;br /&gt;
   #weiterer Code für Fehlerbehandlung...&lt;br /&gt;
   return;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rückgabewert muss unbedingt den Namen des Devices enthalten, von dem der Call gestartet wurde ==&lt;br /&gt;
&lt;br /&gt;
Um einen Rückgabewert dem korrekten Device zuordnen zu können muss im Rückgabewert der Funktion, die mit BlockingCall gestartet wird, der Device-Name enthalten sein, um damit die Referenz auf das richtige Device herstellen zu können.&lt;br /&gt;
&lt;br /&gt;
z.B. als Returnstring &amp;quot;Devicenamen|Readingwert1|Readingwert2|…&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Daher ist es wichtig, den Devicenamen beim Start des Blockingcalls zu übergeben.&lt;br /&gt;
&lt;br /&gt;
== Verwenden einer UndefFn und ShutdownFn um laufende BlockingCalls zu beenden ==&lt;br /&gt;
&lt;br /&gt;
Wenn gerade ein BlockingCall läuft und man will FHEM herunterfahren oder neustarten kann das problematisch werden, da ja immer noch Unterprozesse laufen und so einen kompletten Stop verhindern können.&lt;br /&gt;
&lt;br /&gt;
Daher muss in der [[DevelopmentModuleIntro#X_Undef|UndefFn]] und [[DevelopmentModuleIntro#X_Shutdown|ShutdownFn]] des Moduls sichergestellt werden, dass ein laufender BlockingCall beendet wird. Dazu wird als Argument der Return-Hash von BlockingCall benötigt in dem unter anderem die PID des Unterprozesses enthalten ist. Die Funktion BlockingKill() erledigt dann den Rest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Beispiel&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 sub&lt;br /&gt;
 speedtest_Undefine($$)&lt;br /&gt;
 {&lt;br /&gt;
  my ($hash, $arg) = @_;&lt;br /&gt;
 &lt;br /&gt;
  RemoveInternalTimer($hash);&lt;br /&gt;
 &lt;br /&gt;
  BlockingKill($hash-&amp;gt;{helper}{RUNNING_PID}) if(defined($hash-&amp;gt;{helper}{RUNNING_PID}));&lt;br /&gt;
 &lt;br /&gt;
  return undef;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Anzeige der laufenden Blocking Calls =&lt;br /&gt;
&lt;br /&gt;
Mit dem FHEM-Befehl &amp;lt;code&amp;gt;blockinginfo&amp;lt;/code&amp;gt; lassen sich die laufenden [[Blocking Call|Blocking Calls]] anzeigen.&lt;br /&gt;
&lt;br /&gt;
= Begrenzen der Blocking Calls =&lt;br /&gt;
&lt;br /&gt;
Mit dem globalen [[Attribute|Attribut]] &amp;lt;code&amp;gt;blockingCallMax&amp;lt;/code&amp;gt; können die gleichzeitig laufenden [[Blocking Call|Blocking Calls]] begrenzt werden.&lt;br /&gt;
&lt;br /&gt;
= Module, die Blocking.pm verwenden =&lt;br /&gt;
&lt;br /&gt;
Folgende Module verwenden aktuell Blocking.pm um langwierige Funktionalitäten auszulagern:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;10_pilight_ctrl.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;23_KOSTALPIKO.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;23_LUXTRONIK2.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;38_JawboneUp.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;42_SYSMON.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;55_GDS.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;59_OPENWEATHER.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;59_PROPLANTA.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;70_EFR.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;70_JSONMETER.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;70_Jabber.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;70_SML.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;72_FRITZBOX.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;73_MPD.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;73_PRESENCE.pm&#039;&#039;&#039; (siehe dazu [[Anwesenheitserkennung]])&lt;br /&gt;
* &#039;&#039;&#039;76_SMAInverter.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;93_DbLog.pm&#039;&#039;&#039;    (nicht alle Funktionen)&lt;br /&gt;
* &#039;&#039;&#039;93_DbRep.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;98_HMinfo.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;98_Text2Speech.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;98_UbiquitiMP.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;98_WOL.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;98_update.pm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Blocking_Call&amp;diff=37501</id>
		<title>Blocking Call</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Blocking_Call&amp;diff=37501"/>
		<updated>2022-07-18T08:29:03Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: encode_json/decode_json durch JSON-&amp;gt;new-&amp;gt; Methoden ergänzt; Forum #126088&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel soll Hinweise und Best Practices im Umgang mit dem Modul Blocking.pm und den daraus bereitgestellten Funktionen bieten.&lt;br /&gt;
&lt;br /&gt;
= Allgemein =&lt;br /&gt;
&lt;br /&gt;
Das Modul Blocking.pm wurde von Rudolf König entwickelt, um in FHEM Funktionsaufrufe zu ermöglichen, die relativ viel Zeit in Anspruch nehmen und normalerweise FHEM damit zum Stillstand (für die Dauer der Ausführung der Funktion) bringen würde. &lt;br /&gt;
&lt;br /&gt;
Um so etwas zu verhindern, kann man mit Hilfe von Blocking.pm eine Funktion über einen Fork des Hauptprozesses unabhängig davon abarbeiten und das Ergebnis dieser Funktion optional an den Hauptprozess übergeben.&lt;br /&gt;
&lt;br /&gt;
= Benutzung =&lt;br /&gt;
&lt;br /&gt;
Das Modul stellt primär die Funktion BlockingCall() zur Verfügung um eine Perl-Funktion &amp;quot;non-blocking&amp;quot; auszuführen. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BlockingCall($blockingFn, $arg, $finishFn, $timeout, $abortFn, $abortArg);&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument !! Optional !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$blockingFn&amp;lt;/code&amp;gt;&#039;&#039;&#039; || nein || &amp;quot;speedtest_DoSpeedtest&amp;quot; || Der Name der Perlfunktion, die &amp;quot;non-blocking&amp;quot; ausgeführt werden soll (ohne Klammern, nur der reine Funktionsname).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt;&#039;&#039;&#039; || nein || &amp;lt;nowiki&amp;gt;&amp;quot;DeviceName|Argument1|Argument2&amp;quot;&amp;lt;/nowiki&amp;gt; || Das Funktionsargument, das der blockingFn übergeben werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$finishFn&amp;lt;/code&amp;gt;&#039;&#039;&#039; || ja || &amp;quot;speedtest_SpeedtestDone&amp;quot; || Die Funktion, die mit dem Funktionsergebnis der blockingFn als Parameter aufgerufen werden soll, sobald diese zuende ist. Diese Funktion wird dabei mit dem Returnwert als erstes Argument aufgerufen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$timeout&amp;lt;/code&amp;gt;&#039;&#039;&#039; || ja || 120 || Sofern eine finishFn verwendet wird, kann ein optionales Timeout gesetzt werden, sobald der Aufruf abgebrochen wird, sobald dieser timeout in Sekunden verstrichen ist.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$abortFn&amp;lt;/code&amp;gt;&#039;&#039;&#039; || ja|| speedtest_SpeedtestAborted|| Wenn der Aufruf aufgrund eines überschrittenen Timeouts abgebrochen wird, so wird die abortFn aufgerufen, sofern eine definiert ist.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$abortArg&amp;lt;/code&amp;gt;&#039;&#039;&#039; || ja|| $hash || Im Falle eines Abruchs soll die abortFn mit diesem Argument aufgerufen werden. (Dient primär der Zuordnung eines solchen Abbruchs für Modulentwickler.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Funktion BlockingCall() gibt bei Erfolg eine Hashreferenz mit mehreren Items zurück. Dieser Hash ist folgendermaßen aufgebaut.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash-&amp;gt;{pid}&amp;lt;/code&amp;gt;&#039;&#039;&#039; || → Die Prozess-Id, unter der dieser Aufruf abgearbeitet wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash-&amp;gt;{fn}&amp;lt;/code&amp;gt;&#039;&#039;&#039; || →  Der Name der blockigen, der mit diesem Aufruf abgearbeitet wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash-&amp;gt;{finishFn}&amp;lt;/code&amp;gt;&#039;&#039;&#039; || →  Der Name der finishFn, die diesen Aufruf nach Erfolg verarbeiten wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash-&amp;gt;{abortFn}&amp;lt;/code&amp;gt;&#039;&#039;&#039; || →  Der Name der abortFn, die im Fehlerfall aufgerufen wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash-&amp;gt;{abortArg}&amp;lt;/code&amp;gt;&#039;&#039;&#039; || →  Das Argument, das im Fehlerfall an die abortFn übergeben werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Einschränkungen =&lt;br /&gt;
&lt;br /&gt;
Aktuell sind beim Einsatz von Blocking.pm folgende Einschränkungen zu beachten.&lt;br /&gt;
&lt;br /&gt;
* Veränderungen an internen Variablen von FHEM (Device Hashes, Timers, usw.) werden innerhalb eines BlockingCalls durchgeführt und sind dort auch sichtbar, haben aber keinerlei Einfluss auf den eigentlichen FHEM Hauptprozess und alle Definitionen. Solche Veränderungen müssen an die finishFn delegiert werden (z.B. durch zusätzliche Rückgabewerte), da es sich um einen Fork-Prozess handelt, der sich nach Abschluss des BlockingCall selbst zerstört.&lt;br /&gt;
* Wenn viele Definitionen aktiv sind, welche BlockingCalls parallel starten kann es zu einem relativ hohen Memory-Footprint kommen aufgrund mehrfach laufenden Fork-Prozessen. Dies kann auf schwachbrüstiger Hardware zu Speicherengpässen führen. Ab FHEM Revision 11917 lassen sich die maximal parallel laufenden BlockingCalls durch das globale Attribut &amp;lt;code&amp;gt;blockingCallMax&amp;lt;/code&amp;gt; begrenzen (Standardwert: &#039;&#039;unbegrenzt&#039;&#039;). Sofern die maximale parallele Anzahl an BlockingCalls erreicht ist, werden weitere Calls in eine Warteschlange eingereiht und ausgeführt, sobald laufende Calls beendet werden.&lt;br /&gt;
&lt;br /&gt;
= Blocking.pm für Modulentwickler =&lt;br /&gt;
&lt;br /&gt;
Blocking.pm ist aktuell sowohl für Enduser, als auch für Modulentwickler gedacht. Die Benutzung in einem Modul birgt allerdings einige Stolperfallen, auf die hier näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== return-Wert von BlockingCall immer in $hash abspeichern ==&lt;br /&gt;
&lt;br /&gt;
Die Funktion BlockingCall() gibt als return-Wert einen Hash mit mehreren Informationen zurück. Dieser Ergebnis-Hash ist in mehrerer Hinsicht sehr wichtig für die Benutzung in einem Modul, dazu in den folgenden Punkten mehr.&lt;br /&gt;
&lt;br /&gt;
Eine gute Möglichkeit ist es dieses Ergebnis unterhalb von $hash-&amp;gt;{helper} zu platzieren. So sieht es der Enduser nicht, kann aber bei Bedarf via list-Befehl angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Beispiel:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 $hash-&amp;gt;{helper}{RUNNING_PID} = BlockingCall( &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;…&amp;lt;/font&amp;gt; );&lt;br /&gt;
&lt;br /&gt;
== Sicherstellen, dass immer nur ein BlockingCall gleichzeitig läuft ==&lt;br /&gt;
&lt;br /&gt;
Sobald ein BlockingCall läuft könnte man rein theoretisch direkt einen weiteren BlockingCall starten usw. Dadurch würden mehrer parallele Durchläufe nebenher laufen und könnten den FHEM-Server dadurch unnötig belasten oder sogar auch überlasten. Daher sollte man immer beim Start eines BlockingCall prüfen, ob bereits ein weiterer BlockingCall läuft oder bei mehreren parallelen Blocking Calls eine entsprechende Prüfung einführen um die maximale  Anzahl an gleichzeitigen BlockingCalls innerhalb einer Definition zu begrenzen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;$hash-&amp;gt;{helper}{RUNNING_PID} = BlockingCall(…)&amp;lt;/font&amp;gt; unless(exists($hash-&amp;gt;{helper}{RUNNING_PID}));&lt;br /&gt;
Dies funktioniert nur dann, wenn man in der finishFn (und später auch abortFn) $hash-&amp;gt;{helper}{RUNNING_PID} wieder löscht. Somit ist immer sichergestellt, dass nur ein BlockingCall zur gleichen Zeit läuft. Wenn gerade ein BlockingCall aktiv ist aufgrund eines Set-Befehls, könnte man eine Meldung ausgeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Beispiel:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 BlockingCall(&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&amp;quot;speedtest_DoSpeedtest&amp;quot;, $name.&amp;quot;|&amp;quot;.$server, &amp;lt;/font&amp;gt;&amp;quot;speedtest_SpeedtestDone&amp;quot;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;, 120, …&amp;lt;/font&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
 speedtest_SpeedtestDone($)&lt;br /&gt;
 {&lt;br /&gt;
  …&lt;br /&gt;
  delete($hash-&amp;gt;{helper}{RUNNING_PID});&lt;br /&gt;
  …&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Nutzung von abortFn und abortArg ==&lt;br /&gt;
&lt;br /&gt;
Mal angenommen man führt einen BlockingCall aus und dieser wird innerhalb des gesetzten Timeouts von 5 Sekunden nicht durchgeführt. Dann erhält man kein Ergebnis via der gesetzten finishFn. Das kann dazu führen, das ein InternalTimer nicht mehr neu gestartet werden kann, der zyklisch diesen BlockingCall ausführen soll um Daten zu ermitteln oder einen Status. &lt;br /&gt;
&lt;br /&gt;
Um einen solchen Abbruch aufgrund des erreichten Timeouts innerhalb eines Moduls zu erkennen, muss der BlockingCall mit einer abortFn und einem abortArg gestartet werden.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;abortFn&#039;&#039;&#039; - die Funktion die im Falle eines Abbruch des Aufrufs gestartet werden soll&lt;br /&gt;
* &#039;&#039;&#039;abortArg&#039;&#039;&#039; - das Argument mit der diese Funktion aufgerufen werden soll. Dies díent in einer Modulumgebung der Zuordnung des korrekten Devices bei mehreren Definitionen. Üblicherweise wird hierfür $hash verwendet.&lt;br /&gt;
&lt;br /&gt;
 BlockingCall(&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&amp;quot;speedtest_DoSpeedtest&amp;quot;, $name.&amp;quot;|&amp;quot;.$server,&amp;quot;speedtest_SpeedtestDone&amp;quot;, 120,&amp;lt;/font&amp;gt; &amp;quot;speedtest_SpeedtestAborted&amp;quot;, $hash);&lt;br /&gt;
&lt;br /&gt;
 sub&lt;br /&gt;
 speedtest_SpeedtestAborted($)&lt;br /&gt;
 {&lt;br /&gt;
   my ($hash) = @_;&lt;br /&gt;
 &lt;br /&gt;
   delete($hash-&amp;gt;{helper}{RUNNING_PID});&lt;br /&gt;
 &lt;br /&gt;
   Log3 $hash-&amp;gt;{NAME}, 3, &amp;quot;BlockingCall for &amp;quot;.$hash-&amp;gt;{NAME}.&amp;quot; was aborted&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   RemoveInternalTimer($hash);&lt;br /&gt;
   InternalTimer(&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;gettimeofday()+10, …&amp;lt;/font&amp;gt;) # falls mit disable-Attribut gearbeitet wird, muss dieses hier geprüft werden&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== BlockingCall muss als Argument eine Referenz auf das Ursprungs-Device enthalten ==&lt;br /&gt;
&lt;br /&gt;
Um später die Ergebnisse korrekt zuordnen zu können, ist es wichtig das korrekte Device zu kennen. Normalerweise wird in FHEM dazu der $hash-Zeiger verwendet um auf das entsprechende Device zu verweisen. Als Argumente für die BlockingFn können Hashes, Zeiger und sonstiges verwendet werden. Wichtig dabei ist, dass man aus den Argumenten irgendwie den Device-Namen ableiten kann, da man diesen später in der finishFn über die Variable $defs{…} wieder in die $hash-Referenz umwandeln kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Beispiel&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 BlockingCall(&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&amp;quot;speedtest_DoSpeedtest&amp;quot;,&amp;lt;/font&amp;gt; &amp;lt;b&amp;gt;$hash-&amp;gt;{NAME}&amp;lt;/b&amp;gt;.&amp;quot;|&amp;quot;.$server&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;,…&amp;lt;/font&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
 sub&lt;br /&gt;
 speedtest_DoSpeedtest($)&lt;br /&gt;
 {&lt;br /&gt;
  my ($string) = @_;&lt;br /&gt;
  my ($name, $server) = split(&amp;quot;\\|&amp;quot;, $string);&lt;br /&gt;
 &lt;br /&gt;
  …&lt;br /&gt;
 &lt;br /&gt;
  return &amp;quot;&amp;lt;b&amp;gt;$name&amp;lt;/b&amp;gt;|$speedarr[0]|$speedarr[1]|$speedarr[2]&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 sub&lt;br /&gt;
 speedtest_SpeedtestDone($)&lt;br /&gt;
 {&lt;br /&gt;
  my ($string) = @_;&lt;br /&gt;
 &lt;br /&gt;
  return unless(defined($string));&lt;br /&gt;
 &lt;br /&gt;
  my @a = split(&amp;quot;\\|&amp;quot;,$string);&lt;br /&gt;
  my &amp;lt;b&amp;gt;$hash&amp;lt;/b&amp;gt; = &amp;lt;b&amp;gt;$defs{$a[0]}&amp;lt;/b&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
  …&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Rückgabewerte des BlockingCalls nur als Einzeiler-String ==&lt;br /&gt;
&lt;br /&gt;
Bei Funktionen die mit BlockingCall aufgerufen werden muss der Rückgabewert entweder eine Zahl, oder ein einzeiliger String sein, da dieser über den Telnetprompt als Perl-Befehl ( &#039;&#039;{finishFn(&amp;quot;returnvalue&amp;quot;)}&#039;&#039; )  zurückgegeben wird. &lt;br /&gt;
&lt;br /&gt;
Wenn man mehrere separate Werte zurückgeben möchte, kann man diese entweder mit einem Trennzeichen (z.B. Pipe) versehen, oder bei einem Text mit Zeilenumbrüchen alles mit Base64 oder Hex encoden.&lt;br /&gt;
&lt;br /&gt;
So kann man z.B. den Rückgabestring &amp;quot;Wert1|Wert2|Wert3&amp;quot; verwenden und diesen anschließend mit split() wieder in ein Array verwandeln und dann via Index gezielt darauf zugreifen.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit auch kompliziertere Datenstrukturen zurückzugeben ist &amp;lt;code&amp;gt;JSON-&amp;gt;new-&amp;gt;encode()&amp;lt;/code&amp;gt; (Perl-Modul JSON) oder &amp;lt;code&amp;gt;toJSON&amp;lt;/code&amp;gt; (aus fhem.pl) zum serialisieren und &amp;lt;code&amp;gt;JSON-&amp;gt;new-&amp;gt;decode()&amp;lt;/code&amp;gt; zum deserialisieren zu verwenden. Achtung: Man kann hierfür zwar auch &amp;lt;code&amp;gt;encode_json&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;decode_json&amp;lt;/code&amp;gt; aus dem Perl-Modul JSON verwenden, sollte dabei aber beachten, dass hierdurch auch das encoding geändert wird! Außerdem führen unerwartete Rückgaben (mit Ausnahme von der Serialisierung durch &amp;lt;code&amp;gt;toJSON&amp;lt;/code&amp;gt;) ggf. dazu, dass FHEM komplett beendet wird; alle decoding- und encoding-Anweisungen aus dem JSON-Modul sollten daher unbedingt durch eine  (Block-) &amp;lt;code&amp;gt;eval&amp;lt;/code&amp;gt;-Anweisung geschützt werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
my $decoded;&lt;br /&gt;
if ( !eval { $decoded  = JSON-&amp;gt;new-&amp;gt;decode($content) ; 1 } ) {&lt;br /&gt;
   Log3($hash-&amp;gt;{NAME}, 1, &amp;quot;JSON decoding error in Blocking call return: $@&amp;quot;);&lt;br /&gt;
   #weiterer Code für Fehlerbehandlung...&lt;br /&gt;
   return;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rückgabewert muss unbedingt den Namen des Devices enthalten, von dem der Call gestartet wurde ==&lt;br /&gt;
&lt;br /&gt;
Um einen Rückgabewert dem korrekten Device zuordnen zu können muss im Rückgabewert der Funktion, die mit BlockingCall gestartet wird, der Device-Name enthalten sein, um damit die Referenz auf das richtige Device herstellen zu können.&lt;br /&gt;
&lt;br /&gt;
z.B. als Returnstring &amp;quot;Devicenamen|Readingwert1|Readingwert2|…&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Daher ist es wichtig, den Devicenamen beim Start des Blockingcalls zu übergeben.&lt;br /&gt;
&lt;br /&gt;
== Verwenden einer UndefFn und ShutdownFn um laufende BlockingCalls zu beenden ==&lt;br /&gt;
&lt;br /&gt;
Wenn gerade ein BlockingCall läuft und man will FHEM herunterfahren oder neustarten kann das problematisch werden, da ja immer noch Unterprozesse laufen und so einen kompletten Stop verhindern können.&lt;br /&gt;
&lt;br /&gt;
Daher muss in der [[DevelopmentModuleIntro#X_Undef|UndefFn]] und [[DevelopmentModuleIntro#X_Shutdown|ShutdownFn]] des Moduls sichergestellt werden, dass ein laufender BlockingCall beendet wird. Dazu wird als Argument der Return-Hash von BlockingCall benötigt in dem unter anderem die PID des Unterprozesses enthalten ist. Die Funktion BlockingKill() erledigt dann den Rest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Beispiel&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 sub&lt;br /&gt;
 speedtest_Undefine($$)&lt;br /&gt;
 {&lt;br /&gt;
  my ($hash, $arg) = @_;&lt;br /&gt;
 &lt;br /&gt;
  RemoveInternalTimer($hash);&lt;br /&gt;
 &lt;br /&gt;
  BlockingKill($hash-&amp;gt;{helper}{RUNNING_PID}) if(defined($hash-&amp;gt;{helper}{RUNNING_PID}));&lt;br /&gt;
 &lt;br /&gt;
  return undef;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Anzeige der laufenden Blocking Calls =&lt;br /&gt;
&lt;br /&gt;
Mit dem FHEM-Befehl &amp;lt;code&amp;gt;blockinginfo&amp;lt;/code&amp;gt; lassen sich die laufenden [[Blocking Call|Blocking Calls]] anzeigen.&lt;br /&gt;
&lt;br /&gt;
= Begrenzen der Blocking Calls =&lt;br /&gt;
&lt;br /&gt;
Mit dem globalen [[Attribute|Attribut]] &amp;lt;code&amp;gt;blockingCallMax&amp;lt;/code&amp;gt; können die gleichzeitig laufenden [[Blocking Call|Blocking Calls]] begrenzt werden.&lt;br /&gt;
&lt;br /&gt;
= Module, die Blocking.pm verwenden =&lt;br /&gt;
&lt;br /&gt;
Folgende Module verwenden aktuell Blocking.pm um langwierige Funktionalitäten auszulagern:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;10_pilight_ctrl.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;23_KOSTALPIKO.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;23_LUXTRONIK2.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;38_JawboneUp.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;42_SYSMON.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;55_GDS.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;59_OPENWEATHER.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;59_PROPLANTA.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;70_EFR.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;70_JSONMETER.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;70_Jabber.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;70_SML.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;72_FRITZBOX.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;73_MPD.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;73_PRESENCE.pm&#039;&#039;&#039; (siehe dazu [[Anwesenheitserkennung]])&lt;br /&gt;
* &#039;&#039;&#039;76_SMAInverter.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;93_DbLog.pm&#039;&#039;&#039;    (nicht alle Funktionen)&lt;br /&gt;
* &#039;&#039;&#039;93_DbRep.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;98_HMinfo.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;98_Text2Speech.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;98_UbiquitiMP.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;98_WOL.pm&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;98_update.pm&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Msg&amp;diff=37496</id>
		<title>Msg</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Msg&amp;diff=37496"/>
		<updated>2022-07-13T12:52:01Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Formatierung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:msg}}{{Infobox Modul&lt;br /&gt;
|ModPurpose=Versenden von Nachrichten der Typen Audio, Text, Mail, Push, Light, Screen&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModFTopic=39983&lt;br /&gt;
|ModCmdRef=MSG&lt;br /&gt;
|ModTechName=75_MSG.pm&lt;br /&gt;
|ModOwner={{Link2FU|1363|Loredo}}&lt;br /&gt;
}}&lt;br /&gt;
Der FHEM-Befehl [[msg]] kann dazu benutzt werden, Benachrichtigungen auszugeben.&lt;br /&gt;
&lt;br /&gt;
Der Befehl unterstützt die Nachrichtentypen&lt;br /&gt;
* text: Textnachrichten per Push- oder E-Mail-Dienst auf mobile Geräte verschicken&lt;br /&gt;
* audio: Sprachnachrichten und akustische Signale über Lautsprecher in der Wohnung ausgeben&lt;br /&gt;
* light: optische Signale durch Lampen in der Wohnung anzeigen&lt;br /&gt;
* screen: Nachrichten auf einem Bildschirm, etwa einem Fernsehgerät in der Wohnung, anzeigen&lt;br /&gt;
und kann an ein FHEM Gerät oder an eine eMail Adresse geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Details zu den Funktionen und zur Benutzung dieses Befehls finden sich im ersten Beitrag {{Link2Forum|Topic=39983|LinkText=dieser Diskussion}} im Forum.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &#039;&#039;&#039;msg&#039;&#039;&#039; ersetzt ausserdem das vormals verfügbare Modul &#039;&#039;&#039;MSG&#039;&#039;&#039;. Benutzer des alten Moduls müssen ihre Devices auf &#039;&#039;&#039;MSGFile&#039;&#039;&#039; und/oder &#039;&#039;&#039;MSGMail&#039;&#039;&#039; umstellen; bitte dafür das Forenthema {{Link2Forum|Topic=43447|LinkText=&amp;quot;Benutzer von 75_MSG.pm: Aktion notwendig vor Update ab dem 04.11.2015&amp;quot;}} beachten!&lt;br /&gt;
&lt;br /&gt;
===Vorteil===&lt;br /&gt;
Der Hauptvorteil ist, dass man hier an zentraler Stelle definiert, wie Nachrichten verteilt und zugestellt werden sollen und sich später auch jederzeit zentral anpassen lasst.&lt;br /&gt;
Dazu muss man dann nicht mehr jedes einzelne Notify, DOIF oder was auch immer anpassen (beispielsweise weil sich der Empfänger geändert hat oder man nun statt dem einen FHEM Modul ein anderes Modul für die Zustellung der Nachricht verwenden möchte).&lt;br /&gt;
&lt;br /&gt;
Gesteuert wird das ganze über das setzen von Attributen. Zum einen am Device &amp;quot;globalMsg&amp;quot; für die Anpassung des Routing Verhaltens sowie einiger Attribute an einem beliebigen FHEM Device, welches die Adressierung des Bewohners oder der Bewohnergruppe ermöglicht. (Für die Profis: Alle globalen Attribute kann man auch per userattr an jedes beliebige Device hinzufügen; es erhält dort dann Vorrang).&lt;br /&gt;
&lt;br /&gt;
Es können auch globale Empfänger konfiguriert werden, dann wird die Angabe eines Empfängers bei den neuen Kommandos optional und sollte einmal ein Empfänger angegeben werden, der keine Kontaktmöglichkeit für Text, Audio oder Visual hinterlegt hat, gibt es einen Fallback auf die globalen Einstellungen (also quasi eine Art Catch-All). Im Falle eines Fallbacks gibt es einen entsprechenden Logeintrag und eine Textnachricht wird entsprechend mit einem Hinweis ergänzt.&lt;br /&gt;
&lt;br /&gt;
===Übertragungsmethoden===&lt;br /&gt;
====text====&lt;br /&gt;
Sendet eine Textnachricht per Push oder E-Mail. Je nach Priorität wird gepusht, gemailt oder beides. E-Mails werden mit der entsprechenden Priorität im Header markiert (dafür sind bei High und Low Prio HTML Mails zwingend erforderlich. Normale Mails werden als Nur-Text gesendet).&lt;br /&gt;
&lt;br /&gt;
Die Befehle, wie gepusht oder gemailt werden soll, können über Attribute am Device &amp;quot;globalMsg&amp;quot; für die Prioritäts-Kategorien &amp;quot;High&amp;quot;, &amp;quot;Normal&amp;quot; und &amp;quot;Low&amp;quot; angepasst werden. Standardmäßig wird für Push das Pushover Modul sowie für E-Mail system() per /usr/bin/mail verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Sub-Typen &amp;quot;mail&amp;quot; und &amp;quot;push&amp;quot; können auch explizit für sich aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
====audio====&lt;br /&gt;
Gibt die Nachricht zunächst als Sprachnachricht weiter. Je nach Priorität wird die Nachricht auch per Text weitergeleitet. Auch kann optional die Anwesenheit des Bewohners berücksichtigt werden (follow me) und die Nachricht wird dann auch als Text weitergeleitet.&lt;br /&gt;
Außerdem kann über einen Dummy-Switcher gesteuert werden, ob Audio Nachrichten komplett wiedergegeben werden sollen, nur in einer gekürzten Fassung oder gerade überhaupt nicht (Emergency-Prio Nachrichten werden trotzdem immer wiedergegeben). Ich nutze das beispielsweise dafür, dass ich den Switcher auf &amp;quot;short&amp;quot; setze, wenn meine Wohnungstür offen steht, damit meine Nachbarn nicht meine gesamten Audio Benachrichtigungen zu hören kriegen  ;) &lt;br /&gt;
&lt;br /&gt;
Die Befehle zur Audio Wiedergabe können über Attribute am Device &amp;quot;globalMsg&amp;quot; für die Kategorien &amp;quot;Long&amp;quot;, &amp;quot;Short with Priority&amp;quot; und &amp;quot;Short&amp;quot; angepasst werden. Der Nachrichtentitel wird hier als |Titel| mit übergeben.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung von SONOSPLAYER gilt: Ist eine entsprechende Audio-Datei hinterlegt, wird diese dann vor der Nachricht mit eingebunden (Details siehe SONOS Doku). Ich nutze das, um meinen Audio-Nachrichten verschiedene Varianten von einem Gong voran zu stellen (z.B. wie im Flugzeug), damit sich die Bewohner bei einer plötzlichen Ansage nicht so erschrecken  8)  Definiert man den Audio-Titel zentral über das Attribut msgTitleAudio, statt ihn in jedem msg-Kommando explizit anzugeben, kann man später auch zentral ändern, welche Sounddatei den Nachrichten vorangestellt werden soll und muss dann nicht überall Anpassungen vornehmen.&lt;br /&gt;
Weitere Audio-Dateien können natürlich wie in der SONOS Doku beschrieben in den Text über |Dateiname| aufgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====light====&lt;br /&gt;
Verwendet die Nachricht zunächst nur, um eine Leuchte anzusteuern (z.B. HUE). Je nach Priorität (hoch oder normal) kann die Leuchte anders geschaltet werden. Ist die Priorität hoch genug, wird die Nachricht zusätzlich auch per Audio wiedergegeben (dort greifen dann die Routing-Methoden für Audio). Auch hier kann optional die Anwesenheit des Bewohners berücksichtigt werden und die Nachricht alternativ als Text zugestellt werden, sofern die Priorität hoch genug ist.&lt;br /&gt;
&lt;br /&gt;
Die Befehle zur visuellen Wiedergabe können über Attribute am Device &amp;quot;globaMsgl&amp;quot; für die Kategorien &amp;quot;High&amp;quot; und &amp;quot;Normal&amp;quot; angepasst werden. Standardmäßig wird ein einfaches Kommando für HUE Geräte verwendet (select und lselect zum kurzen bzw. längeren blinken).&lt;br /&gt;
&lt;br /&gt;
====screen====&lt;br /&gt;
Ähnlich wie der Typ &amp;quot;light&amp;quot;. Standardmäßig wird ein Text an eine ENIGMA2 Box geschickt.&lt;br /&gt;
&lt;br /&gt;
===Verwendung===&lt;br /&gt;
&#039;&#039;&#039;Eine Liste der direkt unterstützten Module, ohne dass man diese händisch einbinden muss, kann man über den get-Befehl &amp;quot;routeCmd&amp;quot; beim Helfer-Device &amp;quot;globalMsg&amp;quot; (sofern es nicht umbenannt wurde) erhalten.&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Dort kann man auch sehen, mit welcher Syntax ein bestimmtes Modul angesprochen wird und das ggf. als Vorlage für eine eigene Definition per msgCmd-Attribut nehmen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Syntax ist sehr einfach gehalten:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;msg [&amp;lt;type&amp;gt;] [&amp;lt;@device|e-mail address&amp;gt;] [&amp;lt;priority&amp;gt;] [|&amp;lt;title&amp;gt;|] &amp;lt;message&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Type kann auch weggelassen werden und ist dann automatisch auf &amp;quot;text&amp;quot; gesetzt.&lt;br /&gt;
Wenn kein Device und keine E-Mail Adresse angegeben wurden, dann wird automatisch an das globale msgConfig Device (globalMsg) verschickt (ansonsten gibt es eine Fehlermeldung, wenn dort kein passendes msgContact-Attribut gefunden wurde).&lt;br /&gt;
&lt;br /&gt;
Auch können mehrere Typen oder Empfänger durch Komma getrennt angegeben werden (Und-Verknüpfung).&lt;br /&gt;
Eine Oder-Verknüpfung ist ebenso möglich und wird mit einer Pipe (|) zwischen Type und/oder Empfänger gemacht (Oder-Verknüpfung lässt sich auch mit Und-Verknüpfung kombinieren). Bei einer Oder-Verknüpfung wird nur zum nächsten Adressaten gesprungen, sofern für den vorigen keine der angegebenen Nachrichtentypen zugestellt werden konnte. Damit wird auch die automatische Eskalation zu einem anderen Nachrichten-Typ beeinflusst. Diese wird immer nur für den jeweils letzten Eintrag angewendet.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich sind alle Syntax-Angaben, die oben in eckigen Klammern (also []) stehen, optional. Es wird dann auf entsprechende Standardwerte zurückgegriffen, die entweder über Attribute am Device oder global gesetzt wurden. Ist auch global nichts vorhanden, wird auf interne Standardwerte zurückgegriffen (gilt natürlich nicht für ein Device, denn irgendwo muss man ja immer einen Empfänger angeben  ;) ).&lt;br /&gt;
&lt;br /&gt;
Der Wertebereich für Priorität orientiert sich dabei an der Pushover API mit -2 bis 2. Es kann jedoch grundsätzlich jeder beliebige Wert verwendet werden. Es ist dann Sache des FHEM Moduls, ob der Wertebereich richtig ist oder ob er dort automatisch begrenzt wird (sofern ein FHEM Modul von der Priorität Gebrauch macht, ansonsten wird sie in erster Linie für das Routing innnerhalb des msg-Befehls benutzt).&lt;br /&gt;
&lt;br /&gt;
Sowohl Und-Verknüpfung als auch Oder-Verknüpfung lassen sich ebenfalls in den Contact- und Recipient-Attributen anwenden. Somit bestehen eine Vielzahl von Möglichkeiten für die Adressierung von Empfängern und das Routing über bestimmte Nachrichtentypen.&lt;br /&gt;
&lt;br /&gt;
===Konfiguration===&lt;br /&gt;
&lt;br /&gt;
Sämtliche Einstellungen werden über Attribute vorgenommen. Dazu gibt es ein Konfigurationsdevice globalMsg in dem die Defaultwerte festgelegt werden. Alles andere passiert durch setzen von Attributen in den einzelnen Devices. Das Device globalMsg wird automatisch bei erster Verwendung von msg angelegt, sofern es nicht gefunden wurde.&lt;br /&gt;
Alternativ kann es mit &lt;br /&gt;
:&amp;lt;code&amp;gt;define globalMsg msgConfig &amp;lt;/code&amp;gt;&lt;br /&gt;
angelegt werden&lt;br /&gt;
&lt;br /&gt;
====Attribute für das Device &amp;quot;msgConfig&amp;quot;====&lt;br /&gt;
=====msgCmdAudio (Standard ohne Verwendung Attribut msgSwitcherDev)=====&lt;br /&gt;
Kommando für das &amp;quot;verschicken&amp;quot; von (langen) Audio Mitteilungen.&lt;br /&gt;
Entweder FHEM-Befehl oder in {} eingeschlossener Perl Befehl.&lt;br /&gt;
&lt;br /&gt;
Verfügbare Variablen:&lt;br /&gt;
*%DEVICE%&lt;br /&gt;
*%RECIPIENT% (abhängig davon, ob das Modul optional oder verpflichtend eine gesonderte Adressierung des Empfängers vorsieht)&lt;br /&gt;
*%TITLE%&lt;br /&gt;
*%MSG%&lt;br /&gt;
*%PRIORITY%&lt;br /&gt;
&lt;br /&gt;
=====msgCmdAudioShortPrio (nur in Verbindung mit msgSwitcherDev)=====&lt;br /&gt;
Kommando für das &amp;quot;verschicken&amp;quot; von Audio Mitteilungen mit Switcher Einstellung &amp;quot;short&amp;quot; und einer Prio höher/gleich msgFwPrioEmergencyAudio.&lt;br /&gt;
Entweder FHEM-Befehl oder in {} eingeschlossener Perl Befehl.&lt;br /&gt;
&lt;br /&gt;
Verfügbare Variablen:&lt;br /&gt;
*%DEVICE%&lt;br /&gt;
*%RECIPIENT% (abhängig davon, ob das Modul optional oder verpflichtend eine gesonderte Adressierung des Empfängers vorsieht)&lt;br /&gt;
*%TITLE%&lt;br /&gt;
*%MSG%&lt;br /&gt;
*%PRIORITY%&lt;br /&gt;
&lt;br /&gt;
=====msgCmdAudioShort (nur in Verbindung mit msgSwitcherDev)=====&lt;br /&gt;
Kommando für das &amp;quot;verschicken&amp;quot; von (gekürzten) Audio Mitteilungen mit Switcher Einstellung &amp;quot;short&amp;quot; unabhängig von der Priorität.&lt;br /&gt;
Entweder FHEM-Befehl oder in {} eingeschlossener Perl Befehl.&lt;br /&gt;
&lt;br /&gt;
Verfügbare Variablen:&lt;br /&gt;
*%DEVICE%&lt;br /&gt;
*%RECIPIENT% (abhängig davon, ob das Modul optional oder verpflichtend eine gesonderte Adressierung des Empfängers vorsieht)&lt;br /&gt;
*%TITLE%&lt;br /&gt;
*%MSG%&lt;br /&gt;
*%PRIORITY%&lt;br /&gt;
&lt;br /&gt;
=====msgCmd&amp;lt;TYPE&amp;gt;&amp;lt;PrioCat&amp;gt;=====&lt;br /&gt;
Kommando für den jeweilige Nachrichten-Typen und der entsprechenden Nachrichten-Prioritätskategorie&lt;br /&gt;
&lt;br /&gt;
=====msgFwPrioAbsent&amp;lt;TYPE&amp;gt;=====&lt;br /&gt;
Schwellenwert, ab dem Nachrichten diesen Typs bei kurzer Abwesenheit aller Bewohner per Text weitergeleitet werden sollen.&lt;br /&gt;
Voreinstellung: 0&lt;br /&gt;
&lt;br /&gt;
=====msgFwPrioEmergency&amp;lt;TYPE&amp;gt;=====&lt;br /&gt;
Schwellenwert, ab dem Nachrichten diesen Typs als Emergency Prio behandelt werden.&lt;br /&gt;
Diese Nachrichten werden immer wiedergegeben, unabhängig der Abwesenheit oder der Einstellung long/short am aSwitcherDev Dummy.&lt;br /&gt;
Voreinstellung: 2&lt;br /&gt;
&lt;br /&gt;
=====msgFwPrioGone&amp;lt;TYPE&amp;gt;=====&lt;br /&gt;
Schwellenwert, ab dem Nachrichten diesen Typs bei längerer Abwesenheit aller Bewohner per Text weitergeleitet werden sollen.&lt;br /&gt;
Voreinstellung: 1&lt;br /&gt;
&lt;br /&gt;
=====msgPriority&amp;lt;TYPE&amp;gt;=====&lt;br /&gt;
Standard Priorität für Nachrichten diesen Typs, sofern nicht in der Nachricht angegeben.&lt;br /&gt;
Voreinstellung: 0&lt;br /&gt;
&lt;br /&gt;
=====msgTitle&amp;lt;TYPE&amp;gt;&amp;lt;PrioCat&amp;gt;=====&lt;br /&gt;
Standard Betreff für Nachrichten diesen Typs, sofern in der Nachricht keiner angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
=====msgResidentsDev=====&lt;br /&gt;
FHEM Gerätename, welcher für die Anwesenheit aller Bewohner verwendet wird. Auf dieses Device wird zurückgegriffen, sofern für das Empfänger-Device die entsprechenden Readings nicht vorhanden sind.&lt;br /&gt;
Bei Verwendung von ROOMMATE, GUEST oder RESIDENTS Devices als Empfänger wird dieses Attribut ignoriert.&lt;br /&gt;
Das in diesem Attribut angegebene Device muss die Readings &amp;quot;presence&amp;quot; und &amp;quot;state&amp;quot; haben. Es wird die Verwendung eines Devices vom FHEM Typ RESIDENTS empfohlen.&lt;br /&gt;
Über &amp;quot;presence&amp;quot; wird generell An/Abwesenheit bewertet. Hat &amp;quot;state&amp;quot; den Wert &amp;quot;gone&amp;quot;, wird eine längere Abwesenheit angenommen.&lt;br /&gt;
Für das Weiterleiten von Nachrichten bei längerer Abwesenheit muss die Nachrichten Priorität höher sein, als wenn die Bewohner nur übergangsweise abwesend sind.&lt;br /&gt;
Siehe auch entsprechende Readings msgFwPrioGone&amp;lt;TYPE&amp;gt; msgFwPrioAbsent&amp;lt;TYPE&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Readings Wertebereich:&lt;br /&gt;
presence: present|absent&lt;br /&gt;
state: gone|*&lt;br /&gt;
&lt;br /&gt;
=====msgSwitcherDev=====&lt;br /&gt;
FHEM Gerätename, welcher für die Beeinflussung der Länge von Audio Nachrichten verwendet werden soll.&lt;br /&gt;
Bei &amp;quot;off&amp;quot; findet auch keine visuelle Benachrichtigung mehr statt. Screen Nachrichten sind nicht betroffen.&lt;br /&gt;
Hier bietet sich ein Dummy Device wie dieses hier an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define HouseAnn dummy&lt;br /&gt;
attr HouseAnn alias Announcements&lt;br /&gt;
attr HouseAnn devStateIcon aktiv:general_an@90EE90 active:general_an@90EE90 lang:general_an@green:off aus:general_aus@red:long kurz:general_an@orange:long visuell:general_an@orange:long&lt;br /&gt;
attr HouseAnn event-on-change-reading state&lt;br /&gt;
attr HouseAnn eventMap active:aktiv long:lang short:kurz visual:visuell off:aus&lt;br /&gt;
attr HouseAnn group Automation&lt;br /&gt;
attr HouseAnn icon audio_volume_mid&lt;br /&gt;
attr HouseAnn room Apartment&lt;br /&gt;
attr HouseAnn setList state:lang,kurz,visuell,aus&lt;br /&gt;
attr HouseAnn webCmd state&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Attribute für alle FHEM Devices====&lt;br /&gt;
*Für die Verwendung der Fallback und Catchall-Zustellung von Nachrichten können diese Attribute im Device &amp;quot;global&amp;quot; gesetzt werden.&lt;br /&gt;
* Nahezu alle globalen Attribute können auch auf ein Device angewendet werden (Ausnahme: msgResidentsDev). Sie tauchen allerdings dort aus Gründen der Übersicht nicht standardmäßig auf. Man muss sie deshalb zuvor als userattr (entweder beim Device oder eben global) hinzufügen, damit man sie setzen kann.&lt;br /&gt;
&lt;br /&gt;
=====msgContact&amp;lt;TYPE&amp;gt; (zwingend für Nachrichten diesen Typs)=====&lt;br /&gt;
FHEM Gerätename, welcher zur Übermittlung von Nachrichten diesen Typs angesprochen werden soll.&lt;br /&gt;
Muss bei Audio Nachrichten ohne eigene Definition von msgCmdAudio* ein Gerät vom Typ SONOSPLAYER sein.&lt;br /&gt;
Muss bei Screen Nachrichten ohne eigene Definition von msgCmdScreen* ein Gerät vom Typ ENIGMA2 sein.&lt;br /&gt;
Muss bei Light Nachrichten ohne eigene Definition von msgCmdLight* ein Gerät vom Typ HUEDevice sein.&lt;br /&gt;
Muss bei Push Nachrichten ohne eigene Definition von msgCmdPush* ein Gerät vom Typ Pushover sein.&lt;br /&gt;
Muss bei Mail Nachrichten eine oder mehrere gültige E-Mail Adressen enthalten.&lt;br /&gt;
Bei FHEM Gerätenamen, über die mehrere Empfänger adressiert werden können, kann der Empfänger mittels Doppelpunkt getrennt vom FHEM Gerätenamen angegeben werden. Je nach Modul ist das optional oder verbindlich.&lt;br /&gt;
&lt;br /&gt;
=====msgRecipient&amp;lt;TYPE&amp;gt;=====&lt;br /&gt;
Leitet Nachrichten, die an dieses Gerät adressiert werden, auf ein anderes FHEM Device um.&lt;br /&gt;
Es wird dann der Wert von msgContact&amp;lt;TYPE&amp;gt; des anderen Gerätes für die Übermittlung der Nachricht verwendet.&lt;br /&gt;
Bei Nutzung des Attributs mit Typangabe werden nur Nachrichten des entsprechenden Typs umgeleitet.&lt;br /&gt;
Kombination von msgRecipient mit msgRecipient&amp;lt;TYPE&amp;gt; führt dazu, dass msgRecipient&amp;lt;TYPE&amp;gt; bevorzugt wird.&lt;br /&gt;
&lt;br /&gt;
===Follow-Me Funktion===&lt;br /&gt;
Sobald ein Device, an welches man eine Nachricht schickt, ein Reading &amp;quot;location&amp;quot; beinhaltet, wird geprüft, ob es für diese Lokation eine speziell hinterlegte Kontaktmöglichkeit gibt (z.B. also eine genaue SONOS Soundbox in dem Raum, wo der Bewohner sich gerade befindet).&lt;br /&gt;
&lt;br /&gt;
Gebraucht wird hierfür ein iBeacon zusammen mit dem GEOFANCY Modul. ich empfehle außerdem den Einsatz des ROOMMATE Moduls dazu, weil es die Handhabung der Location gleich mitbringt (Einrichtung siehe Wiki). Man kann aber auch jede andere Möglichkeit der Raumortung nutzen, es muss nur in einem Reading namens &amp;quot;location&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
Über das Attribut &amp;quot;msgLocationDevs&amp;quot; können Devices mit Komma getrennt angegeben werden, welche dann für je einen Raum stehen und welche dann dort die msgContact* Attribute hinterlegt haben (Delegationen mittels msgRecipient* funktionieren dort auch).&lt;br /&gt;
Am einfachsten ist es also pro Raum ein Dummy-Device anzulegen und dieses dann unter dem globalen Attribut &amp;quot;msgLocationDevs&amp;quot; mit aufzuführen.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass dieses Dummy ein Attribut &amp;quot;msgLocationName&amp;quot; enthält, welches dann den exakt gleichen Wortlaut enthalten muss, wie auch im Reading &amp;quot;location&amp;quot; bei dem ROOMMATE Device (also genau der Lokationsname, den ihr z.B. in eurer Geofency.app angegeben habt). Zusätzlich dann eben noch die Type-Contacts. Hier ein Beispiel für Wohnzimmer und Schlafzimmer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;define msgRoom_Living dummy&lt;br /&gt;
attr msgRoom_Living msgContactAudio Sonos_Living_Room&lt;br /&gt;
attr msgRoom_Living msgContactLight LR_Ceilling,LR_FloorLamp,LR_SofaCorner,LR_DinnerCorner&lt;br /&gt;
attr msgRoom_Living msgLocationName Living&lt;br /&gt;
attr msgRoom_Living userattr msgLocationName&lt;br /&gt;
&lt;br /&gt;
define msgRoom_Bedroom dummy&lt;br /&gt;
attr msgRoom_Bedroom msgContactAudio Sonos_Bedroom&lt;br /&gt;
attr msgRoom_Bedroom msgContactLight BR_FloorLamp&lt;br /&gt;
attr msgRoom_Bedroom msgLocationName Bedroom&lt;br /&gt;
attr msgRoom_Bedroom userattr msgLocationName&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beide Devices sind als globales Attribut verlinkt:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;attr globalMsg msgLocationDevs msgRoom_Living,msgRoom_Bedroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn ich nun einen msg-Audio Befehl absetze während ich im Schlafzimmer oder Wohnzimmer bin (Reading ist gleich &amp;quot;Living&amp;quot; oder &amp;quot;Bedroom&amp;quot;), wird die Nachricht auf demjenigen Gerät abgespielt, welches ich für den Raum hinterlegt habe (gleiches gilt für Light-Nachrichten). Wechsle ich den Raum und führe den Befehl nochmal aus, folgt mir auch die Wiedergabe der Nachricht&lt;br /&gt;
&lt;br /&gt;
===Beispiele===&lt;br /&gt;
Bei der ersten Verwendung von msg wird das Konfigurationsdevice globalMsg angelegt. Es kann aber auch vorher manuell angelegt werden.&lt;br /&gt;
&lt;br /&gt;
====Pushover====&lt;br /&gt;
Um mit msg Pushovernachrichten zu versenden ist vorher die Konfiguration eines [[Pushover|Pushoverdevices]] notwendig. Dieses wird dann mit &lt;br /&gt;
:&amp;lt;code&amp;gt;attr globalMsg msgContactPush &amp;lt;Pushoverdevice&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
dem globalMsg als Standardpushoverdevice hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
anschließend kann der Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;msg test&amp;lt;/code&amp;gt;&lt;br /&gt;
verwendet werden. Folgendes passiert:&lt;br /&gt;
Das msg-Modul erkennt dass eine Nachricht verschickt werden soll. Da kein Übertragungsweg angegeben ist, wird der Standardweg genommen, nämlich text. Bei text wird eine Mail und ein Push verschickt. Da Mail nicht näher definiert ist, wird nur der Push genommen. Da bei Push kein expliziter Empfänger angegeben ist, wird der Empfänger aus dem Attribut von msgContactPush genommen.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch direkt ein Push an einen definiertes Pushoverdevice gesendet werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;msg push @&amp;lt;Pushoverdevice&amp;gt; 1 |FHEM| test&amp;lt;/code&amp;gt;&lt;br /&gt;
hier wird eine Pushnachricht ein ein definiertes Pushoverdivce mit der Priorität 1, dem Titel FHEM und der Nachricht test gesendet&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;mehreren&#039;&#039;&#039; Pushover Empfängern muss man nicht mehr für jeden Empfänger ein einzelnes Pushover-Device anlegen. Es genügt auch ein Gerät, man kann die Empfänger dann einfach als Sub-Empfänger ansprechen:&lt;br /&gt;
:&amp;lt;code&amp;gt;msg push @PushoverDevice:uQiRzpo4DXghDmr9QzzfQu27cmVRsG Dies ist eine Nachricht&amp;lt;/code&amp;gt;&lt;br /&gt;
Wie man sieht kann man einfach den User-Identifier (oder natürlich Group-Identifier) anhängen und adressiert somit einen alternativen Empfänger. Der im define des Device &amp;quot;PushoverDevice&amp;quot; angegebene User ist dann nur noch der Default-Empfänger.&lt;br /&gt;
Man kann auch an ein spezielles Endgerät adressieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;msg push @PushoverDevice:uQiRzpo4DXghDmr9QzzfQu27cmVRsG:iPhone Dies ist eine Nachricht, die nur an das iPhone geschickt wird.&amp;lt;/code&amp;gt;&lt;br /&gt;
Natürlich kann man das auch in ein msgContactPush Attribut schreiben...&lt;br /&gt;
:&amp;lt;code&amp;gt;attr myDevice msgContactPush PushoverDevice:uQiRzpo4DXghDmr9QzzfQu27cmVRsG&amp;lt;/code&amp;gt;&lt;br /&gt;
...und anschließend so wie gewohnt über die Device-Adressierung verschicken:&lt;br /&gt;
:&amp;lt;code&amp;gt;msg push @myDevice Nachrichtentext&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Telegram====&lt;br /&gt;
Der Versand von Nachrichten über Telegram kann anlog zu Pushover verwendet werden. Zunächst muss auch hier ein [[TelegramBot|Telegram-Device]] angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Anschließend kann dieses in globalMsg als Standardevice festgelgt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr globalMsg msgContactPush &amp;lt;Telegramdevice&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
anschließend kann der Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;msg test&amp;lt;/code&amp;gt;&lt;br /&gt;
verwendet werden. Folgendes passiert:&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch direkt ein Push an einen definiertes Telegramdevice gesendet werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;msg push @&amp;lt;Telegramdevice&amp;gt;  test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im vergleich zu Pushover werden Titel und Priorität ignoriert, da Telegram damit nicht umgehen kann.&lt;br /&gt;
&lt;br /&gt;
==== msg in Verbindung mit ROOMMATES====&lt;br /&gt;
Werden ROOMMates verwendet dann können jedem ROOMMATE Kontaktdevices hinzugefügt werden.&lt;br /&gt;
Analog zu diesem Beispiel kann msg nicht nur bei ROOMMATES sondern bei jedem beliebigen FHEM-Device angewendet werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;ROOMMATEDEVICE&amp;gt; msgContactPush &amp;lt;Pushdevice(s)&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
oder konkret:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr rr_Michael msgContactPush PushoverMichael&amp;lt;/code&amp;gt;&lt;br /&gt;
bzw. für Telegram:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr rr_Michael msgContactPush Telegram&amp;lt;/code&amp;gt;&lt;br /&gt;
bzw. für beide:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr rr_Michael msgContactPush Telegram,PushoverMichael&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann ich dann ganz einfach über &lt;br /&gt;
:&amp;lt;code&amp;gt; msg push @rr_Michael |FHEM| Dies ist eine Testnachricht für Michael!&amp;lt;/code&amp;gt;&lt;br /&gt;
Michael eine Pushnachricht über das in dem Attribut für ihn definierte Device schicken.&lt;br /&gt;
Sollte sich der ROOMMATE nun dazu entschließen Pushover nicht mehr zu verwenden, so muss nicht an jeder Stelle im Code wo ein Push abgesetzt wird das Device geändert werden, sondern nur an einer Zentralen Stellen, nämlich beim ROOMMATE durch ändern des Attributes.&lt;br /&gt;
&lt;br /&gt;
Falls es &#039;&#039;&#039;mehrere&#039;&#039;&#039; Roommates gibt, die (separat) mit Telegram angeschrieben werden sollen, sollte man für Telegram folgende Syntax für die Eintragung bei jedem Roommate verwenden:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr rr_KONTAKT msgContactPush &amp;lt;NAME-DES-TELEGRAMBOT&amp;gt;:@&amp;lt;ID-NR-DES-KONTAKT&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== msg in Verbindung mit RESIDENTS====&lt;br /&gt;
Möchte man dynamisch Nachrichten an z.B. alle Personen schicken, die gerade zuhause sind, dann kann man sich das RESIDENTS-Modul und die darin vorhandenen Readings zu nutze machen. Alle Anwesenden Personen stehen in dem Reading residentsHomeDevs bzw. residentsTotalRoommatesPresentDevs wenn man zwischen ROOMMATES und GUESTs unterscheidet. Hier sollte man immer das Dev-Reading nutzen, da dort das ROOMMATE-Device angesprochen wird und nicht ggf. ein Alias.&lt;br /&gt;
Eine Nachricht an alle anwesenden Personen könnte als Beispielsweise so verschickt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;msg [msg-typ] @[r&amp;lt;resident-Device&amp;gt;:&amp;lt;Reading des Resident-Devices&amp;gt;] Du bist zuhause&amp;lt;/code&amp;gt;&lt;br /&gt;
oder konkret&lt;br /&gt;
:&amp;lt;code&amp;gt;msg push @[rgr_Bewohner:residentsHomeDevs] Du bist zuhause&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gilt die normale Syntax von MSG. Typ ist beispielsweise Optional und ein Titel kann auch mitgegeben werden.&lt;br /&gt;
Das Routing des MSG-Moduls Teil dann das Reading in die einzelnen Empfänger auf und schickt in diesem Fall eine Push-Nachricht an die entsprechenden Personen&lt;br /&gt;
&lt;br /&gt;
==== Lautstärkeanpassung bei Audionachrichten====&lt;br /&gt;
Um die Lautstärke einer Audioausgabe beim Absetzen des MSG-Befehls anzupassen (wenn diese von den Defaultwerten des msg-Schemas abweichen soll) kann am Ende der Nachricht ein JSON mit Variablen angehangen werden, welche vom Schema (siehe &amp;quot;get globalMsg routeCmd&amp;quot;) unterstützt wird oder welche du selbst in einem msgCmd* Attribut verwendest. Für eine Sonos-Nachricht sieht das dann z.B. so aus:&lt;br /&gt;
:&amp;lt;code&amp;gt; msg audio @Sonos_Bedroom |Hint| Gute Nacht! O[{&amp;quot;VOLUME&amp;quot;:&amp;quot;8&amp;quot;}] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis| Standardmäßig wird bei angegebenem Betreff nach einer Audiodatei mit dem Namen des Betreffs (hier: Hint.mp3) in der Sonosfreigabe (bsp.: SonosSpeak) gesucht und diese vor der Nachricht abgespielt. Ist die Datei nicht vorhanden, dann kommt es zu 2 Fehlermeldungen vom Sonos-Modul im Log. Die anschließende Sprachnachricht wird aber trotzdem abgespielt.}}&lt;br /&gt;
&lt;br /&gt;
====Jabber====&lt;br /&gt;
Der Versand der Nachrichten über Jabber ist ähnlich dem Versand über Telegram.&lt;br /&gt;
Natürlich muss auch hier zunächst das [[Jabber|Jabber-Device]] eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Im msgConfig ist folgendes Attribut zu ergänzen:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr globalMsg msgContactPush jabberdevice:jabberkontact&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Nachrichten zu versenden, reicht nun&lt;br /&gt;
:&amp;lt;code&amp;gt;msg test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sollen Nachrichten an eine Konferenz/an einem Raum gesendet werden, muss nur der Parameter &#039;&#039;Jabber_MTYPE=muc&#039;&#039; mit angegeben werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;msg Jabber_MTYPE=muc test&amp;lt;/code&amp;gt;&lt;br /&gt;
bzw. - sollte msgContactPush nicht definiert sein - ganz ausgeschrieben:&lt;br /&gt;
:&amp;lt;code&amp;gt;msg push Jabber_MTYPE=muc @JabberClient:raum@conference.jabber.xy Das ist eine Nachricht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist ein standardmäßiger Versand an einen Raum gewünscht, kann dieser Parameter auch im Device &#039;&#039;globalMsg&#039;&#039; als Attribut &#039;&#039;msgParamsPush&#039;&#039; hinterlegt werden&lt;br /&gt;
:&amp;lt;code&amp;gt;attr globalMsg msgParamsPush Jabber_MTYPE=muc&amp;lt;/code&amp;gt;&lt;br /&gt;
Danach reicht dann wieder das bekannte&lt;br /&gt;
:&amp;lt;code&amp;gt;msg test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis| Weitere Beispiele folgen.}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;br /&gt;
[[Kategorie:Telegram]]&lt;br /&gt;
[[Kategorie:Jabber]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=37495</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=37495"/>
		<updated>2022-07-12T13:40:36Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Maintainer update, Hinweis auf akutelleres Modul&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right&amp;quot;&amp;gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuern der einzelnen Multiroom-Systemkomponenten&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=OpenMultiroom&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=98_OpenMultiroom.pm&lt;br /&gt;
|ModOwner=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuern eines Snapcast-Servers&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=Snapcast&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=96_Snapcast.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends {{Link2Forum|Topic=18517|LinkText=MPD}} und {{Link2Forum|Topic=62389|LinkText=Snapcast}} sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Das Modul ist noch in der Entwicklung und bisher nur im {{Link2Forum|Topic=65785|LinkText=Forum}} bzw. auf dem [https://github.com/unimatrix27/fhemmodules/blob/master/98_OpenMultiroom.pm Github des ursprünglichen Autors] (beide veraltet) oder aktualisiert im {{Link2Forum|Topic=128206|LinkText=Forum}} verfügbar. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OpenMultiroom&#039;&#039;&#039; ist ein Steuerungsmodul sowie auch ein Gesamtkonzept zur Realisierung eines Multiroom-Audio-Systems unter Nutzung von ausschließlich frei verfügbarer Software und ohne Bezug auf die Hardware eines bestimmten Herstellers. Es ist so ausgelegt, dass es prinzipiell flexibel bezüglich der Auswahl der Backendsysteme ist. Zurzeit ist es für die Nutzung mit [https://www.musicpd.org/ MPD] bzw. [https://www.mopidy.com/ Mopidy] und [https://github.com/badaix/snapcast Snapcast] implementiert. Daher wird in diesem WIKI-Eintrag immer von diesen Systemen gesprochen. Einen grundsätzlichen Überblick über das Konzept bietet das Schaubild.&lt;br /&gt;
&lt;br /&gt;
== Grobe Übersicht des Funktionsumfangs der Gesamtlösung==&lt;br /&gt;
=== Features ===&lt;br /&gt;
* Integrierte Steuerung des Musikplayers über das [[MPD]]-Modul sowie des Multiroom-System {{Link2Forum|Topic=62389|LinkText=Snapcast}} in einem einzigen Modul&lt;br /&gt;
* Implementierung einer Schnittstelle gemäß [[DevelopmentGuidelinesAV]] als Basis für eine Visualisierung mit z.B. [[SmartVISU]] oder [[FHEM Tablet UI]]&lt;br /&gt;
* Synchrones Playback auf z.B. Raspberry Pi oder Android-Geräten (Snapcast-Feature)&lt;br /&gt;
* optionale Komprimierung der Soundübertragung als OGG oder FLAC (Snapcast-Feature)&lt;br /&gt;
* Möglichkeit der Bedienung völlig ohne Display über eine Fernbedienung und entsprechender Text2Speech Rückmeldung, insbesondere&lt;br /&gt;
** Durschalten von Playlisten mit entsprechenden Channel - Tasten unter Nutzung von raumspezifischen Filtern&lt;br /&gt;
** Forward und Rewind mit definierbaren Sprungweiten (implementiert direkt im [[MPD]]-Modul)&lt;br /&gt;
** Direktanwahl von Playlisten, Tracks oder Trackpositionen durch Zifferneingabe und anschließende Funktionstaste&lt;br /&gt;
** Abfrage von Statusinformationen durch Funktionstasten und Text2Speech Rückmeldungen&lt;br /&gt;
** Mithören in anderen Räumen und Übernahme des Playerzustandes anderer Räume durch Nutzung von Funktionstasten&lt;br /&gt;
** Einschlaftimer per Zifferneingabe oder per vordefinierten Zeitabständen, hierbei wird auch die Restlaufzeit des aktuellen Tracks angeboten.&lt;br /&gt;
* manuelles oder automatisches Speichern und Laden von Playlistbookmarks (implementiert direkt im [[MPD]]-Modul)&lt;br /&gt;
* Möglichkeit der Festlegung von tageszeit- und tagestypabhängigen Lautstärkebegrenzungen bis auf 0% z.B. für Kinderzimmer&lt;br /&gt;
* individuelles Verwalten von Playlisten für verschiedene Familienmitglieder&lt;br /&gt;
* Nutzung des Audiosystems für systemunabhängige FHEM-Announcements. Ein entsprechendes Announcement-Modul ist in Planung. Dabei können mehrere Räume gleichzeitig oder auch getrennt angesprochen werden&lt;br /&gt;
&lt;br /&gt;
=== Anwendungszweck und Kurzbeschreibung der Funktionsweise ===&lt;br /&gt;
Wie der Name des Systems vermuten lässt, ist die Lösung vor allem dann sinnvoll einzusetzen, wenn Audiodateien in mindestens 2 verschiedenen Räumen oder &amp;quot;Zonen&amp;quot; sowohl synchron als auch unabhängig abgespielt werden soll und wenn hierzu eine komfortable und integrierte Steuerung über FHEM verwendet werden soll. Mit Einschränkungen ist die Lösung auch dann sinnvoll, wenn es nur um das Abspielen in einem Raum geht. Hier kann dann z.B. die Steuerung über eine Fernbedienung mit Hilfe des &#039;&#039;&#039;OpenMultiroom&#039;&#039;&#039;-Moduls genutzt werden, die über eine reine Nutzung des MPD-Moduls hinausgeht. &lt;br /&gt;
&lt;br /&gt;
Für die Nutzung ist nicht zwingend ein zentraler Server notwendig. Diese Rolle kann auch von einem der Clients übernommen werden, z.B. einem Pi. Zur einfacheren Darstellung wird in diesem Eintrag jedoch immer von der Nutzung eines Servers ausgegangen, der nicht gleichzeitig auch Client ist. &lt;br /&gt;
&lt;br /&gt;
Das Abspielen von Audio funktioniert prinzipiell in 2 Stufen: &lt;br /&gt;
# Nutzung von MPD oder einem MPD-kompatiblen Player zum direkten Abspielen von Sounddateien. Pro existierendem Raum gibt es mindestens eine Instanz von MPD. Hier wird davon ausgegangen, dass es genau eine Instanz pro Raum gibt. Jeder Raum hat also &amp;quot;seinen&amp;quot; MPD. &lt;br /&gt;
# Nutzung von Snapcast zur Verteilung des von MPD abgespielten Sounds an den entsprechenden Raum. Snapcast übernimmt hierbei die zeitliche Synchronisation&lt;br /&gt;
&lt;br /&gt;
Durch das Modul &#039;&#039;&#039;OpenMultiroom&#039;&#039;&#039; steuert der Nutzer sowohl MPD als auch Snapcast. Für jeden Raum wird eine Instanz des Moduls definiert. &lt;br /&gt;
&lt;br /&gt;
=== Verwendete Komponenten ===&lt;br /&gt;
Folgende Komponenten kommen zum Einsatz:&lt;br /&gt;
&lt;br /&gt;
==== Server: ====&lt;br /&gt;
* MPD oder Mopidy oder ein anderer MPD-kompatibler Player. 1 Instanz pro Raum&lt;br /&gt;
* Snapserver&lt;br /&gt;
* mplayer (bei Nutzung von Text 2 Speech)&lt;br /&gt;
* Optional Pulseaudio (im System-Mode) bei Nutzung von Text 2 Speech oder erweiterten Konfigurationen. Hierbei wird Pulseaudio zwischen MPD und Snapcast geschaltet. &lt;br /&gt;
* Optional Anbindung an Subsonic oder Libresonic (hier zurzeit nicht beschrieben) zur Synchronisation von Playlisten uvm. &lt;br /&gt;
* FHEM: Modul 98_OpenMultiroom.pm&lt;br /&gt;
* FHEM: Modul 96_Snapcast.pm&lt;br /&gt;
* FHEM: Modul [[MPD|73_MPD.pm]]&lt;br /&gt;
* FHEM: Optional Modul 98_Text2Speech.pm&lt;br /&gt;
&lt;br /&gt;
==== Client: ====&lt;br /&gt;
* Linux: Alsa oder Pulseaudio zur Soundwiedergabe&lt;br /&gt;
* Linux: Snapclient&lt;br /&gt;
* Android: Nur der Android Snapclient&lt;br /&gt;
* Webbrowser zur Steuerung per Visualisierung&lt;br /&gt;
* ggf. Infrarot oder Funkfernbedienung. In diesem Artikel wird das Beispiel anhand der Nutzung von X10-Funkfernbedienungen gezeigt, diese gibt es sehr günstig in der Bucht o.ä.&lt;br /&gt;
* Vision: Nutzung von Tastern und Display am PI oder Nutzung eines Steuergerätes mit Tastern und Display auf Basis eines Arduino mit WLAN, z.B. im alten Gehäuse eines Küchenradios usw. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aufbau anhand einer vollständigen Beispielkonfiguration ==&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel soll beispielhaft eine vollständige Konfiguration gezeigt werden. Jeder Nutzer muss diese Konfiguration an seine eigenen Bedürfnisse anpassen. Es seien folgende Komponenten vorhanden:&lt;br /&gt;
&lt;br /&gt;
* Server mit Ubuntu 16.04, hier befindet sich eine MP3-Sammlung&lt;br /&gt;
* Kind1: Raspberry Pi Model 1 mit Raspbian&lt;br /&gt;
* Kind2: BananaPi mit Ubuntu, an diesem Pi ist auch ein X10 Empfänger angeschlossen, da er zentral im Haus positioniert ist&lt;br /&gt;
* Wohnzimmer: Raspberry Pi3 mit OSMC und KODI, wird primär zum Fernsehen verwendet&lt;br /&gt;
* Küche: Raspberry Pi Model 1 mit Raspbian&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Es ist möglich, mehrere Räume mit nur einem physikalischen Client zu bedienen. Hierbei werden auf einem Client mehrere Instanzen des Snapclients laufen gelassen. Der physikalische Client hat dann z.B. mehrere USB Soundkarten, dessen Audioausgänge in verschiedene Räume verkabelt sind. Dies wird hier zurzeit nicht näher beschrieben. &lt;br /&gt;
&lt;br /&gt;
=== Pulseaudio Konfiguration ===&lt;br /&gt;
Will man Pulseaudio verwenden, z.B. um Text2Speech Nachrichten in laufende Musik einzublenden, sollte dieses am besten zuerst konfiguriert werden. Pulseaudio muss hierzu im System-Mode laufen. Dies ist auf einem Headless-Server kein Problem. Bei Ubuntu 16.10 wird dies durch folgenden Inhalt in &#039;&#039;/etc/systemd/system/pulseaudio.service&#039;&#039; erreicht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=PA&lt;br /&gt;
After=network.target sound.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=/usr/bin/pulseaudio --system&lt;br /&gt;
&lt;br /&gt;
# allow MPD to use real-time priority 50&lt;br /&gt;
LimitRTPRIO=50&lt;br /&gt;
LimitRTTIME=infinity&lt;br /&gt;
&lt;br /&gt;
# disallow writing to /usr, /bin, /sbin, ...&lt;br /&gt;
ProtectSystem=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Weiterhin ist der Befehl&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo systemctl enable pulseaudio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
einzugeben, um Pulseaudio beim Systemstart automatisch zu starten.&lt;br /&gt;
&lt;br /&gt;
Ausgehend von der Standardkonfiguration werden nun in  &#039;&#039;/etc/pulse/system.pa&#039;&#039; die benötigten Module eingetragen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
load-module module-pipe-sink file=/tmp/wohn.fifo   sink_name=wohn&lt;br /&gt;
load-module module-pipe-sink file=/tmp/kind1.fifo   sink_name=kind1&lt;br /&gt;
load-module module-pipe-sink file=/tmp/kind2.fifo  sink_name=kind2&lt;br /&gt;
load-module module-pipe-sink file=/tmp/kueche.fifo sink_name=kueche&lt;br /&gt;
&lt;br /&gt;
load-module module-combine-sink slaves=kind1,kind2 sink_name=kinder&lt;br /&gt;
load-module module-combine-sink slaves=wohn,kueche sink_name=unten&lt;br /&gt;
load-module module-combine-sink slaves=wohn,kueche,kind1,kind2 sink_name=alle&lt;br /&gt;
&lt;br /&gt;
pactl load-module module-role-ducking trigger_roles=announcement ducking_roles=music&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Snapcast benötigt die Audioquelle in Form von FIFOs. Daher wird hier in den erstem 4 Zeilen je ein FIFO von Pulseaudio erzeugt. Der sink_name wird später bei der Konfiguration von MPD als Ausgang verwendet. In den 3 weiteren Zeilen werden noch 3 Sinks als Combine-Sinks erstellt. Diese erzeugen keine neuen FIFOs, sondern machen unter entsprechenden Sink-Namen eine vorgegebene Kombination von Räumen nach außen hin verfügbar. Der Sink &amp;quot;alle&amp;quot; kann also genutzt werden, um Audio auf allen 4 FIFOs gleichzeitig abzuspielen (und somit später potentiell in allen Räumen gleichzeitig). Dies kann für Announcements sinnvoll sein. Die Nutzung dieser Combine-Sinks ist optional. Ebenso optional ist das Laden des Ducking-Moduls am Ende. Das Ducking Modul führt dazu, dass Pulseaudio automatisch die Lautstärke der durch MPD abgespielten Tracks absenkt, wenn etwas über die Text2Speech-Module abgespielt wird. Ohne dies sind die Ausgaben speziell über die Google API unter Umständen nur schwer hörbar.&lt;br /&gt;
&lt;br /&gt;
=== Snapcast Konfiguration ===&lt;br /&gt;
[https://github.com/badaix/snapcast Snapcast] muss entsprechend der Angaben auf der Webseite installiert werden. Auf dem Server muss logischerweise die Serverkomponente und auf den Clients die Clientkomponente installiert werden. Bei Android-Clients wird die auf der Webseite zur Verfügung gestellt APK installiert. Snapcast befindet sich selbst noch in fortlaufender Entwicklung. Die hier vorgestellte Lösung ist mit [https://github.com/badaix/snapcast/tree/98be8a58d945f84af50e40ebcf8a774592dd6e7b dieser Version] kompatibel und getestet. &lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Servers beschränkt sich auf die Definition der Streams in &#039;&#039;/etc/default/snapserver&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_SNAPSERVER=true&lt;br /&gt;
SNAPSERVER_OPTS=&amp;quot;-d -s pipe:///tmp/kind1.fifo?name=kind1&amp;amp;mode=read -s pipe:///tmp/kind2.fifo?name=kind2&amp;amp;mode=read -s pipe:///tmp/wohn.fifo?name=wohn&amp;amp;mode=read -s pipe:///tmp/kueche.fifo?name=kueche&amp;amp;mode=read&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier werden die 4 Streams erstellt, diese entsprechen vom Dateinamen her der Pulseaudiokonfiguration. Der hier verwendete Name kann später in FHEM oder auch im Android-Client angezeigt werden. Die Option &amp;lt;pre&amp;gt;mode=read&amp;lt;/pre&amp;gt; ist wichtig, weil Pulseaudio meckert, wenn es die FIFO-Dateien nicht selbst anlegen darf. &lt;br /&gt;
&lt;br /&gt;
Auf der Clientseite sieht die Datei &#039;&#039;/etc/default/snapclient&#039;&#039; dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_SNAPCLIENT=true&lt;br /&gt;
SNAPCLIENT_OPTS=&amp;quot;-d -s dmix:CARD=Aureon51MkII,DEV=0&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Den Server findet der Snapclient automatisch, er kann aber auch angegeben werden. Wie hier zu sehen kann ein spezielles Output-Device angegeben werden. Dies ist bei den PIs mit externer USB-Soundkarte meistens notwendig, da ansonsten der interne Sound genutzt würde. Eine Liste der verfügbaren Devices wird mit dem Aufruf von &amp;lt;pre&amp;gt;snapclient -l&amp;lt;/pre&amp;gt; ausgegeben, hier muss dann das passende genommen werden. GGf. so lange ausprobieren, bis der Sound an der richtigen Stelle rauskommt.&lt;br /&gt;
&lt;br /&gt;
In der hier betrachteten Konfiguration soll auf dem Wohnzimmer-PI ein Snapclient laufen, dieser wird aber normalerweise zum TV und Filme schauen mit KODI verwendet. Sowohl KODI als auch der Snapclient blockieren aber das ALSA-Device und funktionieren beide meistens entweder gar nicht oder nicht richtig zusammen, insbesondere dann nicht, wenn von KODI Mehrkanalsound oder sogar Passthrough ausgegeben wird. Die Entwicklung eines nativen Snapcast-Clients innerhalb von KODI wird gerade an verschiedenen Stellen diskutiert, z.B. [https://github.com/badaix/snapcast/issues/155 hier]. Bis dahin kann ein kleiner Workaround Abhilfe schaffen. Mit folgendem (nur rudimentär getesteten) [https://github.com/unimatrix27/snapcast/commit/88e42a2ecc8b44223701e18abb63af04b673b67b Hack] für den Snapcast-Client wird erreicht, dass der Client das ALSA-Device frei gibt, sobald er über den Server auf Mute gestellt wird. KODI selbst gibt das Device ebenfalls frei, wenn es im Zustand &amp;quot;Stop&amp;quot; ist. Bei dieser Lösung kann der Snapclient auf dem KODI-Rechner immer laufen gelassen werde. Es ist jedoch in der Verantwortung des Benutzers, den Client zu &amp;quot;muten&amp;quot;. Vergisst er dies, wird ggf. die Wiedergabe in KODI nicht möglich sein. &lt;br /&gt;
&lt;br /&gt;
Nach Abschluss der Snapcastkonfiguration und dem Starten von Server und den Clients empfiehlt es sich, die Android-App ebenfalls zu verwenden, da diese einen schnellen Überblick über den Zustand des Servers, der konfigurierten Streams und der Clients bietet.&lt;br /&gt;
&lt;br /&gt;
=== Mopidy Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Mopidy als MPD-Ersatz verwendet, genau so gut kann aber auch direkt MPD verwendet werden. Die genauen Konfigurationsoptionen sind natürlich anders, und jeweils in entsprechenden Tutorials oder Dokumentationen beschrieben. Mopidy ist relativ umfangreich und modular aufgebaut, es bietet u.a. die Möglichkeit, neben lokal gespeicherten Dateien auch Dateien von verschiedenen, teilweise kommerziellen, Streamingdiensten abzuspielen. Die Detailkonfiguration all dieser Komponenten geht über diesen Artikel hinaus. Entscheidend hier ist die Konfiguration in einer Weise, so dass mehrere Mopidy-Instanzen gleichzeitig ausgeführt werden können und dann auf unterschiedlichen Ports zur Verfügung stehen. &lt;br /&gt;
&lt;br /&gt;
Nach Installation von Mopidy findet sich die Konfiguration in der Datei &#039;&#039;/etc/mopidy/mopidy.cfg&#039;&#039;. Mopidy unterstützt hierarische Konfigurationen, es reicht also, den für jede Instanz spezifischen Teil aus dieser allgemeinen Konfiguration zu entfernen und in jeweils eigene Dateien zu verschieben. In diesem Beispiel sollen das die Dateien &#039;&#039;/etc/mopidy/kind1.conf&#039;&#039; bis &#039;&#039;/etc/mopidy/kueche.conf&#039;&#039; sein. Die folgenden Zeilen gehören jeweils in diese 4 Dateien und werden dort entsprechend angepasst. Hier das Beispiel für Kind2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[logging]&lt;br /&gt;
config_file = /etc/mopidy/logging_kind2.conf&lt;br /&gt;
debug_file = /var/log/mopidy/mopidy-debug_kind2.log&lt;br /&gt;
&lt;br /&gt;
[audio]&lt;br /&gt;
output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! pulsesink  device=kind2  stream-properties=&amp;quot;props,media.role=music&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[mpd]&lt;br /&gt;
enabled = true&lt;br /&gt;
hostname = 0.0.0.0&lt;br /&gt;
port=6601&lt;br /&gt;
&lt;br /&gt;
[http]&lt;br /&gt;
enabled = true&lt;br /&gt;
hostname =  0.0.0.0&lt;br /&gt;
port=6681&lt;br /&gt;
zeroconf = Musik Kind2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Audioteil wird der entsprechende Sink aus der Pulseaudiokonfiguration genommen. Die Angabe von stream-properties ermöglicht dem Duck-Modul den Stream als Musik zu erkennen und beim Abspielen von Announcements in der Lautstärke abzusenken. Beim MPD muss der Port für jede Instanz unterschiedlich sein, ebenso beim HTTP-Modul für die Weboberfläche der jeweiligen Instanz. Der Zerokonfname sollte auch eindeutig sein. Neben dieser Datei ist noch die dazu passende logging-Konfiguration anzulegen, hier also &#039;&#039;/etc/mopidy/logging_kind2.conf&#039;&#039;. Dazu wird die Standarddatei kopiert und darin nur der Name der Logdatei angepasst.&lt;br /&gt;
&lt;br /&gt;
Um nun auch die entsprechende Anzahl Instanzen automatisch zu starten, sind die entsprechenden Startdateien anzulegen. Dazu kann die Datei &#039;&#039;/etc/systemd/system/mopidy.cfg&#039;&#039; z.B. in &#039;&#039;/etc/systemd/system/mopidy_kind1.cfg&#039;&#039; umbenannt werden und dann 3 mal mit den Endungen der anderen Instanzen kopiert werden. Der Inhalt ist dann wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Mopidy_kind1&lt;br /&gt;
After=network.target sound.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=/etc/default/mopidy&lt;br /&gt;
ExecStart=/usr/bin/mopidy --quiet --config /etc/mopidy/kind1.conf&lt;br /&gt;
&lt;br /&gt;
# allow MPD to use real-time priority 50&lt;br /&gt;
LimitRTPRIO=50&lt;br /&gt;
LimitRTTIME=infinity&lt;br /&gt;
&lt;br /&gt;
# disallow writing to /usr, /bin, /sbin, ...&lt;br /&gt;
ProtectSystem=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abschließend sollten die 4 Instanzen durch den Aufruf von &amp;lt;pre&amp;gt;systemctl enable mopidy_kind1&amp;lt;/pre&amp;gt; usw. aktiviert werden. Es empfiehlt sich nach dem Start von Mopidy die korrekte Funtkionsweise mit dem [https://www.musicpd.org/clients/mpc/ MPC]-Client oder mit [http://rybczak.net/ncmpcpp/ NCMPCPP] auf der Konsole zu testen.&lt;br /&gt;
&lt;br /&gt;
Hierbei sollte es dann bereits möglich sein, die Multiroom-Fähigkeiten von Snapcast mit Hilfe des Android-Clients von Snapcast zu testen und so auch festzustellen, dass die restliche Konfiguration von Snapcast und Pulseaudio korrekt sind. &lt;br /&gt;
&lt;br /&gt;
=== FHEM ===&lt;br /&gt;
&lt;br /&gt;
In FHEM sind nun in der &#039;&#039;fhem.cfg&#039;&#039; die entsprechenden Module einzurichten:&lt;br /&gt;
* Ein Snapcast-Modul im Server Modus&lt;br /&gt;
* Pro Raum ein Snapcast-Modul im Clientmodus&lt;br /&gt;
* Pro Raum ein MPD-Modul&lt;br /&gt;
* Pro Raum ein OpenMultiroom-Modul&lt;br /&gt;
* Optional pro Raum ein Text2Speech-Modul&lt;br /&gt;
* weitere Text2Speech-Module, falls man diese in Pulseaudio mit dem per Combine-Sink vorgesehen hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          scs.snap              Snapcast&lt;br /&gt;
&lt;br /&gt;
define          scc.kind1             Snapcast          client scs.snap b827eb9aec84&lt;br /&gt;
  attr          scc.kind1             constraintDummy   freestring &lt;br /&gt;
  attr          scc.kind1             constraints       standard|07:00 0 20:00 100 21:00 50 21:30 30 24:00 0,beforefree|07:00 0 21:00 100 22:00 50 23:00 30 24:00 0,beforeschool|07:00 0 08:30 50 20:00 100 21:00 50 21:30 30 24:00 0,free|07:00 0 08:30 50 21:00 100 22:00 50 23:00 30 24:00 0&lt;br /&gt;
&lt;br /&gt;
define          scc.kind2             Snapcast          client scs.snap 025009413c29&lt;br /&gt;
  attr          scc.kind2             constraintDummy   freestring&lt;br /&gt;
  attr          scc.kind2             constraints       standard|07:00 0 20:15 100 20:30 50 24:00 0,beforefree|07:00 0 21:00 100 22:30 50 24:00 0,beforeschool|07:00 0 08:30 50 20:15 100 20:30 50 24:00 0,free|07:00 0 08:30 50 21:00 100 22:30 50 24:00 0&lt;br /&gt;
&lt;br /&gt;
define          scc.kueche            Snapcast          client scs.snap b827eb9a2ad3&lt;br /&gt;
&lt;br /&gt;
define          scc.wohn              Snapcast          client scs.snap 00aefa4aa3a9&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oben zu sehen ist das define für das Server-Modul. Ohne Parameter verbindet sich mit localhost auf dem Standardport 1705. Es folgt die Definition von 2 Clients. Der erste Parameter &amp;quot;client&amp;quot; versetzt das Snapcastmodul in den Clientmodus. Der zweite Parameter verweist auf das Servermodul, der dritte Parameter ist die Client-ID. Diese besteht bei der aktuellen Snapcast-Version meistens aus der MAC-Adresse des Clients. Für die Kinder werden noch die Attribute constraintDummy ond constraints vergeben. Hiermit wird eine tagestyp- und tageszeitabhängige Lautstärkebegrenzung konfiguriert. Für die vier Tagestypen &amp;quot;standard&amp;quot;, &amp;quot;beforefree&amp;quot;, &amp;quot;beforeschool&amp;quot; und &amp;quot;free&amp;quot; wird ein jeweils anderes Lautstärkezeitprofil definiert. &lt;br /&gt;
&lt;br /&gt;
Das Zeitprofil wird hier nach dem gleichen Muster wie die Temperaturlisten der Homematic-Thermostate, erklärt hier: [HomeMatic_Type_Thermostat]. Für den Tagestyp wird zusätzlich das Attribut constraintDummy verwendet. Es definiert, dass in dem Dummy &amp;quot;freestring&amp;quot; jeweils drin steht, welcher Tagestyp gerade ist. Diese Variable wirkt somit als Selektor auf die Liste der erlaubten Maximallautstärken. Wie eine solche Dummyvariable jeweils mit einem entsprechenden Wert befüllt werden kann, z.B. abhängig vom Wochentag, von Schulferien oder Feiertagen, wird hier nicht erläutert. Es ist auch möglich, nur ein Lautstärkeprofil anzugeben. Ohne dass ein Attribut constraintDummy gesetzt ist, verwendet das Snapcastmodul immer den Wert &amp;quot;standard&amp;quot;. Wie man hier sehen kann, gibt es im Beispiel 4 Typen, hierbei fallen Freitage normalerweise in die Kategorie &amp;quot;beforefree&amp;quot; (es sind Tage, bevor dann frei ist, es kann also typischerweise länger und lauter Musik gehört werden), Samstage normalerweise in die Kategorie &amp;quot;free&amp;quot; und Sonntage in die Kategorie &amp;quot;beforeschool&amp;quot;, ebenso landen dort Feiertage vor Schultagen usw. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          tts.wohn              Text2Speech       pulsewohn&lt;br /&gt;
  attr          tts.wohn              TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.wohn              TTS_UseMP3Wrap    true&lt;br /&gt;
  attr          tts.wohn              TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
&lt;br /&gt;
define          tts.kind1             Text2Speech       pulsekind1&lt;br /&gt;
  attr          tts.kind1             TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kind1             TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kind1             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kind2             Text2Speech       pulsekind2&lt;br /&gt;
  attr          tts.kind2             TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kind2             TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kind2             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kueche            Text2Speech       pulsekueche&lt;br /&gt;
  attr          tts.kueche            TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kueche            TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kueche            TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kinder            Text2Speech       pulsekinder&lt;br /&gt;
  attr          tts.kinder            TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kinder            TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kinder            TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.unten             Text2Speech       pulseunten&lt;br /&gt;
  attr          tts.unten             TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.unten             TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.unten             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.alle              Text2Speech       pulsealle&lt;br /&gt;
  attr          tts.alle              TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.alle              TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.alle              TTS_UseMP3Wrap    true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind die Definitionen der Text2Speech Module zu sehen (optional). Sie werden jeweils mit den in Pulseaudio definierten Sinks verbunden. Die Nutzung eines TemplateDirs ist ebenfalls optional, hier können bereits fertige MP3s verwendet werden, die dann anstelle der von der Google TTS API erzeugten Dateien benutzt werden. Dies können auch Bestätigungs und Fehlertöne sein, die bei Benutzern ohne Display, die rein mit Fernbedienung arbeiten, auf Fehlbedienungen etc. aufmerksam zu omrhen. Der Aufruf von mplayer wird noch modifiziert, um dafür zu sorgen, dass die Ausgabe bei Pulseaudio als media.role &amp;quot;announcement&amp;quot; eingehen. Dies wird dann vom duck-Modul erkannt, und führt dazu, dass die Lautstärke der ggf. ablaufenden Musik, etc. abgesenkt wird, so lange die tts-Ausgabe läuft. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          mpd.kind1              MPD               192.168.2.2 6600&lt;br /&gt;
  attr          mpd.kind1              player            mopidy&lt;br /&gt;
  attr          mpd.kind1              bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.kind1              autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.kind2             MPD               192.168.2.2 6702&lt;br /&gt;
  attr          mpd.kind2             player            mopidy&lt;br /&gt;
  attr          mpd.kind2             bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.kind2             autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.kueche            MPD               192.168.2.2 6703&lt;br /&gt;
  attr          mpd.kueche            player            mopidy&lt;br /&gt;
  attr          mpd.kueche            bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.kueche            autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.wohn              MPD               192.168.2.2 6704&lt;br /&gt;
  attr          mpd.wohn              player            mopidy&lt;br /&gt;
  attr          mpd.wohn              bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.wohn              autoBookmark      1 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pro laufender MPD oder Mopidy-Instanz wird ein MPD-Modul eingerichtet. Der Hostname und die Ports sind entsprechend anzupassen. Durch die bookmarkDir und autoBookmark - Attribute wird erreicht, dass der Zustand von Playlisten beim Wechsel derselben gespeichert und später wiederhergestellt werden kann. So lässt sich das Hören eines Hörbuchs unterbrechen, auf z.B. eine Radiostreamplayliste schalten, um dann später zur gleichen Stelle im Hörbuch zurückzukehren. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          omr.kind1              OpenMultiroom&lt;br /&gt;
  attr          omr.kind1              mr                scc.kind1&lt;br /&gt;
  attr          omr.kind1              soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.kind1              playlistPattern   kind1&lt;br /&gt;
  attr          omr.kind1              ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.kind1              defaultTts        tts.kind1&lt;br /&gt;
  attr          omr.kind1              defaultStream     kind1&lt;br /&gt;
  attr          omr.kind1              defaultSound      mpd.kind1&lt;br /&gt;
&lt;br /&gt;
define          omr.kind2             OpenMultiroom&lt;br /&gt;
  attr          omr.kind2             mr                scc.kind2&lt;br /&gt;
  attr          omr.kind2             soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.kind2             playlistPattern   kind2&lt;br /&gt;
  attr          omr.kind2             ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.kind2             defaultTts        tts.kind2&lt;br /&gt;
  attr          omr.kind2             defaultStream     kind2&lt;br /&gt;
  attr          omr.kind2             defaultSound      mpd.kind2&lt;br /&gt;
&lt;br /&gt;
define          omr.kueche            OpenMultiroom&lt;br /&gt;
  attr          omr.kueche            mr                scc.kueche&lt;br /&gt;
  attr          omr.kueche            soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.kueche            playlistPattern   wohn&lt;br /&gt;
  attr          omr.kueche            ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.kueche            defaultTts        tts.kueche&lt;br /&gt;
  attr          omr.kueche            defaultStream     kueche&lt;br /&gt;
  attr          omr.kueche            defaultSound      mpd.kueche&lt;br /&gt;
&lt;br /&gt;
define          omr.wohn              OpenMultiroom&lt;br /&gt;
  attr          omr.wohn              mr                scc.wohn&lt;br /&gt;
  attr          omr.wohn              soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.wohn              playlistPattern   wohn&lt;br /&gt;
  attr          omr.wohn              ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.wohn              defaultTts        tts.wohn&lt;br /&gt;
  attr          omr.wohn              defaultStream     wohn&lt;br /&gt;
  attr          omr.wohn              defaultSound      mpd.wohn&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Konfiguration der OpenMultiroom-Module schließt die Einrichtung von FHEM ab. Jede Instanz benötigt mindestens das &amp;quot;mr&amp;quot;- und das &amp;quot;soundMapping&amp;quot;-Attribut. Nur so kann sich das Modul mit den entsprechenden Snapcast und MPD-Modulen verbinden. Durch das &amp;quot;mr&amp;quot;-Attribut wird ein OpenMultiroom-Modul einem Snapcast-Client-Modul fest zugeordnet. Das Soundmapping ordnet die in Snapcast definierten Streams (siehe oben, Konfiguration vom Snapserver) den entsprechenden Instanzen des MPD-Moduls zu. Dadurch weiß FHEM, welcher MPD auf welchem Stream abspielt und kann je nachdem, welchem Stream ein Raum gerade zuhört, den dazu passenden MPD steuern und seine Readings durchreichen. Das OpenMultiroom-Modul bildet alle Readings des MPD-Moduls nochmal direkt ab. Wechselt ein Benutzer aber den Stream, dem er zuhört, aktualisieren sich auch alle Readings dementsprechend mit denen des dann aktuellen MPD-Moduls. &lt;br /&gt;
&lt;br /&gt;
Das Attribut playlistPattern ist optional und sorgt dafür, dass beim Durchschalten der Playlists mit den Kommandos &amp;quot;channelUp&amp;quot; und &amp;quot;channelDown&amp;quot; nur diejenigen Playlists berücksichtigt werden, die auf das Pattern passen. &lt;br /&gt;
&lt;br /&gt;
Analog zum soundMapping definiert das Attribut ttsMapping die Zuordnung der TTS-Module zu den Streams. Beim Ausgeben von Announcement kann so das OpenMultiroom-Modul ermitteln, auf welchem Stream welcher Raum gerade zuhört, und wo dementsprechend die TTS-Ausgaben zu erzeugen sind, damit sie auch in den gewünschten Räumen ankommen. Dieser Umweg ist zurzeit nötig, da ein Snapcast-Client nur auf einem einzigen Stream lauschen kann. Lauschen noch andere Clients auf demselben Stream, hören sie allerdings zwangsweise auch die Announcements.&lt;br /&gt;
&lt;br /&gt;
Die 3 Default-Attribute legen fest, welche der TTS-Module, welcher Stream und welcher MPD dem entsprechenden Modul fest zugeordnet sind. Dies wird u.a. von einer Resetfunktion im Modul verwendet. &lt;br /&gt;
&lt;br /&gt;
== Bedienung des OpenMultiroom-Moduls ==&lt;br /&gt;
&lt;br /&gt;
=== set-Kommandos ===&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
&lt;br /&gt;
== Anbindung einer Fernbedienung an ein OpenMultiroom-Modul ==&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration von LIRC und IRExec === &lt;br /&gt;
&lt;br /&gt;
=== Zuordnung der Tasten: Beispiel === &lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=99_myUtils_anlegen&amp;diff=37490</id>
		<title>99 myUtils anlegen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=99_myUtils_anlegen&amp;diff=37490"/>
		<updated>2022-07-07T11:34:36Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: id bzgl. Doku&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Speicherung von Perl-Code unmittelbar in [[Eventhandler|Eventhandlern]], [[Timehandler|Timehandlern]] oder anderen Geräten in der [[Konfiguration]], in denen Perl-Ausdrücke angegeben werden können, wird mit wachsender Zahl von Geräten und Logiken eventuell unübersichtlich. Um z.B. Doppelungen zu vermeiden und Logikbausteine zentral vorzuhalten, kann man eine oder mehrere eigene Programmdateien erzeugen, in der diese als kleine Programme gesammelt und dann aus entsprechenden Geräten aufgerufen werden können.&lt;br /&gt;
== Eine neue Programmdatei erzeugen ==&lt;br /&gt;
FHEM enthält eine Vorlage &#039;&#039;myUtilsTemplate.pm&#039;&#039;, die zur Erzeugung von Programmdateien genutzt werden sollte; nachfolgend soll beispielhaft eine Datei namens &#039;&#039;99_myUtils.pm&#039;&#039; verwendet werden. &lt;br /&gt;
Vorgehensweise:&lt;br /&gt;
* FHEM-Menüpunkt {{Taste|Edit files}} anklicken&lt;br /&gt;
* Weblink &#039;&#039;myUtilsTemplate.pm&#039;&#039; anklicken&lt;br /&gt;
* Im Textfeld hinter &#039;&#039;Save as&#039;&#039; den Dateinamen &#039;&#039;99_myUtils.pm&#039;&#039; für die Programmdatei  eintragen&lt;br /&gt;
: Hinweis: Wenn ein anderer Dateiname angegeben wird, muss der Name Initialize-Routine entsprechend angepasst werden (siehe nachfolgende Erläuterung zur Grundstruktur unter Nr. 3)&lt;br /&gt;
* {{Taste|Save as}} anklicken&lt;br /&gt;
Nun ist die eigene Programmdatei &#039;&#039;99_myUtils.pm&#039;&#039; mit der notwendigen Grundstruktur unter dem Menüpunkt &#039;&#039;Edit files&#039;&#039; zur Bearbeitung mit dem [[codemirror|Integrierter Editor]] zu finden. Für eine einfache und fehlerminimierende Bearbeitung sollten die [[Konfiguration#Syntaxhervorhebung|Syntaxhervorhebungs-, Befehlsauswahl- und Befehlsvervollständigungsfunktionen]] im Integrierten Editor eingeschaltet sein.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Nutzt man {{Link2CmdRef|Lang=en|Anker=configDB|Label=configDB}}, können (bzw. sollten) die eigenen Programmdateien in die Datenbank importiert werden, statt unmittelbar im Dateisystem gespeichert zu bleiben. Sie können dann weiter über {{Taste|Edit files}} bearbeitet werden, stehen dann aber z.B. bei einem Umzug oder Neuaufsetzen des Systems direkt wieder zur Verfügung.}}&lt;br /&gt;
Die Programmdateien können zwar auch mit einem [[Konfiguration#Externer Editor|externen Editor]] bearbeitet werden, diese Vorgehensweise wird jedoch nicht empfohlen, da dies insbesondere Einsteigern das debugging erschwert.&lt;br /&gt;
&lt;br /&gt;
Eine ‚leere‘ Programmdatei muss grundsätzlich folgenden Grundstruktur besitzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 package main;&lt;br /&gt;
 use strict;&lt;br /&gt;
 use warnings;&lt;br /&gt;
&lt;br /&gt;
 sub&lt;br /&gt;
 myUtils_Initialize($$)&lt;br /&gt;
 {&lt;br /&gt;
   my ($hash) = @_;&lt;br /&gt;
 }&lt;br /&gt;
 1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgende Dinge sind für eigene Programmdateien besonders zu beachten:&lt;br /&gt;
&lt;br /&gt;
# Der Dateiname muss mit 99_ beginnen. FHEM lädt beim Start alle Programmdateien mit dem prefix 99_. Andere Programmdateien werden erst dann geladen, wenn sie durch eine define-Anweisung in der [[Konfiguration]] angefordert werden. So wird z.B. 10_FS20.pm erst geladen, wenn beim Einlesen der Konfiguration das erste define für ein FS20-device abgearbeitet wird. Da Ihre eigene Programmsammlung wahrscheinlich kein neues Gerät mit einem zugehörigen define-Befehl implementiert, würde sie also nie geladen, wenn ihr Name nicht mit 99_ beginnt.&lt;br /&gt;
# Damit die neue Datei bei &#039;&#039;Edit files&#039;&#039; angezeigt wird, muss sie mit &#039;&#039;.pm&#039;&#039; enden und den Bestandteil &#039;&#039;Utils&#039;&#039; enthalten. Also zum Beispiel &#039;&#039;99_meineUtils.pm&#039;&#039; oder &#039;&#039;99_myUtils_Homematic.pm&#039;&#039;.&lt;br /&gt;
# Der Name der Programmdatei muss mit dem Namen der Initialize-Routine übereinstimmen. Wenn Sie Ihr Programm also 99_Werkzeugkasten.pm nennen, muss die im code dargestellte initialize-Routine sub Werkzeugkasten_Initialize heißen.&lt;br /&gt;
# Die Zeile &amp;lt;code&amp;gt; 1; &amp;lt;/code&amp;gt; muss immer die letzte Programmzeile sein. Wenn Sie also eigene Routinen in Ihre Programmsammlung einfügen, tragen Sie diese zwischen dem Ende der Initialize-Routine und der abschließenden Zeile &amp;lt;code&amp;gt; 1; &amp;lt;/code&amp;gt; ein.&lt;br /&gt;
&lt;br /&gt;
== Eigene Routinen einfügen ==&lt;br /&gt;
Als Beispiel dient das Umsetzen von FS20 toggle-Events aus dem Artikel &amp;quot;[[FS20 Toggle Events auf On/Off umsetzen]]&amp;quot;.&lt;br /&gt;
Das gesamte Programm sieht dann folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
package main;&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
sub&lt;br /&gt;
myUtils_Initialize($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($hash) = @_;&lt;br /&gt;
}&lt;br /&gt;
##########################################################&lt;br /&gt;
# Untoggle&lt;br /&gt;
# toggle-Vorgänge in den Status on/off umsetzen&lt;br /&gt;
sub Untoggle($) {&lt;br /&gt;
  my ($obj) = @_;&lt;br /&gt;
&lt;br /&gt;
  if( Value($obj) eq &amp;quot;toggle&amp;quot; ){&lt;br /&gt;
    if( OldValue($obj) eq &amp;quot;off&amp;quot; ) {&lt;br /&gt;
      fhem( &amp;quot;setstate $obj on&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      fhem( &amp;quot;setstate $obj off&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    fhem( &amp;quot;setstate $obj &amp;quot;.Value($obj) );&lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
1;&amp;lt;/source&amp;gt;&lt;br /&gt;
Der Aufruf erfolgt dann z.B. so:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;#fhem.cfg&lt;br /&gt;
define lampe_untoggle notify lampe {Untoggle(&amp;quot;$NAME&amp;quot;)}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der Aufruf aus einem notify (oder at) erfolgt als Perl-code, muss also in geschweiften Klammern stehen. Der Aufruf erfolgt durch Angabe des Namens der Routine (Untoggle) unter Angabe der zu übergebenden Parameter (hier &amp;quot;$NAME&amp;quot;).&lt;br /&gt;
Im Programm wurde die Routine Untoggle mit &#039;&#039;&#039;einem&#039;&#039;&#039; Parameter definiert ( Untoggle($) , die Anzahl der $-Zeichen bestimmt die Anzahl der zu übergebenden Parameter). Der Wert des übergebenen Parameters wird in der ersten Programmzeile in die Variable $obj übernommen (my ($obj) = @_; ). &lt;br /&gt;
Der Aufruf erfolgt mit Untoggle(„$NAME“) . Der Platzhalter $NAME in fhem steht für den Namen des Geräts. Im o.g. Beispiel erfolgt der Aufruf also eigentlich mit Untoggle(„lampe“). Natürlich können beim Aufruf auch feste Werte ( „lampe1“ ) oder Variablen ( $hour ) übergeben werden.&lt;br /&gt;
&lt;br /&gt;
=== Routinen mit mehreren Parametern ===&lt;br /&gt;
In der Definition der Routine geben Sie außerdem an, wieviele Parameter übergeben werden sollen, für 2 Parameter z.B. so:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;define test at *09:00 { wakeup($we, &amp;quot;Schlafzimmerlampe&amp;quot;) }&amp;lt;/source&amp;gt;&lt;br /&gt;
Die Deklaration der Routine in Ihrer Programmdatei muss dann so beginnen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;#Nur am Wochenende eingeschaltet&lt;br /&gt;
sub wakeup($$) {&lt;br /&gt;
  my ($wochenende, $device) = @_;&lt;br /&gt;
  if ($wochenende) {&lt;br /&gt;
    fhem( &amp;quot;set $device on&amp;quot; );&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    fhem( &amp;quot;set $device off&amp;quot; );&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Durch die Anzahl der $-Zeichen in der Routinen-Deklaration wird also die Anzahl der Parameter festgelegt. In der ersten Programmzeile Ihrer Routine übernehmen Sie dann die übergebenen Parameterwerte in lokale Variablen. Wie beim Routinen-Aufruf muss auch hierbei die Anzahl der Parameter mit der Routinen-Deklaration (also Anzahl der $-Zeichen) übereinstimmen&amp;lt;ref&amp;gt;Mehr zu diesen sog. prototypes ist z.B. [https://perldoc.perl.org/perlsub.html#Prototypes hier] nachzulesen; auch [[fhem.pl]] beginnt mit einer Liste der prototyes der darin enthaltenen Funktionen. Da diese Funktionen auch innerhalb der myUtils verwendet werden können, empfiehlt es sich, zunächst dort nachzusehen, ob eventuell bereits hilfreiche Funktionen für das zu lösende Problem vorhanden sind.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Routinen ohne Parameter ===&lt;br /&gt;
Auch Routinen ohne Parameter sind natürlich möglich. Definition und Aufruf sehen dann folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;sub parameterlos() {&lt;br /&gt;
  ...&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
 { parameterlos() }&lt;br /&gt;
&lt;br /&gt;
== Eigene Programmdatei laden ==&lt;br /&gt;
Die Programmdatei wird beim FHEM-Start immer automatisch geladen. &lt;br /&gt;
&lt;br /&gt;
Bei Änderungen an der Programmdatei bei laufendem FHEM ist bezüglich Neuladen ohne FHEM-Neustart zwischen den verschiedenen Bearbeitungsvarianten der Progammdatei zu unterscheiden.&lt;br /&gt;
&lt;br /&gt;
Bei der Bearbeitung über den &#039;&#039;&#039;Integrierten Editor&#039;&#039;&#039; wird die Programmdatei beim Abspeichern automatisch mit den Änderungen neu geladen.&lt;br /&gt;
&lt;br /&gt;
Bei der nicht empfohlenen Bearbeitung der Programmdatei mit einem &#039;&#039;&#039;externen Editor&#039;&#039;&#039; muss FHEM manuell angewiesen werden, die Programmdatei mit den Änderungen zu laden. Also bearbeiten Sie Ihr Programm, speichern die Programmdatei, und weisen FHEM dann explizit an, die Programmdatei erneut zu laden. Der Befehl dazu, der in das Befehls-Eingabefeld eingegeben wird, lautet: &amp;lt;code&amp;gt;reload 99_myUtils.pm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Treten beim Laden (Syntax)fehler auf, werden diese am Bildschirm wie auch im Log angezeigt. Da der Ladevorgang fehlgeschlagen ist, stehen Ihre eigenen Routinen nun nicht zur Verfügung (bzw. in der zuletzt erfolgreich geladenen Version). Es empfiehlt sich daher bei der Entwicklung neuer Code-Teile v.a. für &amp;quot;Einsteiger&amp;quot;, diese zunächst in einer separaten myUtils-Datei zu entwickeln und erst dann in die für den &amp;quot;produktiven Betrieb&amp;quot; genutzten myUtils-Dateien zu übernehmen, wenn sie als funktional getestet anzusehen sind.&lt;br /&gt;
== Eigene Programmdatei dokumentieren ==&lt;br /&gt;
In der lokalen Commandref kann man die eigenen Routinen auch dokumentieren.&lt;br /&gt;
Dazu muss am Ende der 99_myUtils folgender Codeblock eingefügt werden&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=pod&lt;br /&gt;
=begin html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a id=&amp;quot;myUtils&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;myUtils&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;b&amp;gt;Name&amp;lt;/b&amp;gt;&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Text&amp;lt;br&amp;gt;&lt;br /&gt;
  Examples:&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;code&amp;gt;Example Code &amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=end html&lt;br /&gt;
=begin html_DE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a id=&amp;quot;myUtils&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;myUtils&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=end html_DE&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der a Tag stellt einen Verweis dar, der h3 Tag kennzeichnet die Überschrift. Beide Tags müssen sein, ansonsten kann FHEM die Doku nicht in die commandref einbinden. Der Abschnitt für die deutsche Doku kann komplett fehlen. Die Beschreibungen der einzelnen Routinen werden mit ul Tags geklammert und eventuell mit ul Tags weiter untergliedert. Dabei entsteht ein eingerückter Text. Beispiele können mit dem code Tag formatiert werden.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Befehl kann die Erzeugung des Commandrefeintrages initiiert und getestet werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;{system(&amp;quot;/usr/bin/perl ./contrib/commandref_join.pl&amp;quot;)}&amp;lt;/source&amp;gt;&lt;br /&gt;
Für eine schnelle Überprüfung des Commandrefeintrages können Sie auch &amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;help myUtils&amp;lt;/source&amp;gt; (bzw. statt myUtils den Namen Ihrer Utils-Datei) eingeben.&lt;br /&gt;
&lt;br /&gt;
Weiterführende Hinweise sind in den [[Guidelines zur Dokumentation]] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen ==&lt;br /&gt;
=== Globale Ablage von Daten ===&lt;br /&gt;
Um Daten zentral zwischenzuspeichern, kann man &lt;br /&gt;
* die Funktionen &#039;&#039;[[DevelopmentModuleAPI#setKeyValue|setKeyValue()]]&#039;&#039; bzw. &#039;&#039;getKeyValue()&#039;&#039; nutzen, um die Daten im Dateisystem abzulegen;&lt;br /&gt;
* in den globalen Hash &#039;&#039;%data schreiben&#039;&#039;, wie in diesem {{Link2Forum|Topic=63737|LinkText=Forumsbeitrag}} erläutert.&lt;br /&gt;
&lt;br /&gt;
=== Vertiefende Informationen ===&lt;br /&gt;
Weiterführende Hinweise, z.B. wie aus einer Sammlung kleiner Tools ggf. ein eigenes Modul entstehen kann, sind der [[DevelopmentModuleIntro]] zu entnehmen. Dort sind v.a. auch einige häufig benötigte Funktionen aus fhem.pl dokumentiert.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Eine Zusammenstellung wichtiger Funktionen ist in den Perl specials der {{Link2CmdRef|Anker=perl|Label=commandref}} enthalten.&lt;br /&gt;
* Eine weitere Sammlung hilfreicher &amp;quot;Helferlein&amp;quot; samt Hilfe enthält [https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/99_Utils.pm 99_Utils.pm].&lt;br /&gt;
* Hilfsfunktionen für Farboperationen: [[Color]].&lt;br /&gt;
* [[Zeitangaben, rechnen mit|Wiki-Beitrag zum Rechnen mit Zeitangaben]]&lt;br /&gt;
* [[Gleitende Mittelwerte berechnen und loggen]]&lt;br /&gt;
* Beispiele für Geräteüberwachungen: [[EBUS#Mithilfe von FHEM|EBUS]], [[Netzwerkgeräte:_Verfügbarkeit_prüfen#Erweiterung 99 myUtils|Netzwerkgeräte]], {{Link2Forum|Topic=51267|Message=935071|LinkText=Nextion-Display bei Inaktivität zurücksetzen}}, {{Link2Forum|Topic=97173|Message=917347|LinkText=devStateIcon für das Modul &#039;&#039;monitoring&#039;&#039;}}&lt;br /&gt;
* [[Batterieüberwachung#Alternativ per Skript|Batterieüberwachung]]&lt;br /&gt;
* Routine zum [[E-Mail_senden#Raspberry Pi|E-Mail senden]] aus FHEM heraus&lt;br /&gt;
* [[E-Mail per notify nach Zeitablauf erneut senden|Beispiel]], wie ggf. an mehreren Stellen relevante Variablen zentral zur Verfügung gestellt werden können.&lt;br /&gt;
* [[Plot-Abriss_vermeiden#Implementierung|Plot-Abrisse vermeiden]]&lt;br /&gt;
* Formatierungsanweisungen auslagern: [[ReadingsGroup#Enigma_Receiver|ReadingsGroup]], [[Spritpreismonitor#Farbliche_Hervorhebung|Spritpreismonitor]], [[EBUS-MQTT2#myUtils-Code|Balkenanzeige]] (hier: für EBUS)&lt;br /&gt;
* Befehle an ein Netzwerkgerät senden: [[Listenlive#Der Code|Listenlive]]&lt;br /&gt;
* [[HM-Dis-WM55_Funk_Statusanzeige#99_myUtils|Homematic-Display]] mit Informationen versorgen&lt;br /&gt;
* {{Link2Forum|Topic=34363|Message=266811|LinkText=Zeit- und Datumsvariablen $hour, $wday, $month, ... in 99_myUtils.pm verfügbar machen}}&lt;br /&gt;
* {{Link2Forum|Topic=36504|Message=287778|LinkText=Globale und flexible Fenster- und Türüberwachung}}&lt;br /&gt;
* {{Link2Forum|Topic=87895|Message=803439|LinkText=57_CALENDAR.pm - events mit deviceNames nutzen}}&lt;br /&gt;
* {{Link2Forum|Topic=96959|Message=901268|LinkText=Konstanten für das Rechnen mit Zeiten}}&lt;br /&gt;
* {{Link2Forum|Topic=97430|Message=906576|LinkText=devStateIcon-Code für Homematic-Thermostate}}&lt;br /&gt;
* {{Link2Forum|Topic=86073|Message=836537|LinkText=php-Script aufrufen und Rückgabewert in einen dummy schreiben}} (hier: Viessmann Heizung))&lt;br /&gt;
* {{Link2Forum|Topic=84831|Message=771485|LinkText=Windchill und Hitzeindex berechnen}}&lt;br /&gt;
* {{Link2Forum|Topic=84016|Message=762888|LinkText=Countdown Timer}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Perl]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=37479</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=37479"/>
		<updated>2022-06-24T12:00:51Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right&amp;quot;&amp;gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuern der einzelnen Multiroom-Systemkomponenten&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=OpenMultiroom&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=98_OpenMultiroom.pm&lt;br /&gt;
|ModOwner=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuern eines Snapcast-Servers&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=Snapcast&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=96_Snapcast.pm&lt;br /&gt;
|ModOwner=orphan/rudolphkoenig&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends {{Link2Forum|Topic=18517|LinkText=MPD}} und {{Link2Forum|Topic=62389|LinkText=Snapcast}} sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Das Modul ist noch sehr neu und bisher nur im {{Link2Forum|Topic=65785|LinkText=Forum}} bzw. auf dem [https://github.com/unimatrix27/fhemmodules/blob/master/98_OpenMultiroom.pm Github des Autors] verfügbar. Sobald alles stabil ist, wird es im SVN eingestellt. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OpenMultiroom&#039;&#039;&#039; ist ein Steuerungsmodul sowie auch ein Gesamtkonzept zur Realisierung eines Multiroom-Audio-Systems unter Nutzung von ausschließlich frei verfügbarer Software und ohne Bezug auf die Hardware eines bestimmten Herstellers. Es ist so ausgelegt, dass es prinzipiell flexibel bezüglich der Auswahl der Backendsysteme ist. Zurzeit ist es für die Nutzung mit [https://www.musicpd.org/ MPD] bzw. [https://www.mopidy.com/ Mopidy] und [https://github.com/badaix/snapcast Snapcast] implementiert. Daher wird in diesem WIKI-Eintrag immer von diesen Systemen gesprochen. Einen grundsätzlichen Überblick über das Konzept bietet das Schaubild.&lt;br /&gt;
&lt;br /&gt;
== Grobe Übersicht des Funktionsumfangs der Gesamtlösung==&lt;br /&gt;
=== Features ===&lt;br /&gt;
* Integrierte Steuerung des Musikplayers über das [[MPD]]-Modul sowie des Multiroom-System {{Link2Forum|Topic=62389|LinkText=Snapcast}} in einem einzigen Modul&lt;br /&gt;
* Implementierung einer Schnittstelle gemäß [[DevelopmentGuidelinesAV]] als Basis für eine Visualisierung mit z.B. [[SmartVISU]] oder [[FHEM Tablet UI]]&lt;br /&gt;
* Synchrones Playback auf z.B. Raspberry Pi oder Android-Geräten (Snapcast-Feature)&lt;br /&gt;
* optionale Komprimierung der Soundübertragung als OGG oder FLAC (Snapcast-Feature)&lt;br /&gt;
* Möglichkeit der Bedienung völlig ohne Display über eine Fernbedienung und entsprechender Text2Speech Rückmeldung, insbesondere&lt;br /&gt;
** Durschalten von Playlisten mit entsprechenden Channel - Tasten unter Nutzung von raumspezifischen Filtern&lt;br /&gt;
** Forward und Rewind mit definierbaren Sprungweiten (implementiert direkt im [[MPD]]-Modul)&lt;br /&gt;
** Direktanwahl von Playlisten, Tracks oder Trackpositionen durch Zifferneingabe und anschließende Funktionstaste&lt;br /&gt;
** Abfrage von Statusinformationen durch Funktionstasten und Text2Speech Rückmeldungen&lt;br /&gt;
** Mithören in anderen Räumen und Übernahme des Playerzustandes anderer Räume durch Nutzung von Funktionstasten&lt;br /&gt;
** Einschlaftimer per Zifferneingabe oder per vordefinierten Zeitabständen, hierbei wird auch die Restlaufzeit des aktuellen Tracks angeboten.&lt;br /&gt;
* manuelles oder automatisches Speichern und Laden von Playlistbookmarks (implementiert direkt im [[MPD]]-Modul)&lt;br /&gt;
* Möglichkeit der Festlegung von tageszeit- und tagestypabhängigen Lautstärkebegrenzungen bis auf 0% z.B. für Kinderzimmer&lt;br /&gt;
* individuelles Verwalten von Playlisten für verschiedene Familienmitglieder&lt;br /&gt;
* Nutzung des Audiosystems für systemunabhängige FHEM-Announcements. Ein entsprechendes Announcement-Modul ist in Planung. Dabei können mehrere Räume gleichzeitig oder auch getrennt angesprochen werden&lt;br /&gt;
&lt;br /&gt;
=== Anwendungszweck und Kurzbeschreibung der Funktionsweise ===&lt;br /&gt;
Wie der Name des Systems vermuten lässt, ist die Lösung vor allem dann sinnvoll einzusetzen, wenn Audiodateien in mindestens 2 verschiedenen Räumen oder &amp;quot;Zonen&amp;quot; sowohl synchron als auch unabhängig abgespielt werden soll und wenn hierzu eine komfortable und integrierte Steuerung über FHEM verwendet werden soll. Mit Einschränkungen ist die Lösung auch dann sinnvoll, wenn es nur um das Abspielen in einem Raum geht. Hier kann dann z.B. die Steuerung über eine Fernbedienung mit Hilfe des &#039;&#039;&#039;OpenMultiroom&#039;&#039;&#039;-Moduls genutzt werden, die über eine reine Nutzung des MPD-Moduls hinausgeht. &lt;br /&gt;
&lt;br /&gt;
Für die Nutzung ist nicht zwingend ein zentraler Server notwendig. Diese Rolle kann auch von einem der Clients übernommen werden, z.B. einem Pi. Zur einfacheren Darstellung wird in diesem Eintrag jedoch immer von der Nutzung eines Servers ausgegangen, der nicht gleichzeitig auch Client ist. &lt;br /&gt;
&lt;br /&gt;
Das Abspielen von Audio funktioniert prinzipiell in 2 Stufen: &lt;br /&gt;
# Nutzung von MPD oder einem MPD-kompatiblen Player zum direkten Abspielen von Sounddateien. Pro existierendem Raum gibt es mindestens eine Instanz von MPD. Hier wird davon ausgegangen, dass es genau eine Instanz pro Raum gibt. Jeder Raum hat also &amp;quot;seinen&amp;quot; MPD. &lt;br /&gt;
# Nutzung von Snapcast zur Verteilung des von MPD abgespielten Sounds an den entsprechenden Raum. Snapcast übernimmt hierbei die zeitliche Synchronisation&lt;br /&gt;
&lt;br /&gt;
Durch das Modul &#039;&#039;&#039;OpenMultiroom&#039;&#039;&#039; steuert der Nutzer sowohl MPD als auch Snapcast. Für jeden Raum wird eine Instanz des Moduls definiert. &lt;br /&gt;
&lt;br /&gt;
=== Verwendete Komponenten ===&lt;br /&gt;
Folgende Komponenten kommen zum Einsatz:&lt;br /&gt;
&lt;br /&gt;
==== Server: ====&lt;br /&gt;
* MPD oder Mopidy oder ein anderer MPD-kompatibler Player. 1 Instanz pro Raum&lt;br /&gt;
* Snapserver&lt;br /&gt;
* mplayer (bei Nutzung von Text 2 Speech)&lt;br /&gt;
* Optional Pulseaudio (im System-Mode) bei Nutzung von Text 2 Speech oder erweiterten Konfigurationen. Hierbei wird Pulseaudio zwischen MPD und Snapcast geschaltet. &lt;br /&gt;
* Optional Anbindung an Subsonic oder Libresonic (hier zurzeit nicht beschrieben) zur Synchronisation von Playlisten uvm. &lt;br /&gt;
* FHEM: Modul 98_OpenMultiroom.pm&lt;br /&gt;
* FHEM: Modul 96_Snapcast.pm&lt;br /&gt;
* FHEM: Modul [[MPD|73_MPD.pm]]&lt;br /&gt;
* FHEM: Optional Modul 98_Text2Speech.pm&lt;br /&gt;
&lt;br /&gt;
==== Client: ====&lt;br /&gt;
* Linux: Alsa oder Pulseaudio zur Soundwiedergabe&lt;br /&gt;
* Linux: Snapclient&lt;br /&gt;
* Android: Nur der Android Snapclient&lt;br /&gt;
* Webbrowser zur Steuerung per Visualisierung&lt;br /&gt;
* ggf. Infrarot oder Funkfernbedienung. In diesem Artikel wird das Beispiel anhand der Nutzung von X10-Funkfernbedienungen gezeigt, diese gibt es sehr günstig in der Bucht o.ä.&lt;br /&gt;
* Vision: Nutzung von Tastern und Display am PI oder Nutzung eines Steuergerätes mit Tastern und Display auf Basis eines Arduino mit WLAN, z.B. im alten Gehäuse eines Küchenradios usw. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aufbau anhand einer vollständigen Beispielkonfiguration ==&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel soll beispielhaft eine vollständige Konfiguration gezeigt werden. Jeder Nutzer muss diese Konfiguration an seine eigenen Bedürfnisse anpassen. Es seien folgende Komponenten vorhanden:&lt;br /&gt;
&lt;br /&gt;
* Server mit Ubuntu 16.04, hier befindet sich eine MP3-Sammlung&lt;br /&gt;
* Kind1: Raspberry Pi Model 1 mit Raspbian&lt;br /&gt;
* Kind2: BananaPi mit Ubuntu, an diesem Pi ist auch ein X10 Empfänger angeschlossen, da er zentral im Haus positioniert ist&lt;br /&gt;
* Wohnzimmer: Raspberry Pi3 mit OSMC und KODI, wird primär zum Fernsehen verwendet&lt;br /&gt;
* Küche: Raspberry Pi Model 1 mit Raspbian&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Es ist möglich, mehrere Räume mit nur einem physikalischen Client zu bedienen. Hierbei werden auf einem Client mehrere Instanzen des Snapclients laufen gelassen. Der physikalische Client hat dann z.B. mehrere USB Soundkarten, dessen Audioausgänge in verschiedene Räume verkabelt sind. Dies wird hier zurzeit nicht näher beschrieben. &lt;br /&gt;
&lt;br /&gt;
=== Pulseaudio Konfiguration ===&lt;br /&gt;
Will man Pulseaudio verwenden, z.B. um Text2Speech Nachrichten in laufende Musik einzublenden, sollte dieses am besten zuerst konfiguriert werden. Pulseaudio muss hierzu im System-Mode laufen. Dies ist auf einem Headless-Server kein Problem. Bei Ubuntu 16.10 wird dies durch folgenden Inhalt in &#039;&#039;/etc/systemd/system/pulseaudio.service&#039;&#039; erreicht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=PA&lt;br /&gt;
After=network.target sound.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=/usr/bin/pulseaudio --system&lt;br /&gt;
&lt;br /&gt;
# allow MPD to use real-time priority 50&lt;br /&gt;
LimitRTPRIO=50&lt;br /&gt;
LimitRTTIME=infinity&lt;br /&gt;
&lt;br /&gt;
# disallow writing to /usr, /bin, /sbin, ...&lt;br /&gt;
ProtectSystem=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Weiterhin ist der Befehl&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo systemctl enable pulseaudio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
einzugeben, um Pulseaudio beim Systemstart automatisch zu starten.&lt;br /&gt;
&lt;br /&gt;
Ausgehend von der Standardkonfiguration werden nun in  &#039;&#039;/etc/pulse/system.pa&#039;&#039; die benötigten Module eingetragen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
load-module module-pipe-sink file=/tmp/wohn.fifo   sink_name=wohn&lt;br /&gt;
load-module module-pipe-sink file=/tmp/kind1.fifo   sink_name=kind1&lt;br /&gt;
load-module module-pipe-sink file=/tmp/kind2.fifo  sink_name=kind2&lt;br /&gt;
load-module module-pipe-sink file=/tmp/kueche.fifo sink_name=kueche&lt;br /&gt;
&lt;br /&gt;
load-module module-combine-sink slaves=kind1,kind2 sink_name=kinder&lt;br /&gt;
load-module module-combine-sink slaves=wohn,kueche sink_name=unten&lt;br /&gt;
load-module module-combine-sink slaves=wohn,kueche,kind1,kind2 sink_name=alle&lt;br /&gt;
&lt;br /&gt;
pactl load-module module-role-ducking trigger_roles=announcement ducking_roles=music&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Snapcast benötigt die Audioquelle in Form von FIFOs. Daher wird hier in den erstem 4 Zeilen je ein FIFO von Pulseaudio erzeugt. Der sink_name wird später bei der Konfiguration von MPD als Ausgang verwendet. In den 3 weiteren Zeilen werden noch 3 Sinks als Combine-Sinks erstellt. Diese erzeugen keine neuen FIFOs, sondern machen unter entsprechenden Sink-Namen eine vorgegebene Kombination von Räumen nach außen hin verfügbar. Der Sink &amp;quot;alle&amp;quot; kann also genutzt werden, um Audio auf allen 4 FIFOs gleichzeitig abzuspielen (und somit später potentiell in allen Räumen gleichzeitig). Dies kann für Announcements sinnvoll sein. Die Nutzung dieser Combine-Sinks ist optional. Ebenso optional ist das Laden des Ducking-Moduls am Ende. Das Ducking Modul führt dazu, dass Pulseaudio automatisch die Lautstärke der durch MPD abgespielten Tracks absenkt, wenn etwas über die Text2Speech-Module abgespielt wird. Ohne dies sind die Ausgaben speziell über die Google API unter Umständen nur schwer hörbar.&lt;br /&gt;
&lt;br /&gt;
=== Snapcast Konfiguration ===&lt;br /&gt;
[https://github.com/badaix/snapcast Snapcast] muss entsprechend der Angaben auf der Webseite installiert werden. Auf dem Server muss logischerweise die Serverkomponente und auf den Clients die Clientkomponente installiert werden. Bei Android-Clients wird die auf der Webseite zur Verfügung gestellt APK installiert. Snapcast befindet sich selbst noch in fortlaufender Entwicklung. Die hier vorgestellte Lösung ist mit [https://github.com/badaix/snapcast/tree/98be8a58d945f84af50e40ebcf8a774592dd6e7b dieser Version] kompatibel und getestet. &lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Servers beschränkt sich auf die Definition der Streams in &#039;&#039;/etc/default/snapserver&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_SNAPSERVER=true&lt;br /&gt;
SNAPSERVER_OPTS=&amp;quot;-d -s pipe:///tmp/kind1.fifo?name=kind1&amp;amp;mode=read -s pipe:///tmp/kind2.fifo?name=kind2&amp;amp;mode=read -s pipe:///tmp/wohn.fifo?name=wohn&amp;amp;mode=read -s pipe:///tmp/kueche.fifo?name=kueche&amp;amp;mode=read&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier werden die 4 Streams erstellt, diese entsprechen vom Dateinamen her der Pulseaudiokonfiguration. Der hier verwendete Name kann später in FHEM oder auch im Android-Client angezeigt werden. Die Option &amp;lt;pre&amp;gt;mode=read&amp;lt;/pre&amp;gt; ist wichtig, weil Pulseaudio meckert, wenn es die FIFO-Dateien nicht selbst anlegen darf. &lt;br /&gt;
&lt;br /&gt;
Auf der Clientseite sieht die Datei &#039;&#039;/etc/default/snapclient&#039;&#039; dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_SNAPCLIENT=true&lt;br /&gt;
SNAPCLIENT_OPTS=&amp;quot;-d -s dmix:CARD=Aureon51MkII,DEV=0&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Den Server findet der Snapclient automatisch, er kann aber auch angegeben werden. Wie hier zu sehen kann ein spezielles Output-Device angegeben werden. Dies ist bei den PIs mit externer USB-Soundkarte meistens notwendig, da ansonsten der interne Sound genutzt würde. Eine Liste der verfügbaren Devices wird mit dem Aufruf von &amp;lt;pre&amp;gt;snapclient -l&amp;lt;/pre&amp;gt; ausgegeben, hier muss dann das passende genommen werden. GGf. so lange ausprobieren, bis der Sound an der richtigen Stelle rauskommt.&lt;br /&gt;
&lt;br /&gt;
In der hier betrachteten Konfiguration soll auf dem Wohnzimmer-PI ein Snapclient laufen, dieser wird aber normalerweise zum TV und Filme schauen mit KODI verwendet. Sowohl KODI als auch der Snapclient blockieren aber das ALSA-Device und funktionieren beide meistens entweder gar nicht oder nicht richtig zusammen, insbesondere dann nicht, wenn von KODI Mehrkanalsound oder sogar Passthrough ausgegeben wird. Die Entwicklung eines nativen Snapcast-Clients innerhalb von KODI wird gerade an verschiedenen Stellen diskutiert, z.B. [https://github.com/badaix/snapcast/issues/155 hier]. Bis dahin kann ein kleiner Workaround Abhilfe schaffen. Mit folgendem (nur rudimentär getesteten) [https://github.com/unimatrix27/snapcast/commit/88e42a2ecc8b44223701e18abb63af04b673b67b Hack] für den Snapcast-Client wird erreicht, dass der Client das ALSA-Device frei gibt, sobald er über den Server auf Mute gestellt wird. KODI selbst gibt das Device ebenfalls frei, wenn es im Zustand &amp;quot;Stop&amp;quot; ist. Bei dieser Lösung kann der Snapclient auf dem KODI-Rechner immer laufen gelassen werde. Es ist jedoch in der Verantwortung des Benutzers, den Client zu &amp;quot;muten&amp;quot;. Vergisst er dies, wird ggf. die Wiedergabe in KODI nicht möglich sein. &lt;br /&gt;
&lt;br /&gt;
Nach Abschluss der Snapcastkonfiguration und dem Starten von Server und den Clients empfiehlt es sich, die Android-App ebenfalls zu verwenden, da diese einen schnellen Überblick über den Zustand des Servers, der konfigurierten Streams und der Clients bietet.&lt;br /&gt;
&lt;br /&gt;
=== Mopidy Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Mopidy als MPD-Ersatz verwendet, genau so gut kann aber auch direkt MPD verwendet werden. Die genauen Konfigurationsoptionen sind natürlich anders, und jeweils in entsprechenden Tutorials oder Dokumentationen beschrieben. Mopidy ist relativ umfangreich und modular aufgebaut, es bietet u.a. die Möglichkeit, neben lokal gespeicherten Dateien auch Dateien von verschiedenen, teilweise kommerziellen, Streamingdiensten abzuspielen. Die Detailkonfiguration all dieser Komponenten geht über diesen Artikel hinaus. Entscheidend hier ist die Konfiguration in einer Weise, so dass mehrere Mopidy-Instanzen gleichzeitig ausgeführt werden können und dann auf unterschiedlichen Ports zur Verfügung stehen. &lt;br /&gt;
&lt;br /&gt;
Nach Installation von Mopidy findet sich die Konfiguration in der Datei &#039;&#039;/etc/mopidy/mopidy.cfg&#039;&#039;. Mopidy unterstützt hierarische Konfigurationen, es reicht also, den für jede Instanz spezifischen Teil aus dieser allgemeinen Konfiguration zu entfernen und in jeweils eigene Dateien zu verschieben. In diesem Beispiel sollen das die Dateien &#039;&#039;/etc/mopidy/kind1.conf&#039;&#039; bis &#039;&#039;/etc/mopidy/kueche.conf&#039;&#039; sein. Die folgenden Zeilen gehören jeweils in diese 4 Dateien und werden dort entsprechend angepasst. Hier das Beispiel für Kind2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[logging]&lt;br /&gt;
config_file = /etc/mopidy/logging_kind2.conf&lt;br /&gt;
debug_file = /var/log/mopidy/mopidy-debug_kind2.log&lt;br /&gt;
&lt;br /&gt;
[audio]&lt;br /&gt;
output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! pulsesink  device=kind2  stream-properties=&amp;quot;props,media.role=music&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[mpd]&lt;br /&gt;
enabled = true&lt;br /&gt;
hostname = 0.0.0.0&lt;br /&gt;
port=6601&lt;br /&gt;
&lt;br /&gt;
[http]&lt;br /&gt;
enabled = true&lt;br /&gt;
hostname =  0.0.0.0&lt;br /&gt;
port=6681&lt;br /&gt;
zeroconf = Musik Kind2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Audioteil wird der entsprechende Sink aus der Pulseaudiokonfiguration genommen. Die Angabe von stream-properties ermöglicht dem Duck-Modul den Stream als Musik zu erkennen und beim Abspielen von Announcements in der Lautstärke abzusenken. Beim MPD muss der Port für jede Instanz unterschiedlich sein, ebenso beim HTTP-Modul für die Weboberfläche der jeweiligen Instanz. Der Zerokonfname sollte auch eindeutig sein. Neben dieser Datei ist noch die dazu passende logging-Konfiguration anzulegen, hier also &#039;&#039;/etc/mopidy/logging_kind2.conf&#039;&#039;. Dazu wird die Standarddatei kopiert und darin nur der Name der Logdatei angepasst.&lt;br /&gt;
&lt;br /&gt;
Um nun auch die entsprechende Anzahl Instanzen automatisch zu starten, sind die entsprechenden Startdateien anzulegen. Dazu kann die Datei &#039;&#039;/etc/systemd/system/mopidy.cfg&#039;&#039; z.B. in &#039;&#039;/etc/systemd/system/mopidy_kind1.cfg&#039;&#039; umbenannt werden und dann 3 mal mit den Endungen der anderen Instanzen kopiert werden. Der Inhalt ist dann wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Mopidy_kind1&lt;br /&gt;
After=network.target sound.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=/etc/default/mopidy&lt;br /&gt;
ExecStart=/usr/bin/mopidy --quiet --config /etc/mopidy/kind1.conf&lt;br /&gt;
&lt;br /&gt;
# allow MPD to use real-time priority 50&lt;br /&gt;
LimitRTPRIO=50&lt;br /&gt;
LimitRTTIME=infinity&lt;br /&gt;
&lt;br /&gt;
# disallow writing to /usr, /bin, /sbin, ...&lt;br /&gt;
ProtectSystem=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abschließend sollten die 4 Instanzen durch den Aufruf von &amp;lt;pre&amp;gt;systemctl enable mopidy_kind1&amp;lt;/pre&amp;gt; usw. aktiviert werden. Es empfiehlt sich nach dem Start von Mopidy die korrekte Funtkionsweise mit dem [https://www.musicpd.org/clients/mpc/ MPC]-Client oder mit [http://rybczak.net/ncmpcpp/ NCMPCPP] auf der Konsole zu testen.&lt;br /&gt;
&lt;br /&gt;
Hierbei sollte es dann bereits möglich sein, die Multiroom-Fähigkeiten von Snapcast mit Hilfe des Android-Clients von Snapcast zu testen und so auch festzustellen, dass die restliche Konfiguration von Snapcast und Pulseaudio korrekt sind. &lt;br /&gt;
&lt;br /&gt;
=== FHEM ===&lt;br /&gt;
&lt;br /&gt;
In FHEM sind nun in der &#039;&#039;fhem.cfg&#039;&#039; die entsprechenden Module einzurichten:&lt;br /&gt;
* Ein Snapcast-Modul im Server Modus&lt;br /&gt;
* Pro Raum ein Snapcast-Modul im Clientmodus&lt;br /&gt;
* Pro Raum ein MPD-Modul&lt;br /&gt;
* Pro Raum ein OpenMultiroom-Modul&lt;br /&gt;
* Optional pro Raum ein Text2Speech-Modul&lt;br /&gt;
* weitere Text2Speech-Module, falls man diese in Pulseaudio mit dem per Combine-Sink vorgesehen hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          scs.snap              Snapcast&lt;br /&gt;
&lt;br /&gt;
define          scc.kind1             Snapcast          client scs.snap b827eb9aec84&lt;br /&gt;
  attr          scc.kind1             constraintDummy   freestring &lt;br /&gt;
  attr          scc.kind1             constraints       standard|07:00 0 20:00 100 21:00 50 21:30 30 24:00 0,beforefree|07:00 0 21:00 100 22:00 50 23:00 30 24:00 0,beforeschool|07:00 0 08:30 50 20:00 100 21:00 50 21:30 30 24:00 0,free|07:00 0 08:30 50 21:00 100 22:00 50 23:00 30 24:00 0&lt;br /&gt;
&lt;br /&gt;
define          scc.kind2             Snapcast          client scs.snap 025009413c29&lt;br /&gt;
  attr          scc.kind2             constraintDummy   freestring&lt;br /&gt;
  attr          scc.kind2             constraints       standard|07:00 0 20:15 100 20:30 50 24:00 0,beforefree|07:00 0 21:00 100 22:30 50 24:00 0,beforeschool|07:00 0 08:30 50 20:15 100 20:30 50 24:00 0,free|07:00 0 08:30 50 21:00 100 22:30 50 24:00 0&lt;br /&gt;
&lt;br /&gt;
define          scc.kueche            Snapcast          client scs.snap b827eb9a2ad3&lt;br /&gt;
&lt;br /&gt;
define          scc.wohn              Snapcast          client scs.snap 00aefa4aa3a9&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oben zu sehen ist das define für das Server-Modul. Ohne Parameter verbindet sich mit localhost auf dem Standardport 1705. Es folgt die Definition von 2 Clients. Der erste Parameter &amp;quot;client&amp;quot; versetzt das Snapcastmodul in den Clientmodus. Der zweite Parameter verweist auf das Servermodul, der dritte Parameter ist die Client-ID. Diese besteht bei der aktuellen Snapcast-Version meistens aus der MAC-Adresse des Clients. Für die Kinder werden noch die Attribute constraintDummy ond constraints vergeben. Hiermit wird eine tagestyp- und tageszeitabhängige Lautstärkebegrenzung konfiguriert. Für die vier Tagestypen &amp;quot;standard&amp;quot;, &amp;quot;beforefree&amp;quot;, &amp;quot;beforeschool&amp;quot; und &amp;quot;free&amp;quot; wird ein jeweils anderes Lautstärkezeitprofil definiert. &lt;br /&gt;
&lt;br /&gt;
Das Zeitprofil wird hier nach dem gleichen Muster wie die Temperaturlisten der Homematic-Thermostate, erklärt hier: [HomeMatic_Type_Thermostat]. Für den Tagestyp wird zusätzlich das Attribut constraintDummy verwendet. Es definiert, dass in dem Dummy &amp;quot;freestring&amp;quot; jeweils drin steht, welcher Tagestyp gerade ist. Diese Variable wirkt somit als Selektor auf die Liste der erlaubten Maximallautstärken. Wie eine solche Dummyvariable jeweils mit einem entsprechenden Wert befüllt werden kann, z.B. abhängig vom Wochentag, von Schulferien oder Feiertagen, wird hier nicht erläutert. Es ist auch möglich, nur ein Lautstärkeprofil anzugeben. Ohne dass ein Attribut constraintDummy gesetzt ist, verwendet das Snapcastmodul immer den Wert &amp;quot;standard&amp;quot;. Wie man hier sehen kann, gibt es im Beispiel 4 Typen, hierbei fallen Freitage normalerweise in die Kategorie &amp;quot;beforefree&amp;quot; (es sind Tage, bevor dann frei ist, es kann also typischerweise länger und lauter Musik gehört werden), Samstage normalerweise in die Kategorie &amp;quot;free&amp;quot; und Sonntage in die Kategorie &amp;quot;beforeschool&amp;quot;, ebenso landen dort Feiertage vor Schultagen usw. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          tts.wohn              Text2Speech       pulsewohn&lt;br /&gt;
  attr          tts.wohn              TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.wohn              TTS_UseMP3Wrap    true&lt;br /&gt;
  attr          tts.wohn              TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
&lt;br /&gt;
define          tts.kind1             Text2Speech       pulsekind1&lt;br /&gt;
  attr          tts.kind1             TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kind1             TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kind1             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kind2             Text2Speech       pulsekind2&lt;br /&gt;
  attr          tts.kind2             TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kind2             TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kind2             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kueche            Text2Speech       pulsekueche&lt;br /&gt;
  attr          tts.kueche            TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kueche            TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kueche            TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kinder            Text2Speech       pulsekinder&lt;br /&gt;
  attr          tts.kinder            TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kinder            TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kinder            TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.unten             Text2Speech       pulseunten&lt;br /&gt;
  attr          tts.unten             TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.unten             TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.unten             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.alle              Text2Speech       pulsealle&lt;br /&gt;
  attr          tts.alle              TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.alle              TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.alle              TTS_UseMP3Wrap    true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind die Definitionen der Text2Speech Module zu sehen (optional). Sie werden jeweils mit den in Pulseaudio definierten Sinks verbunden. Die Nutzung eines TemplateDirs ist ebenfalls optional, hier können bereits fertige MP3s verwendet werden, die dann anstelle der von der Google TTS API erzeugten Dateien benutzt werden. Dies können auch Bestätigungs und Fehlertöne sein, die bei Benutzern ohne Display, die rein mit Fernbedienung arbeiten, auf Fehlbedienungen etc. aufmerksam zu omrhen. Der Aufruf von mplayer wird noch modifiziert, um dafür zu sorgen, dass die Ausgabe bei Pulseaudio als media.role &amp;quot;announcement&amp;quot; eingehen. Dies wird dann vom duck-Modul erkannt, und führt dazu, dass die Lautstärke der ggf. ablaufenden Musik, etc. abgesenkt wird, so lange die tts-Ausgabe läuft. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          mpd.kind1              MPD               192.168.2.2 6600&lt;br /&gt;
  attr          mpd.kind1              player            mopidy&lt;br /&gt;
  attr          mpd.kind1              bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.kind1              autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.kind2             MPD               192.168.2.2 6702&lt;br /&gt;
  attr          mpd.kind2             player            mopidy&lt;br /&gt;
  attr          mpd.kind2             bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.kind2             autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.kueche            MPD               192.168.2.2 6703&lt;br /&gt;
  attr          mpd.kueche            player            mopidy&lt;br /&gt;
  attr          mpd.kueche            bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.kueche            autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.wohn              MPD               192.168.2.2 6704&lt;br /&gt;
  attr          mpd.wohn              player            mopidy&lt;br /&gt;
  attr          mpd.wohn              bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.wohn              autoBookmark      1 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pro laufender MPD oder Mopidy-Instanz wird ein MPD-Modul eingerichtet. Der Hostname und die Ports sind entsprechend anzupassen. Durch die bookmarkDir und autoBookmark - Attribute wird erreicht, dass der Zustand von Playlisten beim Wechsel derselben gespeichert und später wiederhergestellt werden kann. So lässt sich das Hören eines Hörbuchs unterbrechen, auf z.B. eine Radiostreamplayliste schalten, um dann später zur gleichen Stelle im Hörbuch zurückzukehren. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          omr.kind1              OpenMultiroom&lt;br /&gt;
  attr          omr.kind1              mr                scc.kind1&lt;br /&gt;
  attr          omr.kind1              soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.kind1              playlistPattern   kind1&lt;br /&gt;
  attr          omr.kind1              ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.kind1              defaultTts        tts.kind1&lt;br /&gt;
  attr          omr.kind1              defaultStream     kind1&lt;br /&gt;
  attr          omr.kind1              defaultSound      mpd.kind1&lt;br /&gt;
&lt;br /&gt;
define          omr.kind2             OpenMultiroom&lt;br /&gt;
  attr          omr.kind2             mr                scc.kind2&lt;br /&gt;
  attr          omr.kind2             soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.kind2             playlistPattern   kind2&lt;br /&gt;
  attr          omr.kind2             ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.kind2             defaultTts        tts.kind2&lt;br /&gt;
  attr          omr.kind2             defaultStream     kind2&lt;br /&gt;
  attr          omr.kind2             defaultSound      mpd.kind2&lt;br /&gt;
&lt;br /&gt;
define          omr.kueche            OpenMultiroom&lt;br /&gt;
  attr          omr.kueche            mr                scc.kueche&lt;br /&gt;
  attr          omr.kueche            soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.kueche            playlistPattern   wohn&lt;br /&gt;
  attr          omr.kueche            ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.kueche            defaultTts        tts.kueche&lt;br /&gt;
  attr          omr.kueche            defaultStream     kueche&lt;br /&gt;
  attr          omr.kueche            defaultSound      mpd.kueche&lt;br /&gt;
&lt;br /&gt;
define          omr.wohn              OpenMultiroom&lt;br /&gt;
  attr          omr.wohn              mr                scc.wohn&lt;br /&gt;
  attr          omr.wohn              soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.wohn              playlistPattern   wohn&lt;br /&gt;
  attr          omr.wohn              ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.wohn              defaultTts        tts.wohn&lt;br /&gt;
  attr          omr.wohn              defaultStream     wohn&lt;br /&gt;
  attr          omr.wohn              defaultSound      mpd.wohn&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Konfiguration der OpenMultiroom-Module schließt die Einrichtung von FHEM ab. Jede Instanz benötigt mindestens das &amp;quot;mr&amp;quot;- und das &amp;quot;soundMapping&amp;quot;-Attribut. Nur so kann sich das Modul mit den entsprechenden Snapcast und MPD-Modulen verbinden. Durch das &amp;quot;mr&amp;quot;-Attribut wird ein OpenMultiroom-Modul einem Snapcast-Client-Modul fest zugeordnet. Das Soundmapping ordnet die in Snapcast definierten Streams (siehe oben, Konfiguration vom Snapserver) den entsprechenden Instanzen des MPD-Moduls zu. Dadurch weiß FHEM, welcher MPD auf welchem Stream abspielt und kann je nachdem, welchem Stream ein Raum gerade zuhört, den dazu passenden MPD steuern und seine Readings durchreichen. Das OpenMultiroom-Modul bildet alle Readings des MPD-Moduls nochmal direkt ab. Wechselt ein Benutzer aber den Stream, dem er zuhört, aktualisieren sich auch alle Readings dementsprechend mit denen des dann aktuellen MPD-Moduls. &lt;br /&gt;
&lt;br /&gt;
Das Attribut playlistPattern ist optional und sorgt dafür, dass beim Durchschalten der Playlists mit den Kommandos &amp;quot;channelUp&amp;quot; und &amp;quot;channelDown&amp;quot; nur diejenigen Playlists berücksichtigt werden, die auf das Pattern passen. &lt;br /&gt;
&lt;br /&gt;
Analog zum soundMapping definiert das Attribut ttsMapping die Zuordnung der TTS-Module zu den Streams. Beim Ausgeben von Announcement kann so das OpenMultiroom-Modul ermitteln, auf welchem Stream welcher Raum gerade zuhört, und wo dementsprechend die TTS-Ausgaben zu erzeugen sind, damit sie auch in den gewünschten Räumen ankommen. Dieser Umweg ist zurzeit nötig, da ein Snapcast-Client nur auf einem einzigen Stream lauschen kann. Lauschen noch andere Clients auf demselben Stream, hören sie allerdings zwangsweise auch die Announcements.&lt;br /&gt;
&lt;br /&gt;
Die 3 Default-Attribute legen fest, welche der TTS-Module, welcher Stream und welcher MPD dem entsprechenden Modul fest zugeordnet sind. Dies wird u.a. von einer Resetfunktion im Modul verwendet. &lt;br /&gt;
&lt;br /&gt;
== Bedienung des OpenMultiroom-Moduls ==&lt;br /&gt;
&lt;br /&gt;
=== set-Kommandos ===&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
&lt;br /&gt;
== Anbindung einer Fernbedienung an ein OpenMultiroom-Modul ==&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration von LIRC und IRExec === &lt;br /&gt;
&lt;br /&gt;
=== Zuordnung der Tasten: Beispiel === &lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=37477</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=37477"/>
		<updated>2022-06-22T09:58:47Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right&amp;quot;&amp;gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuern der einzelnen Multiroom-Systemkomponenten&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=OpenMultiroom&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=98_OpenMultiroom.pm&lt;br /&gt;
|ModOwner=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuern eines Snapcast-Servers&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=Snapcast&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=96_Snapcast.pm&lt;br /&gt;
|ModOwner=orphan/rudolphkoenig&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends {{Link2Forum|Topic=18517|LinkText=MPD}} und {{Link2Forum|Topic=62389|LinkText=Snapcast}} sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Das Modul ist noch sehr neu und bisher nur im {{Link2Forum|Topic=65785|LinkText=Forum}} bzw. auf dem [https://github.com/unimatrix27/fhemmodules/blob/master/98_OpenMultiroom.pm Github des Autors] verfügbar. Sobald alles stabil ist, wird es im SVN eingestellt. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OpenMultiroom&#039;&#039;&#039; ist ein Steuerungsmodul sowie auch ein Gesamtkonzept zur Realisierung eines Multiroom-Audio-Systems unter Nutzung von ausschließlich frei verfügbarer Software und ohne Bezug auf die Hardware eines bestimmten Herstellers. Es ist so ausgelegt, dass es prinzipiell flexibel bezüglich der Auswahl der Backendsysteme ist. Zurzeit ist es für die Nutzung mit [https://www.musicpd.org/ MPD] bzw. [https://www.mopidy.com/ Mopidy] und [https://github.com/badaix/snapcast Snapcast] implementiert. Daher wird in diesem WIKI-Eintrag immer von diesen Systemen gesprochen. Einen grundsätzlichen Überblick über das Konzept bietet das Schaubild.&lt;br /&gt;
&lt;br /&gt;
== Grobe Übersicht des Funktionsumfangs der Gesamtlösung==&lt;br /&gt;
=== Features ===&lt;br /&gt;
* Integrierte Steuerung des Musikplayers über das [[MPD]]-Modul sowie des Multiroom-System {{Link2Forum|Topic=62389|LinkText=Snapcast}} in einem einzigen Modul&lt;br /&gt;
* Implementierung einer Schnittstelle gemäß [[DevelopmentGuidelinesAV]] als Basis für eine Visualisierung mit z.B. [[SmartVISU]] oder [[FHEM Tablet UI]]&lt;br /&gt;
* Synchrones Playback auf z.B. Raspberry Pi oder Android-Geräten (Snapcast-Feature)&lt;br /&gt;
* optionale Komprimierung der Soundübertragung als OGG oder FLAC (Snapcast-Feature)&lt;br /&gt;
* Möglichkeit der Bedienung völlig ohne Display über eine Fernbedienung und entsprechender Text2Speech Rückmeldung, insbesondere&lt;br /&gt;
** Durschalten von Playlisten mit entsprechenden Channel - Tasten unter Nutzung von raumspezifischen Filtern&lt;br /&gt;
** Forward und Rewind mit definierbaren Sprungweiten (implementiert direkt im [[MPD]]-Modul)&lt;br /&gt;
** Direktanwahl von Playlisten, Tracks oder Trackpositionen durch Zifferneingabe und anschließende Funktionstaste&lt;br /&gt;
** Abfrage von Statusinformationen durch Funktionstasten und Text2Speech Rückmeldungen&lt;br /&gt;
** Mithören in anderen Räumen und Übernahme des Playerzustandes anderer Räume durch Nutzung von Funktionstasten&lt;br /&gt;
** Einschlaftimer per Zifferneingabe oder per vordefinierten Zeitabständen, hierbei wird auch die Restlaufzeit des aktuellen Tracks angeboten.&lt;br /&gt;
* manuelles oder automatisches Speichern und Laden von Playlistbookmarks (implementiert direkt im [[MPD]]-Modul)&lt;br /&gt;
* Möglichkeit der Festlegung von tageszeit- und tagestypabhängigen Lautstärkebegrenzungen bis auf 0% z.B. für Kinderzimmer&lt;br /&gt;
* individuelles Verwalten von Playlisten für verschiedene Familienmitglieder&lt;br /&gt;
* Nutzung des Audiosystems für systemunabhängige FHEM-Announcements. Ein entsprechendes Announcement-Modul ist in Planung. Dabei können mehrere Räume gleichzeitig oder auch getrennt angesprochen werden&lt;br /&gt;
&lt;br /&gt;
=== Anwendungszweck und Kurzbeschreibung der Funktionsweise ===&lt;br /&gt;
Wie der Name des Systems vermuten lässt, ist die Lösung vor allem dann sinnvoll einzusetzen, wenn Audiodateien in mindestens 2 verschiedenen Räumen oder &amp;quot;Zonen&amp;quot; sowohl synchron als auch unabhängig abgespielt werden soll und wenn hierzu eine komfortable und integrierte Steuerung über FHEM verwendet werden soll. Mit Einschränkungen ist die Lösung auch dann sinnvoll, wenn es nur um das Abspielen in einem Raum geht. Hier kann dann z.B. die Steuerung über eine Fernbedienung mit Hilfe des &#039;&#039;&#039;OpenMultiroom&#039;&#039;&#039;-Moduls genutzt werden, die über eine reine Nutzung des MPD-Moduls hinausgeht. &lt;br /&gt;
&lt;br /&gt;
Für die Nutzung ist nicht zwingend ein zentraler Server notwendig. Diese Rolle kann auch von einem der Clients übernommen werden, z.B. einem Pi. Zur einfacheren Darstellung wird in diesem Eintrag jedoch immer von der Nutzung eines Servers ausgegangen, der nicht gleichzeitig auch Client ist. &lt;br /&gt;
&lt;br /&gt;
Das Abspielen von Audio funktioniert prinzipiell in 2 Stufen: &lt;br /&gt;
# Nutzung von MPD oder einem MPD-kompatiblen Player zum direkten Abspielen von Sounddateien. Pro existierendem Raum gibt es mindestens eine Instanz von MPD. Hier wird davon ausgegangen, dass es genau eine Instanz pro Raum gibt. Jeder Raum hat also &amp;quot;seinen&amp;quot; MPD. &lt;br /&gt;
# Nutzung von Snapcast zur Verteilung des von MPD abgespielten Sounds an den entsprechenden Raum. Snapcast übernimmt hierbei die zeitliche Synchronisation&lt;br /&gt;
&lt;br /&gt;
Durch das Modul &#039;&#039;&#039;OpenMultiroom&#039;&#039;&#039; steuert der Nutzer sowohl MPD als auch Snapcast. Für jeden Raum wird eine Instanz des Moduls definiert. &lt;br /&gt;
&lt;br /&gt;
=== Verwendete Komponenten ===&lt;br /&gt;
Folgende Komponenten kommen zum Einsatz:&lt;br /&gt;
&lt;br /&gt;
==== Server: ====&lt;br /&gt;
* MPD oder Mopidy oder ein anderer MPD-kompatibler Player. 1 Instanz pro Raum&lt;br /&gt;
* Snapserver&lt;br /&gt;
* mplayer (bei Nutzung von Text 2 Speech)&lt;br /&gt;
* Optional Pulseaudio (im System-Mode) bei Nutzung von Text 2 Speech oder erweiterten Konfigurationen. Hierbei wird Pulseaudio zwischen MPD und Snapcast geschaltet. &lt;br /&gt;
* Optional Anbindung an Subsonic oder Libresonic (hier zurzeit nicht beschrieben) zur Synchronisation von Playlisten uvm. &lt;br /&gt;
* FHEM: Modul 98_OpenMultiroom.pm&lt;br /&gt;
* FHEM: Modul 96_Snapcast.pm&lt;br /&gt;
* FHEM: Modul [[MPD|73_MPD.pm]]&lt;br /&gt;
* FHEM: Optional Modul 98_Text2Speech.pm&lt;br /&gt;
&lt;br /&gt;
==== Client: ====&lt;br /&gt;
* Linux: Alsa oder Pulseaudio zur Soundwiedergabe&lt;br /&gt;
* Linux: Snapclient&lt;br /&gt;
* Android: Nur der Android Snapclient&lt;br /&gt;
* Webbrowser zur Steuerung per Visualisierung&lt;br /&gt;
* ggf. Infrarot oder Funkfernbedienung. In diesem Artikel wird das Beispiel anhand der Nutzung von X10-Funkfernbedienungen gezeigt, diese gibt es sehr günstig in der Bucht o.ä.&lt;br /&gt;
* Vision: Nutzung von Tastern und Display am PI oder Nutzung eines Steuergerätes mit Tastern und Display auf Basis eines Arduino mit WLAN, z.B. im alten Gehäuse eines Küchenradios usw. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aufbau anhand einer vollständigen Beispielkonfiguration ==&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel soll beispielhaft eine vollständige Konfiguration gezeigt werden. Jeder Nutzer muss diese Konfiguration an seine eigenen Bedürfnisse anpassen. Es seien folgende Komponenten vorhanden:&lt;br /&gt;
&lt;br /&gt;
* Server mit Ubuntu 16.04, hier befindet sich eine MP3-Sammlung&lt;br /&gt;
* Kind1: Raspberry Pi Model 1 mit Raspbian&lt;br /&gt;
* Kind2: BananaPi mit Ubuntu, an diesem Pi ist auch ein X10 Empfänger angeschlossen, da er zentral im Haus positioniert ist&lt;br /&gt;
* Wohnzimmer: Raspberry Pi3 mit OSMC und KODI, wird primär zum Fernsehen verwendet&lt;br /&gt;
* Küche: Raspberry Pi Model 1 mit Raspbian&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Es ist möglich, mehrere Räume mit nur einem physikalischen Client zu bedienen. Hierbei werden auf einem Client mehrere Instanzen des Snapclients laufen gelassen. Der physikalische Client hat dann z.B. mehrere USB Soundkarten, dessen Audioausgänge in verschiedene Räume verkabelt sind. Dies wird hier zurzeit nicht näher beschrieben. &lt;br /&gt;
&lt;br /&gt;
=== Pulseaudio Konfiguration ===&lt;br /&gt;
Will man Pulseaudio verwenden, z.B. um Text2Speech Nachrichten in laufende Musik einzublenden, sollte dieses am besten zuerst konfiguriert werden. Pulseaudio muss hierzu im System-Mode laufen. Dies ist auf einem Headless-Server kein Problem. Bei Ubuntu 16.10 wird dies durch folgenden Inhalt in &#039;&#039;/etc/systemd/system/pulseaudio.server&#039;&#039; erreicht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=PA&lt;br /&gt;
After=network.target sound.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=/usr/bin/pulseaudio --system&lt;br /&gt;
&lt;br /&gt;
# allow MPD to use real-time priority 50&lt;br /&gt;
LimitRTPRIO=50&lt;br /&gt;
LimitRTTIME=infinity&lt;br /&gt;
&lt;br /&gt;
# disallow writing to /usr, /bin, /sbin, ...&lt;br /&gt;
ProtectSystem=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Weiterhin ist der Befehl&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo systemctl enable pulseaudio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
einzugeben, um Pulseaudio beim Systemstart automatisch zu starten.&lt;br /&gt;
&lt;br /&gt;
Ausgehend von der Standardkonfiguration werden nun in  &#039;&#039;/etc/pulse/system.pa&#039;&#039; die benötigten Module eingetragen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
load-module module-pipe-sink file=/tmp/wohn.fifo   sink_name=wohn&lt;br /&gt;
load-module module-pipe-sink file=/tmp/kind1.fifo   sink_name=kind1&lt;br /&gt;
load-module module-pipe-sink file=/tmp/kind2.fifo  sink_name=kind2&lt;br /&gt;
load-module module-pipe-sink file=/tmp/kueche.fifo sink_name=kueche&lt;br /&gt;
&lt;br /&gt;
load-module module-combine-sink slaves=kind1,kind2 sink_name=kinder&lt;br /&gt;
load-module module-combine-sink slaves=wohn,kueche sink_name=unten&lt;br /&gt;
load-module module-combine-sink slaves=wohn,kueche,kind1,kind2 sink_name=alle&lt;br /&gt;
&lt;br /&gt;
pactl load-module module-role-ducking trigger_roles=announcement ducking_roles=music&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Snapcast benötigt die Audioquelle in Form von FIFOs. Daher wird hier in den erstem 4 Zeilen je ein FIFO von Pulseaudio erzeugt. Der sink_name wird später bei der Konfiguration von MPD als Ausgang verwendet. In den 3 weiteren Zeilen werden noch 3 Sinks als Combine-Sinks erstellt. Diese erzeugen keine neuen FIFOs, sondern machen unter entsprechenden Sink-Namen eine vorgegebene Kombination von Räumen nach außen hin verfügbar. Der Sink &amp;quot;alle&amp;quot; kann also genutzt werden, um Audio auf allen 4 FIFOs gleichzeitig abzuspielen (und somit später potentiell in allen Räumen gleichzeitig). Dies kann für Announcements sinnvoll sein. Die Nutzung dieser Combine-Sinks ist optional. Ebenso optional ist das Laden des Ducking-Moduls am Ende. Das Ducking Modul führt dazu, dass Pulseaudio automatisch die Lautstärke der durch MPD abgespielten Tracks absenkt, wenn etwas über die Text2Speech-Module abgespielt wird. Ohne dies sind die Ausgaben speziell über die Google API unter Umständen nur schwer hörbar. &lt;br /&gt;
&lt;br /&gt;
=== Snapcast Konfiguration ===&lt;br /&gt;
[https://github.com/badaix/snapcast Snapcast] muss entsprechend der Angaben auf der Webseite installiert werden. Auf dem Server muss logischerweise die Serverkomponente und auf den Clients die Clientkomponente installiert werden. Bei Android-Clients wird die auf der Webseite zur Verfügung gestellt APK installiert. Snapcast befindet sich selbst noch in fortlaufender Entwicklung. Die hier vorgestellte Lösung ist mit [https://github.com/badaix/snapcast/tree/98be8a58d945f84af50e40ebcf8a774592dd6e7b dieser Version] kompatibel und getestet. &lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Servers beschränkt sich auf die Definition der Streams in &#039;&#039;/etc/default/snapserver&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_SNAPSERVER=true&lt;br /&gt;
SNAPSERVER_OPTS=&amp;quot;-d -s pipe:///tmp/kind1.fifo?name=kind1&amp;amp;mode=read -s pipe:///tmp/kind2.fifo?name=kind2&amp;amp;mode=read -s pipe:///tmp/wohn.fifo?name=wohn&amp;amp;mode=read -s pipe:///tmp/kueche.fifo?name=kueche&amp;amp;mode=read&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier werden die 4 Streams erstellt, diese entsprechen vom Dateinamen her der Pulseaudiokonfiguration. Der hier verwendete Name kann später in FHEM oder auch im Android-Client angezeigt werden. Die Option &amp;lt;pre&amp;gt;mode=read&amp;lt;/pre&amp;gt; ist wichtig, weil Pulseaudio meckert, wenn es die FIFO-Dateien nicht selbst anlegen darf. &lt;br /&gt;
&lt;br /&gt;
Auf der Clientseite sieht die Datei &#039;&#039;/etc/default/snapclient&#039;&#039; dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_SNAPCLIENT=true&lt;br /&gt;
SNAPCLIENT_OPTS=&amp;quot;-d -s dmix:CARD=Aureon51MkII,DEV=0&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Den Server findet der Snapclient automatisch, er kann aber auch angegeben werden. Wie hier zu sehen kann ein spezielles Output-Device angegeben werden. Dies ist bei den PIs mit externer USB-Soundkarte meistens notwendig, da ansonsten der interne Sound genutzt würde. Eine Liste der verfügbaren Devices wird mit dem Aufruf von &amp;lt;pre&amp;gt;snapclient -l&amp;lt;/pre&amp;gt; ausgegeben, hier muss dann das passende genommen werden. GGf. so lange ausprobieren, bis der Sound an der richtigen Stelle rauskommt.&lt;br /&gt;
&lt;br /&gt;
In der hier betrachteten Konfiguration soll auf dem Wohnzimmer-PI ein Snapclient laufen, dieser wird aber normalerweise zum TV und Filme schauen mit KODI verwendet. Sowohl KODI als auch der Snapclient blockieren aber das ALSA-Device und funktionieren beide meistens entweder gar nicht oder nicht richtig zusammen, insbesondere dann nicht, wenn von KODI Mehrkanalsound oder sogar Passthrough ausgegeben wird. Die Entwicklung eines nativen Snapcast-Clients innerhalb von KODI wird gerade an verschiedenen Stellen diskutiert, z.B. [https://github.com/badaix/snapcast/issues/155 hier]. Bis dahin kann ein kleiner Workaround Abhilfe schaffen. Mit folgendem (nur rudimentär getesteten) [https://github.com/unimatrix27/snapcast/commit/88e42a2ecc8b44223701e18abb63af04b673b67b Hack] für den Snapcast-Client wird erreicht, dass der Client das ALSA-Device frei gibt, sobald er über den Server auf Mute gestellt wird. KODI selbst gibt das Device ebenfalls frei, wenn es im Zustand &amp;quot;Stop&amp;quot; ist. Bei dieser Lösung kann der Snapclient auf dem KODI-Rechner immer laufen gelassen werde. Es ist jedoch in der Verantwortung des Benutzers, den Client zu &amp;quot;muten&amp;quot;. Vergisst er dies, wird ggf. die Wiedergabe in KODI nicht möglich sein. &lt;br /&gt;
&lt;br /&gt;
Nach Abschluss der Snapcastkonfiguration und dem Starten von Server und den Clients empfiehlt es sich, die Android-App ebenfalls zu verwenden, da diese einen schnellen Überblick über den Zustand des Servers, der konfigurierten Streams und der Clients bietet.&lt;br /&gt;
&lt;br /&gt;
=== Mopidy Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Mopidy als MPD-Ersatz verwendet, genau so gut kann aber auch direkt MPD verwendet werden. Die genauen Konfigurationsoptionen sind natürlich anders, und jeweils in entsprechenden Tutorials oder Dokumentationen beschrieben. Mopidy ist relativ umfangreich und modular aufgebaut, es bietet u.a. die Möglichkeit, neben lokal gespeicherten Dateien auch Dateien von verschiedenen, teilweise kommerziellen, Streamingdiensten abzuspielen. Die Detailkonfiguration all dieser Komponenten geht über diesen Artikel hinaus. Entscheidend hier ist die Konfiguration in einer Weise, so dass mehrere Mopidy-Instanzen gleichzeitig ausgeführt werden können und dann auf unterschiedlichen Ports zur Verfügung stehen. &lt;br /&gt;
&lt;br /&gt;
Nach Installation von Mopidy findet sich die Konfiguration in der Datei &#039;&#039;/etc/mopidy/mopidy.cfg&#039;&#039;. Mopidy unterstützt hierarische Konfigurationen, es reicht also, den für jede Instanz spezifischen Teil aus dieser allgemeinen Konfiguration zu entfernen und in jeweils eigene Dateien zu verschieben. In diesem Beispiel sollen das die Dateien &#039;&#039;/etc/mopidy/kind1.conf&#039;&#039; bis &#039;&#039;/etc/mopidy/kueche.conf&#039;&#039; sein. Die folgenden Zeilen gehören jeweils in diese 4 Dateien und werden dort entsprechend angepasst. Hier das Beispiel für Kind2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[logging]&lt;br /&gt;
config_file = /etc/mopidy/logging_kind2.conf&lt;br /&gt;
debug_file = /var/log/mopidy/mopidy-debug_kind2.log&lt;br /&gt;
&lt;br /&gt;
[audio]&lt;br /&gt;
output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! pulsesink  device=kind2  stream-properties=&amp;quot;props,media.role=music&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[mpd]&lt;br /&gt;
enabled = true&lt;br /&gt;
hostname = 0.0.0.0&lt;br /&gt;
port=6601&lt;br /&gt;
&lt;br /&gt;
[http]&lt;br /&gt;
enabled = true&lt;br /&gt;
hostname =  0.0.0.0&lt;br /&gt;
port=6681&lt;br /&gt;
zeroconf = Musik Kind2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Audioteil wird der entsprechende Sink aus der Pulseaudiokonfiguration genommen. Die Angabe von stream-properties ermöglicht dem Duck-Modul den Stream als Musik zu erkennen und beim Abspielen von Announcements in der Lautstärke abzusenken. Beim MPD muss der Port für jede Instanz unterschiedlich sein, ebenso beim HTTP-Modul für die Weboberfläche der jeweiligen Instanz. Der Zerokonfname sollte auch eindeutig sein. Neben dieser Datei ist noch die dazu passende logging-Konfiguration anzulegen, hier also &#039;&#039;/etc/mopidy/logging_kind2.conf&#039;&#039;. Dazu wird die Standarddatei kopiert und darin nur der Name der Logdatei angepasst.&lt;br /&gt;
&lt;br /&gt;
Um nun auch die entsprechende Anzahl Instanzen automatisch zu starten, sind die entsprechenden Startdateien anzulegen. Dazu kann die Datei &#039;&#039;/etc/systemd/system/mopidy.cfg&#039;&#039; z.B. in &#039;&#039;/etc/systemd/system/mopidy_kind1.cfg&#039;&#039; umbenannt werden und dann 3 mal mit den Endungen der anderen Instanzen kopiert werden. Der Inhalt ist dann wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Mopidy_kind1&lt;br /&gt;
After=network.target sound.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=/etc/default/mopidy&lt;br /&gt;
ExecStart=/usr/bin/mopidy --quiet --config /etc/mopidy/kind1.conf&lt;br /&gt;
&lt;br /&gt;
# allow MPD to use real-time priority 50&lt;br /&gt;
LimitRTPRIO=50&lt;br /&gt;
LimitRTTIME=infinity&lt;br /&gt;
&lt;br /&gt;
# disallow writing to /usr, /bin, /sbin, ...&lt;br /&gt;
ProtectSystem=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abschließend sollten die 4 Instanzen durch den Aufruf von &amp;lt;pre&amp;gt;systemctl enable mopidy_kind1&amp;lt;/pre&amp;gt; usw. aktiviert werden. Es empfiehlt sich nach dem Start von Mopidy die korrekte Funtkionsweise mit dem [https://www.musicpd.org/clients/mpc/ MPC]-Client oder mit [http://rybczak.net/ncmpcpp/ NCMPCPP] auf der Konsole zu testen.&lt;br /&gt;
&lt;br /&gt;
Hierbei sollte es dann bereits möglich sein, die Multiroom-Fähigkeiten von Snapcast mit Hilfe des Android-Clients von Snapcast zu testen und so auch festzustellen, dass die restliche Konfiguration von Snapcast und Pulseaudio korrekt sind. &lt;br /&gt;
&lt;br /&gt;
=== FHEM ===&lt;br /&gt;
&lt;br /&gt;
In FHEM sind nun in der &#039;&#039;fhem.cfg&#039;&#039; die entsprechenden Module einzurichten:&lt;br /&gt;
* Ein Snapcast-Modul im Server Modus&lt;br /&gt;
* Pro Raum ein Snapcast-Modul im Clientmodus&lt;br /&gt;
* Pro Raum ein MPD-Modul&lt;br /&gt;
* Pro Raum ein OpenMultiroom-Modul&lt;br /&gt;
* Optional pro Raum ein Text2Speech-Modul&lt;br /&gt;
* weitere Text2Speech-Module, falls man diese in Pulseaudio mit dem per Combine-Sink vorgesehen hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          scs.snap              Snapcast&lt;br /&gt;
&lt;br /&gt;
define          scc.kind1             Snapcast          client scs.snap b827eb9aec84&lt;br /&gt;
  attr          scc.kind1             constraintDummy   freestring &lt;br /&gt;
  attr          scc.kind1             constraints       standard|07:00 0 20:00 100 21:00 50 21:30 30 24:00 0,beforefree|07:00 0 21:00 100 22:00 50 23:00 30 24:00 0,beforeschool|07:00 0 08:30 50 20:00 100 21:00 50 21:30 30 24:00 0,free|07:00 0 08:30 50 21:00 100 22:00 50 23:00 30 24:00 0&lt;br /&gt;
&lt;br /&gt;
define          scc.kind2             Snapcast          client scs.snap 025009413c29&lt;br /&gt;
  attr          scc.kind2             constraintDummy   freestring&lt;br /&gt;
  attr          scc.kind2             constraints       standard|07:00 0 20:15 100 20:30 50 24:00 0,beforefree|07:00 0 21:00 100 22:30 50 24:00 0,beforeschool|07:00 0 08:30 50 20:15 100 20:30 50 24:00 0,free|07:00 0 08:30 50 21:00 100 22:30 50 24:00 0&lt;br /&gt;
&lt;br /&gt;
define          scc.kueche            Snapcast          client scs.snap b827eb9a2ad3&lt;br /&gt;
&lt;br /&gt;
define          scc.wohn              Snapcast          client scs.snap 00aefa4aa3a9&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oben zu sehen ist das define für das Server-Modul. Ohne Parameter verbindet sich mit localhost auf dem Standardport 1705. Es folgt die Definition von 2 Clients. Der erste Parameter &amp;quot;client&amp;quot; versetzt das Snapcastmodul in den Clientmodus. Der zweite Parameter verweist auf das Servermodul, der dritte Parameter ist die Client-ID. Diese besteht bei der aktuellen Snapcast-Version meistens aus der MAC-Adresse des Clients. Für die Kinder werden noch die Attribute constraintDummy ond constraints vergeben. Hiermit wird eine tagestyp- und tageszeitabhängige Lautstärkebegrenzung konfiguriert. Für die vier Tagestypen &amp;quot;standard&amp;quot;, &amp;quot;beforefree&amp;quot;, &amp;quot;beforeschool&amp;quot; und &amp;quot;free&amp;quot; wird ein jeweils anderes Lautstärkezeitprofil definiert. &lt;br /&gt;
&lt;br /&gt;
Das Zeitprofil wird hier nach dem gleichen Muster wie die Temperaturlisten der Homematic-Thermostate, erklärt hier: [HomeMatic_Type_Thermostat]. Für den Tagestyp wird zusätzlich das Attribut constraintDummy verwendet. Es definiert, dass in dem Dummy &amp;quot;freestring&amp;quot; jeweils drin steht, welcher Tagestyp gerade ist. Diese Variable wirkt somit als Selektor auf die Liste der erlaubten Maximallautstärken. Wie eine solche Dummyvariable jeweils mit einem entsprechenden Wert befüllt werden kann, z.B. abhängig vom Wochentag, von Schulferien oder Feiertagen, wird hier nicht erläutert. Es ist auch möglich, nur ein Lautstärkeprofil anzugeben. Ohne dass ein Attribut constraintDummy gesetzt ist, verwendet das Snapcastmodul immer den Wert &amp;quot;standard&amp;quot;. Wie man hier sehen kann, gibt es im Beispiel 4 Typen, hierbei fallen Freitage normalerweise in die Kategorie &amp;quot;beforefree&amp;quot; (es sind Tage, bevor dann frei ist, es kann also typischerweise länger und lauter Musik gehört werden), Samstage normalerweise in die Kategorie &amp;quot;free&amp;quot; und Sonntage in die Kategorie &amp;quot;beforeschool&amp;quot;, ebenso landen dort Feiertage vor Schultagen usw. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          tts.wohn              Text2Speech       pulsewohn&lt;br /&gt;
  attr          tts.wohn              TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.wohn              TTS_UseMP3Wrap    true&lt;br /&gt;
  attr          tts.wohn              TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
&lt;br /&gt;
define          tts.kind1             Text2Speech       pulsekind1&lt;br /&gt;
  attr          tts.kind1             TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kind1             TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kind1             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kind2             Text2Speech       pulsekind2&lt;br /&gt;
  attr          tts.kind2             TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kind2             TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kind2             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kueche            Text2Speech       pulsekueche&lt;br /&gt;
  attr          tts.kueche            TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kueche            TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kueche            TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kinder            Text2Speech       pulsekinder&lt;br /&gt;
  attr          tts.kinder            TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kinder            TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kinder            TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.unten             Text2Speech       pulseunten&lt;br /&gt;
  attr          tts.unten             TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.unten             TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.unten             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.alle              Text2Speech       pulsealle&lt;br /&gt;
  attr          tts.alle              TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.alle              TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.alle              TTS_UseMP3Wrap    true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind die Definitionen der Text2Speech Module zu sehen (optional). Sie werden jeweils mit den in Pulseaudio definierten Sinks verbunden. Die Nutzung eines TemplateDirs ist ebenfalls optional, hier können bereits fertige MP3s verwendet werden, die dann anstelle der von der Google TTS API erzeugten Dateien benutzt werden. Dies können auch Bestätigungs und Fehlertöne sein, die bei Benutzern ohne Display, die rein mit Fernbedienung arbeiten, auf Fehlbedienungen etc. aufmerksam zu omrhen. Der Aufruf von mplayer wird noch modifiziert, um dafür zu sorgen, dass die Ausgabe bei Pulseaudio als media.role &amp;quot;announcement&amp;quot; eingehen. Dies wird dann vom duck-Modul erkannt, und führt dazu, dass die Lautstärke der ggf. ablaufenden Musik, etc. abgesenkt wird, so lange die tts-Ausgabe läuft. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          mpd.kind1              MPD               192.168.2.2 6600&lt;br /&gt;
  attr          mpd.kind1              player            mopidy&lt;br /&gt;
  attr          mpd.kind1              bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.kind1              autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.kind2             MPD               192.168.2.2 6702&lt;br /&gt;
  attr          mpd.kind2             player            mopidy&lt;br /&gt;
  attr          mpd.kind2             bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.kind2             autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.kueche            MPD               192.168.2.2 6703&lt;br /&gt;
  attr          mpd.kueche            player            mopidy&lt;br /&gt;
  attr          mpd.kueche            bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.kueche            autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.wohn              MPD               192.168.2.2 6704&lt;br /&gt;
  attr          mpd.wohn              player            mopidy&lt;br /&gt;
  attr          mpd.wohn              bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.wohn              autoBookmark      1 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pro laufender MPD oder Mopidy-Instanz wird ein MPD-Modul eingerichtet. Der Hostname und die Ports sind entsprechend anzupassen. Durch die bookmarkDir und autoBookmark - Attribute wird erreicht, dass der Zustand von Playlisten beim Wechsel derselben gespeichert und später wiederhergestellt werden kann. So lässt sich das Hören eines Hörbuchs unterbrechen, auf z.B. eine Radiostreamplayliste schalten, um dann später zur gleichen Stelle im Hörbuch zurückzukehren. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          omr.kind1              OpenMultiroom&lt;br /&gt;
  attr          omr.kind1              mr                scc.kind1&lt;br /&gt;
  attr          omr.kind1              soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.kind1              playlistPattern   kind1&lt;br /&gt;
  attr          omr.kind1              ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.kind1              defaultTts        tts.kind1&lt;br /&gt;
  attr          omr.kind1              defaultStream     kind1&lt;br /&gt;
  attr          omr.kind1              defaultSound      mpd.kind1&lt;br /&gt;
&lt;br /&gt;
define          omr.kind2             OpenMultiroom&lt;br /&gt;
  attr          omr.kind2             mr                scc.kind2&lt;br /&gt;
  attr          omr.kind2             soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.kind2             playlistPattern   kind2&lt;br /&gt;
  attr          omr.kind2             ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.kind2             defaultTts        tts.kind2&lt;br /&gt;
  attr          omr.kind2             defaultStream     kind2&lt;br /&gt;
  attr          omr.kind2             defaultSound      mpd.kind2&lt;br /&gt;
&lt;br /&gt;
define          omr.kueche            OpenMultiroom&lt;br /&gt;
  attr          omr.kueche            mr                scc.kueche&lt;br /&gt;
  attr          omr.kueche            soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.kueche            playlistPattern   wohn&lt;br /&gt;
  attr          omr.kueche            ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.kueche            defaultTts        tts.kueche&lt;br /&gt;
  attr          omr.kueche            defaultStream     kueche&lt;br /&gt;
  attr          omr.kueche            defaultSound      mpd.kueche&lt;br /&gt;
&lt;br /&gt;
define          omr.wohn              OpenMultiroom&lt;br /&gt;
  attr          omr.wohn              mr                scc.wohn&lt;br /&gt;
  attr          omr.wohn              soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.wohn              playlistPattern   wohn&lt;br /&gt;
  attr          omr.wohn              ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.wohn              defaultTts        tts.wohn&lt;br /&gt;
  attr          omr.wohn              defaultStream     wohn&lt;br /&gt;
  attr          omr.wohn              defaultSound      mpd.wohn&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Konfiguration der OpenMultiroom-Module schließt die Einrichtung von FHEM ab. Jede Instanz benötigt mindestens das &amp;quot;mr&amp;quot;- und das &amp;quot;soundMapping&amp;quot;-Attribut. Nur so kann sich das Modul mit den entsprechenden Snapcast und MPD-Modulen verbinden. Durch das &amp;quot;mr&amp;quot;-Attribut wird ein OpenMultiroom-Modul einem Snapcast-Client-Modul fest zugeordnet. Das Soundmapping ordnet die in Snapcast definierten Streams (siehe oben, Konfiguration vom Snapserver) den entsprechenden Instanzen des MPD-Moduls zu. Dadurch weiß FHEM, welcher MPD auf welchem Stream abspielt und kann je nachdem, welchem Stream ein Raum gerade zuhört, den dazu passenden MPD steuern und seine Readings durchreichen. Das OpenMultiroom-Modul bildet alle Readings des MPD-Moduls nochmal direkt ab. Wechselt ein Benutzer aber den Stream, dem er zuhört, aktualisieren sich auch alle Readings dementsprechend mit denen des dann aktuellen MPD-Moduls. &lt;br /&gt;
&lt;br /&gt;
Das Attribut playlistPattern ist optional und sorgt dafür, dass beim Durchschalten der Playlists mit den Kommandos &amp;quot;channelUp&amp;quot; und &amp;quot;channelDown&amp;quot; nur diejenigen Playlists berücksichtigt werden, die auf das Pattern passen. &lt;br /&gt;
&lt;br /&gt;
Analog zum soundMapping definiert das Attribut ttsMapping die Zuordnung der TTS-Module zu den Streams. Beim Ausgeben von Announcement kann so das OpenMultiroom-Modul ermitteln, auf welchem Stream welcher Raum gerade zuhört, und wo dementsprechend die TTS-Ausgaben zu erzeugen sind, damit sie auch in den gewünschten Räumen ankommen. Dieser Umweg ist zurzeit nötig, da ein Snapcast-Client nur auf einem einzigen Stream lauschen kann. Lauschen noch andere Clients auf demselben Stream, hören sie allerdings zwangsweise auch die Announcements.&lt;br /&gt;
&lt;br /&gt;
Die 3 Default-Attribute legen fest, welche der TTS-Module, welcher Stream und welcher MPD dem entsprechenden Modul fest zugeordnet sind. Dies wird u.a. von einer Resetfunktion im Modul verwendet. &lt;br /&gt;
&lt;br /&gt;
== Bedienung des OpenMultiroom-Moduls ==&lt;br /&gt;
&lt;br /&gt;
=== set-Kommandos ===&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
&lt;br /&gt;
== Anbindung einer Fernbedienung an ein OpenMultiroom-Modul ==&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration von LIRC und IRExec === &lt;br /&gt;
&lt;br /&gt;
=== Zuordnung der Tasten: Beispiel === &lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=37476</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=37476"/>
		<updated>2022-06-21T12:05:49Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: maintainer update; links ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right&amp;quot;&amp;gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuern der einzelnen Multiroom-Systemkomponenten&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=OpenMultiroom&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=98_OpenMultiroom.pm&lt;br /&gt;
|ModOwner=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuern eines Snapcast-Servers&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=Snapcast&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=96_Snapcast.pm&lt;br /&gt;
|ModOwner=orphan/rudolphkoenig&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends {{Link2Forum|Topic=18517|LinkText=MPD}} und {{Link2Forum|Topic=62389|LinkText=Snapcast}} sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Das Modul ist noch sehr neu und bisher nur im {{Link2Forum|Topic=65785|LinkText=Forum}} bzw. auf dem [https://github.com/unimatrix27/fhemmodules/blob/master/98_OpenMultiroom.pm Github des Autors] verfügbar. Sobald alles stabil ist, wird es im SVN eingestellt. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OpenMultiroom&#039;&#039;&#039; ist ein Steuerungsmodul sowie auch ein Gesamtkonzept zur Realisierung eines Multiroom-Audio-Systems unter Nutzung von ausschließlich frei verfügbarer Software und ohne Bezug auf die Hardware eines bestimmten Herstellers. Es ist so ausgelegt, dass es prinzipiell flexibel bezüglich der Auswahl der Backendsysteme ist. Zurzeit ist es für die Nutzung mit [https://www.musicpd.org/ MPD] bzw. [https://www.mopidy.com/ Mopidy] und [https://github.com/badaix/snapcast Snapcast] implementiert. Daher wird in diesem WIKI-Eintrag immer von diesen Systemen gesprochen. Einen grundsätzlichen Überblick über das Konzept bietet das Schaubild.&lt;br /&gt;
&lt;br /&gt;
== Grobe Übersicht des Funktionsumfangs der Gesamtlösung==&lt;br /&gt;
=== Features ===&lt;br /&gt;
* Integrierte Steuerung des Musikplayers über das [[MPD]]-Modul sowie des Multiroom-System {{Link2Forum|Topic=62389|LinkText=Snapcast}} in einem einzigen Modul&lt;br /&gt;
* Implementierung einer Schnittstelle gemäß [[DevelopmentGuidelinesAV]] als Basis für eine Visualisierung mit z.B. [[SmartVISU]] oder [[FHEM Tablet UI]]&lt;br /&gt;
* Synchrones Playback auf z.B. Raspberry Pi oder Android-Geräten (Snapcast-Feature)&lt;br /&gt;
* optionale Komprimierung der Soundübertragung als OGG oder FLAC (Snapcast-Feature)&lt;br /&gt;
* Möglichkeit der Bedienung völlig ohne Display über eine Fernbedienung und entsprechender Text2Speech Rückmeldung, insbesondere&lt;br /&gt;
** Durschalten von Playlisten mit entsprechenden Channel - Tasten unter Nutzung von raumspezifischen Filtern&lt;br /&gt;
** Forward und Rewind mit definierbaren Sprungweiten (implementiert direkt im [[MPD]]-Modul)&lt;br /&gt;
** Direktanwahl von Playlisten, Tracks oder Trackpositionen durch Zifferneingabe und anschließende Funktionstaste&lt;br /&gt;
** Abfrage von Statusinformationen durch Funktionstasten und Text2Speech Rückmeldungen&lt;br /&gt;
** Mithören in anderen Räumen und Übernahme des Playerzustandes anderer Räume durch Nutzung von Funktionstasten&lt;br /&gt;
** Einschlaftimer per Zifferneingabe oder per vordefinierten Zeitabständen, hierbei wird auch die Restlaufzeit des aktuellen Tracks angeboten.&lt;br /&gt;
* manuelles oder automatisches Speichern und Laden von Playlistbookmarks (implementiert direkt im [[MPD]]-Modul)&lt;br /&gt;
* Möglichkeit der Festlegung von tageszeit- und tagestypabhängigen Lautstärkebegrenzungen bis auf 0% z.B. für Kinderzimmer&lt;br /&gt;
* individuelles Verwalten von Playlisten für verschiedene Familienmitglieder&lt;br /&gt;
* Nutzung des Audiosystems für systemunabhängige FHEM-Announcements. Ein entsprechendes Announcement-Modul ist in Planung. Dabei können mehrere Räume gleichzeitig oder auch getrennt angesprochen werden&lt;br /&gt;
&lt;br /&gt;
=== Anwendungszweck und Kurzbeschreibung der Funktionsweise ===&lt;br /&gt;
Wie der Name des Systems vermuten lässt, ist die Lösung vor allem dann sinnvoll einzusetzen, wenn Audiodateien in mindestens 2 verschiedenen Räumen oder &amp;quot;Zonen&amp;quot; sowohl synchron als auch unabhängig abgespielt werden soll und wenn hierzu eine komfortable und integrierte Steuerung über FHEM verwendet werden soll. Mit Einschränkungen ist die Lösung auch dann sinnvoll, wenn es nur um das Abspielen in einem Raum geht. Hier kann dann z.B. die Steuerung über eine Fernbedienung mit Hilfe des &#039;&#039;&#039;OpenMultiroom&#039;&#039;&#039;-Moduls genutzt werden, die über eine reine Nutzung des MPD-Moduls hinausgeht. &lt;br /&gt;
&lt;br /&gt;
Für die Nutzung ist nicht zwingend ein zentraler Server notwendig. Diese Rolle kann auch von einem der Clients übernommen werden, z.B. einem Pi. Zur einfacheren Darstellung wird in diesem Eintrag jedoch immer von der Nutzung eines Servers ausgegangen, der nicht gleichzeitig auch Client ist. &lt;br /&gt;
&lt;br /&gt;
Das Abspielen von Audio funktioniert prinzipiell in 2 Stufen: &lt;br /&gt;
# Nutzung von MPD oder einem MPD-kompatiblen Player zum direkten Abspielen von Sounddateien. Pro existierendem Raum gibt es mindestens eine Instanz von MPD. Hier wird davon ausgegangen, dass es genau eine Instanz pro Raum gibt. Jeder Raum hat also &amp;quot;seinen&amp;quot; MPD. &lt;br /&gt;
# Nutzung von Snapcast zur Verteilung des von MPD abgespielten Sounds an den entsprechenden Raum. Snapcast übernimmt hierbei die zeitliche Synchronisation&lt;br /&gt;
&lt;br /&gt;
Durch das Modul &#039;&#039;&#039;OpenMultiroom&#039;&#039;&#039; steuert der Nutzer sowohl MPD als auch Snapcast. Für jeden Raum wird eine Instanz des Moduls definiert. &lt;br /&gt;
&lt;br /&gt;
=== Verwendete Komponenten ===&lt;br /&gt;
Folgende Komponenten kommen zum Einsatz:&lt;br /&gt;
&lt;br /&gt;
==== Server: ====&lt;br /&gt;
* MPD oder Mopidy oder ein anderer MPD-kompatibler Player. 1 Instanz pro Raum&lt;br /&gt;
* Snapserver&lt;br /&gt;
* mplayer (bei Nutzung von Text 2 Speech)&lt;br /&gt;
* Optional Pulseaudio (im System-Mode) bei Nutzung von Text 2 Speech oder erweiterten Konfigurationen. Hierbei wird Pulseaudio zwischen MPD und Snapcast geschaltet. &lt;br /&gt;
* Optional Anbindung an Subsonic oder Libresonic (hier zurzeit nicht beschrieben) zur Synchronisation von Playlisten uvm. &lt;br /&gt;
* FHEM: Modul 98_OpenMultiroom.pm&lt;br /&gt;
* FHEM: Modul 96_Snapcast.pm&lt;br /&gt;
* FHEM: Modul [[MPD|73_MPD.pm]]&lt;br /&gt;
* FHEM: Optional Modul 98_Text2Speech.pm&lt;br /&gt;
&lt;br /&gt;
==== Client: ====&lt;br /&gt;
* Linux: Alsa oder Pulseaudio zur Soundwiedergabe&lt;br /&gt;
* Linux: Snapclient&lt;br /&gt;
* Android: Nur der Android Snapclient&lt;br /&gt;
* Webbrowser zur Steuerung per Visualisierung&lt;br /&gt;
* ggf. Infrarot oder Funkfernbedienung. In diesem Artikel wird das Beispiel anhand der Nutzung von X10-Funkfernbedienungen gezeigt, diese gibt es sehr günstig in der Bucht o.ä.&lt;br /&gt;
* Vision: Nutzung von Tastern und Display am PI oder Nutzung eines Steuergerätes mit Tastern und Display auf Basis eines Arduino mit WLAN, z.B. im alten Gehäuse eines Küchenradios usw. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aufbau anhand einer vollständigen Beispielkonfiguration ==&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel soll beispielhaft eine vollständige Konfiguration gezeigt werden. Jeder Nutzer muss diese Konfiguration an seine eigenen Bedürfnisse anpassen. Es seien folgende Komponenten vorhanden:&lt;br /&gt;
&lt;br /&gt;
* Server mit Ubuntu 16.04, hier befindet sich eine MP3-Sammlung&lt;br /&gt;
* Kind1: Raspberry Pi Model 1 mit Raspbian&lt;br /&gt;
* Kind2: BananaPi mit Ubuntu, an diesem Pi ist auch ein X10 Empfänger angeschlossen, da er zentral im Haus positioniert ist&lt;br /&gt;
* Wohnzimmer: Raspberry Pi3 mit OSMC und KODI, wird primär zum Fernsehen verwendet&lt;br /&gt;
* Küche: Raspberry Pi Model 1 mit Raspbian&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Es ist möglich, mehrere Räume mit nur einem physikalischen Client zu bedienen. Hierbei werden auf einem Client mehrere Instanzen des Snapclients laufen gelassen. Der physikalische Client hat dann z.B. mehrere USB Soundkarten, dessen Audioausgänge in verschiedene Räume verkabelt sind. Dies wird hier zurzeit nicht näher beschrieben. &lt;br /&gt;
&lt;br /&gt;
=== Pulseaudio Konfiguration ===&lt;br /&gt;
Will man Pulseaudio verwenden, z.B. um Text2Speech Nachrichten in laufende Musik einzublenden, sollte dieses am besten zuerst konfiguriert werden. Pulseaudio muss hierzu im System-Mode laufen. Dies ist auf einem Headless-Server kein Problem. Bei Ubuntu 16.10 wird dies durch folgenden Inhalt in &#039;&#039;/etc/systemd/system/pulseaudio.server&#039;&#039; erreicht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=PA&lt;br /&gt;
After=network.target sound.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=/usr/bin/pulseaudio --system&lt;br /&gt;
&lt;br /&gt;
# allow MPD to use real-time priority 50&lt;br /&gt;
LimitRTPRIO=50&lt;br /&gt;
LimitRTTIME=infinity&lt;br /&gt;
&lt;br /&gt;
# disallow writing to /usr, /bin, /sbin, ...&lt;br /&gt;
ProtectSystem=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Weiterhin ist der Befehl&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo systemctl enable pulseaudio&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
einzugeben, um Pulseaudio beim Systemstart automatisch zu starten.&lt;br /&gt;
&lt;br /&gt;
Ausgehend von der Standardkonfiguration werden nun in  &#039;&#039;/etc/pulse/system.pa&#039;&#039; die benötigten Module eingetragen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
load-module module-pipe-sink file=/tmp/wohn.fifo   sink_name=wohn&lt;br /&gt;
load-module module-pipe-sink file=/tmp/kind1.fifo   sink_name=kind1&lt;br /&gt;
load-module module-pipe-sink file=/tmp/kind2.fifo  sink_name=kind2&lt;br /&gt;
load-module module-pipe-sink file=/tmp/kueche.fifo sink_name=kueche&lt;br /&gt;
&lt;br /&gt;
load-module module-combine-sink slaves=kind1,kind2 sink_name=kinder&lt;br /&gt;
load-module module-combine-sink slaves=wohn,kueche sink_name=unten&lt;br /&gt;
load-module module-combine-sink slaves=wohn,kueche,kind1,kind2 sink_name=alle&lt;br /&gt;
&lt;br /&gt;
pactl load-module module-role-ducking trigger_roles=announcement ducking_roles=music&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Snapcast benötigt die Audioquelle in Form von FIFOs. Daher wird hier in den erstem 4 Zeilen je ein FIFO von Pulseaudio erzeugt. Der sink_name wird später bei der Konfiguration von MPD als Ausgang verwendet. In den 3 weiteren Zeilen werden noch 3 Sinks als Combine-Sinks erstellt. Diese erzeugen keine neuen FIFOs, sondern omrhen under entsprechenden Sink-Namen eine vorgegebene Kombination von Räumen nach außen hin verfügbar. Der Sink &amp;quot;alle&amp;quot; kann also genutzt werden, um Audio auf allen 4 FIFOs gleichzeitig abzuspielen (und somit später potentiall in allen Räumen gleichzeitig). Dies kann für Announcements sinnvoll sein. Die Nutzung dieser Combine-Sinks ist optional. Ebenso optional ist das Laden des Ducking-Moduls am Ende. Das Ducking Modul führt dazu, dass Pulseaudio automatisch die Lautstärke der durch MPD abgespielten Tracks absenkt, wenn etwas über die Text2Speech-Module abgespielt wird. Ohne dies sind die Ausgaben speziell über die Google API unter Umständen nur schwer hörbar. &lt;br /&gt;
&lt;br /&gt;
=== Snapcast Konfiguration ===&lt;br /&gt;
[https://github.com/badaix/snapcast Snapcast] muss entsprechend der Angaben auf der Webseite installiert werden. Auf dem Server muss logischerweise die Serverkomponente und auf den Clients die Clientkomponente installiert werden. Bei Android-Clients wird die auf der Webseite zur Verfügung gestellt APK installiert. Snapcast befindet sich selbst noch in fortlaufender Entwicklung. Die hier vorgestellte Lösung ist mit [https://github.com/badaix/snapcast/tree/98be8a58d945f84af50e40ebcf8a774592dd6e7b dieser Version] kompatibel und getestet. &lt;br /&gt;
&lt;br /&gt;
Die Konfiguration des Servers beschränkt sich auf die Definition der Streams in &#039;&#039;/etc/default/snapserver&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_SNAPSERVER=true&lt;br /&gt;
SNAPSERVER_OPTS=&amp;quot;-d -s pipe:///tmp/kind1.fifo?name=kind1&amp;amp;mode=read -s pipe:///tmp/kind2.fifo?name=kind2&amp;amp;mode=read -s pipe:///tmp/wohn.fifo?name=wohn&amp;amp;mode=read -s pipe:///tmp/kueche.fifo?name=kueche&amp;amp;mode=read&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier werden die 4 Streams erstellt, diese entsprechen vom Dateinamen her der Pulseaudiokonfiguration. Der hier verwendete Name kann später in FHEM oder auch im Android-Client angezeigt werden. Die Option &amp;lt;pre&amp;gt;mode=read&amp;lt;/pre&amp;gt; ist wichtig, weil Pulseaudio meckert, wenn es die FIFO-Dateien nicht selbst anlegen darf. &lt;br /&gt;
&lt;br /&gt;
Auf der Clientseite sieht die Datei &#039;&#039;/etc/default/snapclient&#039;&#039; dann so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
START_SNAPCLIENT=true&lt;br /&gt;
SNAPCLIENT_OPTS=&amp;quot;-d -s dmix:CARD=Aureon51MkII,DEV=0&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Den Server findet der Snapclient automatisch, er kann aber auch angegeben werden. Wie hier zu sehen kann ein spezielles Output-Device angegeben werden. Dies ist bei den PIs mit externer USB-Soundkarte meistens notwendig, da ansonsten der interne Sound genutzt würde. Eine Liste der verfügbaren Devices wird mit dem Aufruf von &amp;lt;pre&amp;gt;snapclient -l&amp;lt;/pre&amp;gt; ausgegeben, hier muss dann das passende genommen werden. GGf. so lange ausprobieren, bis der Sound an der richtigen Stelle rauskommt.&lt;br /&gt;
&lt;br /&gt;
In der hier betrachteten Konfiguration soll auf dem Wohnzimmer-PI ein Snapclient laufen, dieser wird aber normalerweise zum TV und Filme schauen mit KODI verwendet. Sowohl KODI als auch der Snapclient blockieren aber das ALSA-Device und funktionieren beide meistens entweder gar nicht oder nicht richtig zusammen, insbesondere dann nicht, wenn von KODI Mehrkanalsound oder sogar Passthrough ausgegeben wird. Die Entwicklung eines nativen Snapcast-Clients innerhalb von KODI wird gerade an verschiedenen Stellen diskutiert, z.B. [https://github.com/badaix/snapcast/issues/155 hier]. Bis dahin kann ein kleiner Workaround Abhilfe schaffen. Mit folgendem (nur rudimentär getesteten) [https://github.com/unimatrix27/snapcast/commit/88e42a2ecc8b44223701e18abb63af04b673b67b Hack] für den Snapcast-Client wird erreicht, dass der Client das ALSA-Device frei gibt, sobald er über den Server auf Mute gestellt wird. KODI selbst gibt das Device ebenfalls frei, wenn es im Zustand &amp;quot;Stop&amp;quot; ist. Bei dieser Lösung kann der Snapclient auf dem KODI-Rechner immer laufen gelassen werde. Es ist jedoch in der Verantwortung des Benutzers, den Client zu &amp;quot;muten&amp;quot;. Vergisst er dies, wird ggf. die Wiedergabe in KODI nicht möglich sein. &lt;br /&gt;
&lt;br /&gt;
Nach Abschluss der Snapcastkonfiguration und dem Starten von Server und den Clients empfiehlt es sich, die Android-App ebenfalls zu verwenden, da diese einen schnellen Überblick über den Zustand des Servers, der konfigurierten Streams und der Clients bietet.&lt;br /&gt;
&lt;br /&gt;
=== Mopidy Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird Mopidy als MPD-Ersatz verwendet, genau so gut kann aber auch direkt MPD verwendet werden. Die genauen Konfigurationsoptionen sind natürlich anders, und jeweils in entsprechenden Tutorials oder Dokumentationen beschrieben. Mopidy ist relativ umfangreich und modular aufgebaut, es bietet u.a. die Möglichkeit, neben lokal gespeicherten Dateien auch Dateien von verschiedenen, teilweise kommerziellen, Streamingdiensten abzuspielen. Die Detailkonfiguration all dieser Komponenten geht über diesen Artikel hinaus. Entscheidend hier ist die Konfiguration in einer Weise, so dass mehrere Mopidy-Instanzen gleichzeitig ausgeführt werden können und dann auf unterschiedlichen Ports zur Verfügung stehen. &lt;br /&gt;
&lt;br /&gt;
Nach Installation von Mopidy findet sich die Konfiguration in der Datei &#039;&#039;/etc/mopidy/mopidy.cfg&#039;&#039;. Mopidy unterstützt hierarische Konfigurationen, es reicht also, den für jede Instanz spezifischen Teil aus dieser allgemeinen Konfiguration zu entfernen und in jeweils eigene Dateien zu verschieben. In diesem Beispiel sollen das die Dateien &#039;&#039;/etc/mopidy/kind1.conf&#039;&#039; bis &#039;&#039;/etc/mopidy/kueche.conf&#039;&#039; sein. Die folgenden Zeilen gehören jeweils in diese 4 Dateien und werden dort entsprechend angepasst. Hier das Beispiel für Kind2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[logging]&lt;br /&gt;
config_file = /etc/mopidy/logging_kind2.conf&lt;br /&gt;
debug_file = /var/log/mopidy/mopidy-debug_kind2.log&lt;br /&gt;
&lt;br /&gt;
[audio]&lt;br /&gt;
output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! pulsesink  device=kind2  stream-properties=&amp;quot;props,media.role=music&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[mpd]&lt;br /&gt;
enabled = true&lt;br /&gt;
hostname = 0.0.0.0&lt;br /&gt;
port=6601&lt;br /&gt;
&lt;br /&gt;
[http]&lt;br /&gt;
enabled = true&lt;br /&gt;
hostname =  0.0.0.0&lt;br /&gt;
port=6681&lt;br /&gt;
zeroconf = Musik Kind2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Audioteil wird der entsprechende Sink aus der Pulseaudiokonfiguration genommen. Die Angabe von stream-properties ermöglicht dem Duck-Modul den Stream als Musik zu erkennen und beim Abspielen von Announcements in der Lautstärke abzusenken. Beim MPD muss der Port für jede Instanz unterschiedlich sein, ebenso beim HTTP-Modul für die Weboberfläche der jeweiligen Instanz. Der Zerokonfname sollte auch eindeutig sein. Neben dieser Datei ist noch die dazu passende logging-Konfiguration anzulegen, hier also &#039;&#039;/etc/mopidy/logging_kind2.conf&#039;&#039;. Dazu wird die Standarddatei kopiert und darin nur der Name der Logdatei angepasst.&lt;br /&gt;
&lt;br /&gt;
Um nun auch die entsprechende Anzahl Instanzen automatisch zu starten, sind die entsprechenden Startdateien anzulegen. Dazu kann die Datei &#039;&#039;/etc/systemd/system/mopidy.cfg&#039;&#039; z.B. in &#039;&#039;/etc/systemd/system/mopidy_kind1.cfg&#039;&#039; umbenannt werden und dann 3 mal mit den Endungen der anderen Instanzen kopiert werden. Der Inhalt ist dann wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Mopidy_kind1&lt;br /&gt;
After=network.target sound.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
EnvironmentFile=/etc/default/mopidy&lt;br /&gt;
ExecStart=/usr/bin/mopidy --quiet --config /etc/mopidy/kind1.conf&lt;br /&gt;
&lt;br /&gt;
# allow MPD to use real-time priority 50&lt;br /&gt;
LimitRTPRIO=50&lt;br /&gt;
LimitRTTIME=infinity&lt;br /&gt;
&lt;br /&gt;
# disallow writing to /usr, /bin, /sbin, ...&lt;br /&gt;
ProtectSystem=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abschließend sollten die 4 Instanzen durch den Aufruf von &amp;lt;pre&amp;gt;systemctl enable mopidy_kind1&amp;lt;/pre&amp;gt; usw. aktiviert werden. Es empfiehlt sich nach dem Start von Mopidy die korrekte Funtkionsweise mit dem [https://www.musicpd.org/clients/mpc/ MPC]-Client oder mit [http://rybczak.net/ncmpcpp/ NCMPCPP] auf der Konsole zu testen.&lt;br /&gt;
&lt;br /&gt;
Hierbei sollte es dann bereits möglich sein, die Multiroom-Fähigkeiten von Snapcast mit Hilfe des Android-Clients von Snapcast zu testen und so auch festzustellen, dass die restliche Konfiguration von Snapcast und Pulseaudio korrekt sind. &lt;br /&gt;
&lt;br /&gt;
=== FHEM ===&lt;br /&gt;
&lt;br /&gt;
In FHEM sind nun in der &#039;&#039;fhem.cfg&#039;&#039; die entsprechenden Module einzurichten:&lt;br /&gt;
* Ein Snapcast-Modul im Server Modus&lt;br /&gt;
* Pro Raum ein Snapcast-Modul im Clientmodus&lt;br /&gt;
* Pro Raum ein MPD-Modul&lt;br /&gt;
* Pro Raum ein OpenMultiroom-Modul&lt;br /&gt;
* Optional pro Raum ein Text2Speech-Modul&lt;br /&gt;
* weitere Text2Speech-Module, falls man diese in Pulseaudio mit dem per Combine-Sink vorgesehen hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          scs.snap              Snapcast&lt;br /&gt;
&lt;br /&gt;
define          scc.kind1             Snapcast          client scs.snap b827eb9aec84&lt;br /&gt;
  attr          scc.kind1             constraintDummy   freestring &lt;br /&gt;
  attr          scc.kind1             constraints       standard|07:00 0 20:00 100 21:00 50 21:30 30 24:00 0,beforefree|07:00 0 21:00 100 22:00 50 23:00 30 24:00 0,beforeschool|07:00 0 08:30 50 20:00 100 21:00 50 21:30 30 24:00 0,free|07:00 0 08:30 50 21:00 100 22:00 50 23:00 30 24:00 0&lt;br /&gt;
&lt;br /&gt;
define          scc.kind2             Snapcast          client scs.snap 025009413c29&lt;br /&gt;
  attr          scc.kind2             constraintDummy   freestring&lt;br /&gt;
  attr          scc.kind2             constraints       standard|07:00 0 20:15 100 20:30 50 24:00 0,beforefree|07:00 0 21:00 100 22:30 50 24:00 0,beforeschool|07:00 0 08:30 50 20:15 100 20:30 50 24:00 0,free|07:00 0 08:30 50 21:00 100 22:30 50 24:00 0&lt;br /&gt;
&lt;br /&gt;
define          scc.kueche            Snapcast          client scs.snap b827eb9a2ad3&lt;br /&gt;
&lt;br /&gt;
define          scc.wohn              Snapcast          client scs.snap 00aefa4aa3a9&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oben zu sehen ist das define für das Server-Modul. Ohne Parameter verbindet sich mit localhost auf dem Standardport 1705. Es folgt die Definition von 2 Clients. Der erste Parameter &amp;quot;client&amp;quot; versetzt das Snapcastmodul in den Clientmodus. Der zweite Parameter verweist auf das Servermodul, der dritte Parameter ist die Client-ID. Diese besteht bei der aktuellen Snapcast-Version meistens aus der MAC-Adresse des Clients. Für die Kinder werden noch die Attribute constraintDummy ond constraints vergeben. Hiermit wird eine tagestyp- und tageszeitabhängige Lautstärkebegrenzung konfiguriert. Für die vier Tagestypen &amp;quot;standard&amp;quot;, &amp;quot;beforefree&amp;quot;, &amp;quot;beforeschool&amp;quot; und &amp;quot;free&amp;quot; wird ein jeweils anderes Lautstärkezeitprofil definiert. &lt;br /&gt;
&lt;br /&gt;
Das Zeitprofil wird hier nach dem gleichen Muster wie die Temperaturlisten der Homematic-Thermostate, erklärt hier: [HomeMatic_Type_Thermostat]. Für den Tagestyp wird zusätzlich das Attribut constraintDummy verwendet. Es definiert, dass in dem Dummy &amp;quot;freestring&amp;quot; jeweils drin steht, welcher Tagestyp gerade ist. Diese Variable wirkt somit als Selektor auf die Liste der erlaubten Maximallautstärken. Wie eine solche Dummyvariable jeweils mit einem entsprechenden Wert befüllt werden kann, z.B. abhängig vom Wochentag, von Schulferien oder Feiertagen, wird hier nicht erläutert. Es ist auch möglich, nur ein Lautstärkeprofil anzugeben. Ohne dass ein Attribut constraintDummy gesetzt ist, verwendet das Snapcastmodul immer den Wert &amp;quot;standard&amp;quot;. Wie man hier sehen kann, gibt es im Beispiel 4 Typen, hierbei fallen Freitage normalerweise in die Kategorie &amp;quot;beforefree&amp;quot; (es sind Tage, bevor dann frei ist, es kann also typischerweise länger und lauter Musik gehört werden), Samstage normalerweise in die Kategorie &amp;quot;free&amp;quot; und Sonntage in die Kategorie &amp;quot;beforeschool&amp;quot;, ebenso landen dort Feiertage vor Schultagen usw. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          tts.wohn              Text2Speech       pulsewohn&lt;br /&gt;
  attr          tts.wohn              TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.wohn              TTS_UseMP3Wrap    true&lt;br /&gt;
  attr          tts.wohn              TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
&lt;br /&gt;
define          tts.kind1             Text2Speech       pulsekind1&lt;br /&gt;
  attr          tts.kind1             TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kind1             TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kind1             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kind2             Text2Speech       pulsekind2&lt;br /&gt;
  attr          tts.kind2             TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kind2             TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kind2             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kueche            Text2Speech       pulsekueche&lt;br /&gt;
  attr          tts.kueche            TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kueche            TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kueche            TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kinder            Text2Speech       pulsekinder&lt;br /&gt;
  attr          tts.kinder            TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.kinder            TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.kinder            TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.unten             Text2Speech       pulseunten&lt;br /&gt;
  attr          tts.unten             TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.unten             TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.unten             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.alle              Text2Speech       pulsealle&lt;br /&gt;
  attr          tts.alle              TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.alle              TTS_MplayerCall   PULSE_PROP=&#039;media.role=announcement&#039; /usr/bin/mplayer -softvol -volume 120&lt;br /&gt;
  attr          tts.alle              TTS_UseMP3Wrap    true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier sind die Definitionen der Text2Speech Module zu sehen (optional). Sie werden jeweils mit den in Pulseaudio definierten Sinks verbunden. Die Nutzung eines TemplateDirs ist ebenfalls optional, hier können bereits fertige MP3s verwendet werden, die dann anstelle der von der Google TTS API erzeugten Dateien benutzt werden. Dies können auch Bestätigungs und Fehlertöne sein, die bei Benutzern ohne Display, die rein mit Fernbedienung arbeiten, auf Fehlbedienungen etc. aufmerksam zu omrhen. Der Aufruf von mplayer wird noch modifiziert, um dafür zu sorgen, dass die Ausgabe bei Pulseaudio als media.role &amp;quot;announcement&amp;quot; eingehen. Dies wird dann vom duck-Modul erkannt, und führt dazu, dass die Lautstärke der ggf. ablaufenden Musik, etc. abgesenkt wird, so lange die tts-Ausgabe läuft. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          mpd.kind1              MPD               192.168.2.2 6600&lt;br /&gt;
  attr          mpd.kind1              player            mopidy&lt;br /&gt;
  attr          mpd.kind1              bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.kind1              autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.kind2             MPD               192.168.2.2 6702&lt;br /&gt;
  attr          mpd.kind2             player            mopidy&lt;br /&gt;
  attr          mpd.kind2             bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.kind2             autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.kueche            MPD               192.168.2.2 6703&lt;br /&gt;
  attr          mpd.kueche            player            mopidy&lt;br /&gt;
  attr          mpd.kueche            bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.kueche            autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.wohn              MPD               192.168.2.2 6704&lt;br /&gt;
  attr          mpd.wohn              player            mopidy&lt;br /&gt;
  attr          mpd.wohn              bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.wohn              autoBookmark      1 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pro laufender MPD oder Mopidy-Instanz wird ein MPD-Modul eingerichtet. Der Hostname und die Ports sind entsprechend anzupassen. Durch die bookmarkDir und autoBookmark - Attribute wird erreicht, dass der Zustand von Playlisten beim Wechsel derselben gespeichert und später wiederhergestellt werden kann. So lässt sich das Hören eines Hörbuchs unterbrechen, auf z.B. eine Radiostreamplayliste schalten, um dann später zur gleichen Stelle im Hörbuch zurückzukehren. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          omr.kind1              OpenMultiroom&lt;br /&gt;
  attr          omr.kind1              mr                scc.kind1&lt;br /&gt;
  attr          omr.kind1              soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.kind1              playlistPattern   kind1&lt;br /&gt;
  attr          omr.kind1              ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.kind1              defaultTts        tts.kind1&lt;br /&gt;
  attr          omr.kind1              defaultStream     kind1&lt;br /&gt;
  attr          omr.kind1              defaultSound      mpd.kind1&lt;br /&gt;
&lt;br /&gt;
define          omr.kind2             OpenMultiroom&lt;br /&gt;
  attr          omr.kind2             mr                scc.kind2&lt;br /&gt;
  attr          omr.kind2             soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.kind2             playlistPattern   kind2&lt;br /&gt;
  attr          omr.kind2             ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.kind2             defaultTts        tts.kind2&lt;br /&gt;
  attr          omr.kind2             defaultStream     kind2&lt;br /&gt;
  attr          omr.kind2             defaultSound      mpd.kind2&lt;br /&gt;
&lt;br /&gt;
define          omr.kueche            OpenMultiroom&lt;br /&gt;
  attr          omr.kueche            mr                scc.kueche&lt;br /&gt;
  attr          omr.kueche            soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.kueche            playlistPattern   wohn&lt;br /&gt;
  attr          omr.kueche            ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.kueche            defaultTts        tts.kueche&lt;br /&gt;
  attr          omr.kueche            defaultStream     kueche&lt;br /&gt;
  attr          omr.kueche            defaultSound      mpd.kueche&lt;br /&gt;
&lt;br /&gt;
define          omr.wohn              OpenMultiroom&lt;br /&gt;
  attr          omr.wohn              mr                scc.wohn&lt;br /&gt;
  attr          omr.wohn              soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          omr.wohn              playlistPattern   wohn&lt;br /&gt;
  attr          omr.wohn              ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          omr.wohn              defaultTts        tts.wohn&lt;br /&gt;
  attr          omr.wohn              defaultStream     wohn&lt;br /&gt;
  attr          omr.wohn              defaultSound      mpd.wohn&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Konfiguration der OpenMultiroom-Module schließt die Einrichtung von FHEM ab. Jede Instanz benötigt mindestens das &amp;quot;mr&amp;quot;- und das &amp;quot;soundMapping&amp;quot;-Attribut. Nur so kann sich das Modul mit den entsprechenden Snapcast und MPD-Modulen verbinden. Durch das &amp;quot;mr&amp;quot;-Attribut wird ein OpenMultiroom-Modul einem Snapcast-Client-Modul fest zugeordnet. Das Soundmapping ordnet die in Snapcast definierten Streams (siehe oben, Konfiguration vom Snapserver) den entsprechenden Instanzen des MPD-Moduls zu. Dadurch weiß FHEM, welcher MPD auf welchem Stream abspielt und kann je nachdem, welchem Stream ein Raum gerade zuhört, den dazu passenden MPD steuern und seine Readings durchreichen. Das OpenMultiroom-Modul bildet alle Readings des MPD-Moduls nochmal direkt ab. Wechselt ein Benutzer aber den Stream, dem er zuhört, aktualisieren sich auch alle Readings dementsprechend mit denen des dann aktuellen MPD-Moduls. &lt;br /&gt;
&lt;br /&gt;
Das Attribut playlistPattern ist optional und sorgt dafür, dass beim Durchschalten der Playlists mit den Kommandos &amp;quot;channelUp&amp;quot; und &amp;quot;channelDown&amp;quot; nur diejenigen Playlists berücksichtigt werden, die auf das Pattern passen. &lt;br /&gt;
&lt;br /&gt;
Analog zum soundMapping definiert das Attribut ttsMapping die Zuordnung der TTS-Module zu den Streams. Beim Ausgeben von Announcement kann so das OpenMultiroom-Modul ermitteln, auf welchem Stream welcher Raum gerade zuhört, und wo dementsprechend die TTS-Ausgaben zu erzeugen sind, damit sie auch in den gewünschten Räumen ankommen. Dieser Umweg ist zurzeit nötig, da ein Snapcast-Client nur auf einem einzigen Stream lauschen kann. Lauschen noch andere Clients auf demselben Stream, hören sie allerdings zwangsweise auch die Announcements.&lt;br /&gt;
&lt;br /&gt;
Die 3 Default-Attribute legen fest, welche der TTS-Module, welcher Stream und welcher MPD dem entsprechenden Modul fest zugeordnet sind. Dies wird u.a. von einer Resetfunktion im Modul verwendet. &lt;br /&gt;
&lt;br /&gt;
== Bedienung des OpenMultiroom-Moduls ==&lt;br /&gt;
&lt;br /&gt;
=== set-Kommandos ===&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
&lt;br /&gt;
== Anbindung einer Fernbedienung an ein OpenMultiroom-Modul ==&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration von LIRC und IRExec === &lt;br /&gt;
&lt;br /&gt;
=== Zuordnung der Tasten: Beispiel === &lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Wochenende,_Feiertage_und_Schulferien&amp;diff=37474</id>
		<title>Wochenende, Feiertage und Schulferien</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Wochenende,_Feiertage_und_Schulferien&amp;diff=37474"/>
		<updated>2022-06-20T17:32:16Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Calendar: notify angepaßt, forum #128094&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FHEM bietet die Möglichkeit, Komponenten in Abhängigkeit von Wochenenden und Schulferien sowie Feiertagen zu steuern. Hier soll beschrieben werden, wie Schulferien einbezogen werden.&lt;br /&gt;
&lt;br /&gt;
== Wochenendermittlung mit $we ==&lt;br /&gt;
Um am Wochenende (Samstag und Sonntag) länger schlafen zu können, kann diese Steuerung durch Nutzung der Variable &#039;&#039;$we&#039;&#039; erweitert werden.&lt;br /&gt;
Diese hat am Wochenende den Wert &#039;&#039;1&#039;&#039;, an sonstigen Tagen den Wert &#039;&#039;0&#039;&#039;. In if-Abfragen wird die 0 als &#039;&#039;false/falsch&#039;&#039; interpretiert, andere numerische Werte als &#039;&#039;true/wahr&#039;&#039;. Man kann mittels &#039;&#039;if ($we)&#039;&#039; also ganz einfach prüfen, ob Wochenende ist und entsprechend steuern (oder auch nicht).&lt;br /&gt;
&lt;br /&gt;
Eine simple Rollladensteuerung um 7 Uhr morgens für jeden Tag sieht beispielsweise wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 define RolloHoch at *07:00 set Rollo hoch&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel kann entsprechend ergänzt werden, so dass am Wochenende nicht um 7 Uhr das Rollo nach oben gefahren wird:&lt;br /&gt;
&lt;br /&gt;
  define RolloHoch at *07:00 { if (!($we)) { fhem(&amp;amp;quot;set Rollo hoch&amp;amp;quot;);; } }&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;!&#039;&#039; in der if-Abfrage negiert den dahinter folgenden Ausdruck in der Klammer, ist also &amp;quot;nicht Wochenende&amp;quot;. Der Inhalt der äußeren geschweiften Klammern stellt echten Perl-Code dar (der hinter jeder Anweisung gerne ein Semikolon stehen hat, das in FHEM durch ein weiteres Semikolon [http://de.wikipedia.org/wiki/Maskierungszeichen maskiert/escaped] werden muss). Aus dem Perl-Code kann man mittels des Befehls &#039;&#039;fhem()&#039;&#039; wiederum FHEM-Code ausführen (hier der Befehl, um das Rollo nach oben zu fahren). Das (Doppel-)Semikolon ist in diesem Beispiel nicht zwingend notwendig, da es sich nur um eine einzige (und somit letzte) Anweisung handelt - man sollte sich jedoch aneignen, jede Anweisung im Perl-Code mit einem (Doppel-)Semikolon abzuschließen (eine schließende geschweifte Klammer stellt auch das Ende eine Anweisung bzw. eines Anweisungsblocks dar).&lt;br /&gt;
&lt;br /&gt;
Intern wird für die Ermittlung, ob die FHEM-Variable $we wahr ist, die Funktion IsWe() verwendet.&lt;br /&gt;
&lt;br /&gt;
== IsWe() ==&lt;br /&gt;
Statt der obigen Schreibweise kann man auch direkt die Funktion IsWe() aufrufen. Eine andere Schreibweise für obiges Beispiel wäre daher:&lt;br /&gt;
  define RolloHoch at *07:00 { if (!(IsWe())) { fhem(&amp;amp;quot;set Rollo hoch&amp;amp;quot;);; } }&lt;br /&gt;
&lt;br /&gt;
Der Vorteil dieser Vorgehensweise ist, dass IsWe() weitere Parameter kennt. Es kann zum einen nicht nur für den heutigen Tag (&#039;&#039;IsWe()&#039;&#039;), sondern auch für gestern (&#039;&#039;IsWe(&amp;quot;yesterday&amp;quot;)&#039;&#039;) und morgen (&#039;&#039;IsWe(&amp;quot;tomorrow&amp;quot;)&#039;&#039;) abgefragt werden. Dabei werden die in holiday2we angegebenen Geräte nacheinander durchgegangen und ermittelt, ob ein Reading mit diesem Namen vorhanden ist und etwas anderes liefert als &amp;quot;none&amp;quot;. &#039;&#039;IsWe()&#039;&#039; ohne Parameter fragt den Inhalt des Readings &amp;quot;state&amp;quot; ab, für eigene Routinen kann auch &#039;&#039;IsWe(&amp;quot;today&amp;quot;)&#039;&#039; verwendet werden. Die Funktionsweise ist dann identisch zu den Abfragen nach &amp;quot;yesterday&amp;quot; und &amp;quot;tomorrow&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Ebenso kann die Behandlung von Samstagen und Sonntagen durch Verwendung eines zweiten Arguments mit einer Zahl &amp;gt;6 abgeschaltet werden, so dass  nur noch ein positives Ergebnis zurückgeliefert wird, wenn tatsächlich ein Feiertag ist (siehe nachfolgenden Abschnitt):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;{IsWe(&amp;quot;tomorrow&amp;quot;,7)}&#039;&#039; ist also nur dann wahr, wenn morgen ein Feiertag in einem in &#039;&#039;holiday2we&#039;&#039; angegebenen Device eingetragen ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Fehlt: was passiert bei Angabe von kleineren Zahlen?)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;IsWe()&#039;&#039; ohne Parameter wird intern von diversen Modulen verwendet, um den Wert von $we zu ermitteln, u.a. von [[AutoShuttersControl]], [[DOIF]] und [[WeekdayTimer]].  &lt;br /&gt;
&lt;br /&gt;
== Feiertage mittels holiday-Datei ==&lt;br /&gt;
=== Allgemeines zu holiday2we ===&lt;br /&gt;
Samstags und Sonntags bleibt das Rollo nun unten und man kann länger schlafen. Um diesen Komfort auch an Feiertagen zu haben, können in FHEM mittels &#039;&#039;holiday&#039;&#039;-Dateien Feiertage definiert werden. Sinnvollerweise erstellt man sich für sein jeweiliges Bundesland eine eigene Datei, die Definitionen für feste Feiertage (z.B. Weihnachten oder der Tag der Deutschen Einheit) und solche in Abhängigkeit zu Ostern (z.B. Ostermontag oder Pfingsten, im Rheinland auch der Karneval) beinhaltet. Eine gutes Beispiel mit Erklärung findet sich in der [http://fhem.de/Heimautomatisierung-mit-fhem.pdf FHEM-Übersicht für Anfänger].&lt;br /&gt;
Nachdem beispielsweise die &#039;&#039;BW_Feiertag.holiday&#039;&#039;-Datei im FHEM-Ordner erstellt/abgelegt wurde, kann diese in die Konfiguration eingebunden werden. Mittels &#039;&#039;holiday2we&#039;&#039; können die darin definierten Feiertage mit der Variable &#039;&#039;$we&#039;&#039; &amp;quot;verheiratet&amp;quot; werden. &#039;&#039;if ($we)&#039;&#039; ist danach immer wahr, sobald Wochenende oder ein Feiertag ist:&lt;br /&gt;
&lt;br /&gt;
  attr global holiday2we BW_Feiertag&lt;br /&gt;
  define BW_Feiertag holiday&lt;br /&gt;
&lt;br /&gt;
In dem Attribut können mehrere Geräte angegeben werden:&lt;br /&gt;
  attr global holiday2we BW_Feiertag,meinUrlaubsdummy,Schulferien&lt;br /&gt;
&lt;br /&gt;
Dabei wird bei echten &#039;&#039;holiday&#039;&#039;-Dateien (die auch seit Ende 2018 auch rechnen können&amp;lt;ref&amp;gt;{{Link2Forum|Topic=93303|LinkText=Forum-Thread}}&amp;lt;/ref&amp;gt;) jeweils eine entsprechende Auswertung durchgeführt, für alle anderen Devices (wie z.B. einem Dummy) wird entweder &#039;&#039;state&#039;&#039; für heute verwendet oder die Readings &#039;&#039;&amp;quot;tomorrow&amp;quot;&#039;&#039; bzw. &#039;&#039;&amp;quot;yesterday&amp;quot;&#039;&#039;, wenn diese vorhanden sind. Dabei werden nicht vorhandene Werte als &#039;&#039;&amp;quot;kein Feiertag&amp;quot;&#039;&#039; behandelt, und alle anderen Werte mit Ausnahme von &#039;&#039;&amp;quot;none&amp;quot;&#039;&#039; als Feiertag. &lt;br /&gt;
&lt;br /&gt;
=== weekEnd und noWeekend ===&lt;br /&gt;
Dies sind spezielle Einträge in holiday2we:&lt;br /&gt;
Das Wort weekEnd als Eintrag bewirkt, dass grundsätzlich Samstage und Sonntage nicht mehr als &#039;&#039;$we&#039;&#039; angesehen werden, sondern nur noch die in einem der angegebenen Devices (mit Ausnahme von &#039;&#039;noWeekEnd&#039;&#039;) eingetragenen Feiertage bzw. Rückmeldungen für gestern, heute und morgen berücksichtigt werden. weekEnd selbst kann, muß aber nicht zugleich ein [[Gerät]] des Typs &#039;&#039;holiday&#039;&#039; sein.&lt;br /&gt;
Ein &#039;&#039;noWeekEnd&#039;&#039;-Eintrag sollte dagegen mit einem Device verknüpft sein, denn alle Tage, die von diesem Gerät nach der üblichen Syntax als Treffer zurückgeliefert werden, werden abschließend als &#039;&#039;kein Feiertag&#039; behandelt. Damit könnte man z.B. den ersten Weihnachtsfeiertag zum normalen Wochentag machen, egal, was andere &#039;&#039;holiday2we&#039;-Einträge dazu melden, und auch gleichgültig, ob dies zugleich ein Sonntag ist.&lt;br /&gt;
&lt;br /&gt;
=== Mitgelieferte holiday-Dateien ===&lt;br /&gt;
FHEM liefert eine Reihe von vordefinierten holiday-Dateien mit:&lt;br /&gt;
&lt;br /&gt;
* Dateien für die deutschen Bundesländer (abgekürzt laut [https://www.bmel-statistik.de/footernavigation/archiv/statistischer-monatsbericht/abkuerzungen-der-bundeslaender/ amtlicher Liste]), z.B. &#039;&#039;hh.holiday&#039;&#039; für Hamburg.&lt;br /&gt;
* Feiertage in Österreich: &#039;&#039;aut.holiday&#039;&#039;&lt;br /&gt;
* Feiertage im Vereinigten Königreich und Nordirland: &#039;&#039;en.holiday&#039;&#039;&lt;br /&gt;
* Islamische Feiertage: &#039;&#039;islam20xx.holiday&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Feiertage mittels Internet-Kalender ==&lt;br /&gt;
{{Randnotiz|RNText=Alle x Stunden -wie hier dargestellt- einen unveränderten Jahres-Ferienkalender aus dem Internet erneut abzurufen ist nicht sinnvoll, da unnötige Abhängigkeiten des FHEM-Servers zur Verfügbarkeit des externen Servers entstehen. Zudem erzeugt dies unnötige Last auf dem externen Server. Besser ist es, nur einmal jährlich den Ferienkalender abzurufen und auf dem eigenen FHEM-Server zu speichern. Das Vorgehen ist beispielhaft in {{Link2Forum|Topic=36244|Message=299631}} beschrieben.}}&lt;br /&gt;
Theoretisch kann man in o.a. Datei auch seine persönlichen Urlaube oder die Schulferien definieren. Hier eignet sich jedoch die &#039;&#039;Calendar&#039;&#039;-Funktion wesentlich besser. V.a. die Schulferien der einzelnen Bundesländer sind im Internet (z.B. unter [http://www.ferienwiki.de ferienwiki.de]) als iCal-Datei verfügbar und können wie folgt in FHEM eingebunden werden:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define BW_Ferien Calendar ical url https://www.ferienwiki.de/exports/ferien/2020/de/baden-wuerttemberg 86400&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Das Intervall von 86400 Sekunden (entspricht 24 Stunden) für die Aktualisierung der Schulferien sollte im Normalbetrieb mehr als ausreichen. Wenn eigene Kalender (z.B. bei Google) für Urlaubstage genutzt werden, muss man individuell abwägen, wie oft dieser aktualisiert werden soll.&lt;br /&gt;
&lt;br /&gt;
Nach dem Einbinden des Kalenders kann man sich die Termine anzeigen lassen:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
get BW_Ferien events&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Den Kalender kann man nun z.B. nutzen, um einen dummy zu setzen, der später entsprechend abgefragt werden kann. Man braucht dazu noch ein notify, welches direkt auf die Events des Kalenders reagiert.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define Ferientag dummy&lt;br /&gt;
&lt;br /&gt;
define n_Ferien notify BW_Ferien:changed:.*start|BW_Ferien:changed:.*end {\&lt;br /&gt;
   my $stat=($EVTPART2 eq &amp;quot;start&amp;quot;)?1:0;;\&lt;br /&gt;
   fhem(&amp;quot;set Ferientag $stat&amp;quot;) if defined fhem(&#039;get &#039;.$NAME.&#039; events filter:uid==&amp;quot;&#039;.\&lt;br /&gt;
         $EVTPART1.&#039;&amp;quot;,field(summary)=~&amp;quot;(?i)ferien&amp;quot; limit:count=1&#039;,1)\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Der &#039;&#039;Ferientag&#039;&#039; ist in diesem Beispiel der angesprochene &#039;&#039;dummy&#039;&#039; und kann mittels &#039;&#039;Value(&amp;quot;Ferientag&amp;quot;)&#039;&#039; abgefragt werden. Im &#039;&#039;notify&#039;&#039; wird der Wert auf 1 gesetzt, sobald der Kalenderevent startet und auf 0 sobald der Event endet.  (vgl. {{Link2CmdRef|Anker=Calendar}} )&lt;br /&gt;
&lt;br /&gt;
Um die Funktion zu testen, kann man sich aus dem Kalender Reading modeUpcoming die erste ID herauskopieren (Beispiel im April, Kalender 2020 Baden-Würtemberg)  und mit dem trigger Befehl die Events des Calendar Devices einmal simulieren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trigger BW_Ferien changed: 28f0d17b082149c3a6ef99c04153e937 start&lt;br /&gt;
trigger BW_Ferien changed: 28f0d17b082149c3a6ef99c04153e937 end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um ein Rollo nun weder am Wochenende, an Feiertagen, noch zu Schulferien morgens hochfahren zu lassen, lautet das Beispiel:&lt;br /&gt;
&lt;br /&gt;
  define RolloHoch at *07:00 { if (&amp;amp;#160;!($we) &amp;amp;amp;&amp;amp;amp;&amp;amp;#160;!(Value(&amp;amp;quot;Ferientag&amp;amp;quot;)) ) { fhem(&amp;amp;quot;set Rollo hoch&amp;amp;quot;);; } }&lt;br /&gt;
&lt;br /&gt;
Ausgehend von diesem Artikel ist unter [[Google-Kalender zur Steuerung von Dummies]] eine Vorgehensweise zur&lt;br /&gt;
Steuerung von FHEM mit dem Google-Kalender veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
Diese Methode unterstützt jedoch nicht die Feiertagserkennung des {{Link2CmdRef|Lang=de|Anker=DOIF|Label=DOIF}}-Moduls, speziell im Abschnitt {{Link2CmdRef|Lang=de|Anker=DOIF_Wochentagsteuerung|Label=Wochentagssteuerung}}. Hier wird nur der Status der &#039;&#039;$we&#039;&#039;-Variable abgefragt und die Methode mit dem eigenen Holiday-Kalender empfohlen.&lt;br /&gt;
&lt;br /&gt;
== Links / Referenzen ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]] &lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37452</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37452"/>
		<updated>2022-05-24T15:32:19Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: FHEM-Devices für die Verwendung mit Rhasspy konfigurieren - Korrekturen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;siteId&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;autoTraining&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;), 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden und &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt;, das für Tests und andere Text-Eingabemöglichkeiten wichtig ist.&lt;br /&gt;
&lt;br /&gt;
=== baseUrl ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== devspec ===&lt;br /&gt;
&#039;&#039;devspec&#039;&#039; der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
&lt;br /&gt;
=== defaultRoom ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== language ===&lt;br /&gt;
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== fhemId ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== siteId ===&lt;br /&gt;
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als &#039;&#039;Satellit&#039;&#039; 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 &#039;&#039;language&#039;&#039;-Kürzel und der &#039;&#039;fhemId&#039;&#039; zusammengesetzt.&lt;br /&gt;
{{Hinweis|Für die Funktionalitäten &#039;&#039;test_sentence&#039;&#039;, &#039;&#039;test_file&#039;&#039;, &#039;&#039;msgDialog&#039;&#039; und &#039;&#039;AMAD.*&#039;&#039; ist es &#039;&#039;&#039;zwingend erforderlich&#039;&#039;&#039;, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}&lt;br /&gt;
&lt;br /&gt;
=== prefix ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== useGenericAttrs ===&lt;br /&gt;
Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen und die automatisierte Eigenschaftenerkennung. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== encoding ===&lt;br /&gt;
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== handleHotword ===&lt;br /&gt;
Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#rhasspyHotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autoTraining ===&lt;br /&gt;
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 &amp;quot;0&amp;quot;, wird diese Funktion deaktiviert, alle anderen numerischen Werte werden als Änderung dieses Timeouts (in Sekunden) interpretiert&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;autoTraining=60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteId, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set-Befehle (SET) ==&lt;br /&gt;
&lt;br /&gt;
=== customSlot ===&lt;br /&gt;
Erstellt einen neuen - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
* &amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
* &amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fetchSiteIds ===&lt;br /&gt;
Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
Sendet eine WAV Datei an Rhasspy, &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== speak ===&lt;br /&gt;
Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
&lt;br /&gt;
Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== textCommand ===&lt;br /&gt;
Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
Mangels siteId erfolgt hier keine Rückmeldung zum ausgeführten Kommando.&lt;br /&gt;
&lt;br /&gt;
=== trainRhasspy ===&lt;br /&gt;
Startet das Training von Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&#039;&#039;update&#039;&#039; kennt diverse Abstufungen:&lt;br /&gt;
&lt;br /&gt;
==== update devicemap ====&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update devicemap_only ====&lt;br /&gt;
Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update slots ====&lt;br /&gt;
Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
&lt;br /&gt;
Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
* de.fhem.AllKeywords  (Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
* de.fhem.Device&lt;br /&gt;
* de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
* de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
* de.fhem.Group&lt;br /&gt;
* de.fhem.Room&lt;br /&gt;
* de.fhem.MediaChannels&lt;br /&gt;
* de.fhem.Color&lt;br /&gt;
* de.fhem.NumericType&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== slots_no_training ====&lt;br /&gt;
Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update language ====&lt;br /&gt;
Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
&lt;br /&gt;
Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update intent_filter ====&lt;br /&gt;
Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#intentFilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update all ====&lt;br /&gt;
Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== volume ===&lt;br /&gt;
Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float). Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden sollte, v.a. wenn das [[#autoTraining|autoTraining]] in der DEF deaktiviert wurde!}}&lt;br /&gt;
&lt;br /&gt;
== Get-Befehle (GET) ==&lt;br /&gt;
=== export_mapping ===&lt;br /&gt;
Liefert für das angegebene Device ein &amp;quot;klassisches&amp;quot; &#039;&#039;rhasspyMapping&#039;&#039;, das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen (z.B. bei &#039;&#039;SetScene&#039;&#039; und dem Szenen-Format für &#039;&#039;HUEBridge&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== test_file ===&lt;br /&gt;
Anzugeben ist der Dateiname (einschl. Pfad)&lt;br /&gt;
&lt;br /&gt;
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 &#039;_result.txt&#039; endet. &#039;&#039;stop&#039;&#039; 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.&lt;br /&gt;
Für diese Funktion ist es zwingend erforderlich, dass die &#039;&#039;siteId&#039;&#039; der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
=== test_sentence ===&lt;br /&gt;
Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei &#039;&#039;test_file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#rhasspyShortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen|Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
Um das Verhalten von RHASSPY beeinflussen zu können, können neben den bei den Attributen verfügbaren &#039;&#039;Tweaks&#039;&#039; auch die folgenden Readings genutzt - und v.a. auch im laufenden Betrieb immer weider geändert - werden:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Ein Beispiel, mit dem dies per Sprachkommando erfolgt, ist in &#039;&#039;contrib&#039;&#039; zu finden, mit der mobilen Satelliten per Funktionsaufruf in einem [[#rhasspyIntents|rhasspyIntent]] einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung (bzw. nach Abschluss aller Änderungen) an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#update devicemap|update devicemap]]&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Falls man Slots händisch befüllt, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der &#039;&#039;devspec&#039;&#039; im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== genericDeviceType ===&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels [[#gdt2groups|gdt2groups]] aus [[#rhasspyTweaks|rhasspyTweaks]])&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
=== rhasspyName ===&lt;br /&gt;
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 (&#039;&#039;alias&#039;&#039;), z.B. in Auswahldialogen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== rhasspyRoom ===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden (der erste Wert ist wieder der &#039;&#039;Hauptraum&#039;&#039; für Auswahldialoge etc.).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
&lt;br /&gt;
=== rhasspyGroup ===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== rhasspyMapping ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings ====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== rhasspySpecials ===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==== rhasspyChannels ====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== rhasspyColors ====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
\[deutlich{Factor:2}] ( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Factor&amp;lt;/code&amp;gt; Dieser Wert wird mit der Standard-Schrittweite (&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; im Mapping) multipliziert&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37450</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37450"/>
		<updated>2022-05-24T15:18:44Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;siteId&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;autoTraining&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;), 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden und &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt;, das für Tests und andere Text-Eingabemöglichkeiten wichtig ist.&lt;br /&gt;
&lt;br /&gt;
=== baseUrl ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== devspec ===&lt;br /&gt;
&#039;&#039;devspec&#039;&#039; der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
&lt;br /&gt;
=== defaultRoom ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== language ===&lt;br /&gt;
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== fhemId ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== siteId ===&lt;br /&gt;
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als &#039;&#039;Satellit&#039;&#039; 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 &#039;&#039;language&#039;&#039;-Kürzel und der &#039;&#039;fhemId&#039;&#039; zusammengesetzt.&lt;br /&gt;
{{Hinweis|Für die Funktionalitäten &#039;&#039;test_sentence&#039;&#039;, &#039;&#039;test_file&#039;&#039;, &#039;&#039;msgDialog&#039;&#039; und &#039;&#039;AMAD.*&#039;&#039; ist es &#039;&#039;&#039;zwingend erforderlich&#039;&#039;&#039;, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}&lt;br /&gt;
&lt;br /&gt;
=== prefix ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== useGenericAttrs ===&lt;br /&gt;
Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen und die automatisierte Eigenschaftenerkennung. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== encoding ===&lt;br /&gt;
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== handleHotword ===&lt;br /&gt;
Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#rhasspyHotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autoTraining ===&lt;br /&gt;
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 &amp;quot;0&amp;quot;, wird diese Funktion deaktiviert, alle anderen numerischen Werte werden als Änderung dieses Timeouts (in Sekunden) interpretiert&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;autoTraining=60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteId, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set-Befehle (SET) ==&lt;br /&gt;
&lt;br /&gt;
=== customSlot ===&lt;br /&gt;
Erstellt einen neuen - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
* &amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
* &amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fetchSiteIds ===&lt;br /&gt;
Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
Sendet eine WAV Datei an Rhasspy, &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== speak ===&lt;br /&gt;
Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
&lt;br /&gt;
Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== textCommand ===&lt;br /&gt;
Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
Mangels siteId erfolgt hier keine Rückmeldung zum ausgeführten Kommando.&lt;br /&gt;
&lt;br /&gt;
=== trainRhasspy ===&lt;br /&gt;
Startet das Training von Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&#039;&#039;update&#039;&#039; kennt diverse Abstufungen:&lt;br /&gt;
&lt;br /&gt;
==== update devicemap ====&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update devicemap_only ====&lt;br /&gt;
Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update slots ====&lt;br /&gt;
Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
&lt;br /&gt;
Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
* de.fhem.AllKeywords  (Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
* de.fhem.Device&lt;br /&gt;
* de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
* de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
* de.fhem.Group&lt;br /&gt;
* de.fhem.Room&lt;br /&gt;
* de.fhem.MediaChannels&lt;br /&gt;
* de.fhem.Color&lt;br /&gt;
* de.fhem.NumericType&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== slots_no_training ====&lt;br /&gt;
Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update language ====&lt;br /&gt;
Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
&lt;br /&gt;
Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update intent_filter ====&lt;br /&gt;
Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#intentFilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update all ====&lt;br /&gt;
Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== volume ===&lt;br /&gt;
Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float). Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden sollte, v.a. wenn das [[#autoTraining|autoTraining]] in der DEF deaktiviert wurde!}}&lt;br /&gt;
&lt;br /&gt;
== Get-Befehle (GET) ==&lt;br /&gt;
=== export_mapping ===&lt;br /&gt;
Liefert für das angegebene Device ein &amp;quot;klassisches&amp;quot; &#039;&#039;rhasspyMapping&#039;&#039;, das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen (z.B. bei &#039;&#039;SetScene&#039;&#039; und dem Szenen-Format für &#039;&#039;HUEBridge&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== test_file ===&lt;br /&gt;
Anzugeben ist der Dateiname (einschl. Pfad)&lt;br /&gt;
&lt;br /&gt;
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 &#039;_result.txt&#039; endet. &#039;&#039;stop&#039;&#039; 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.&lt;br /&gt;
Für diese Funktion ist es zwingend erforderlich, dass die &#039;&#039;siteId&#039;&#039; der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
=== test_sentence ===&lt;br /&gt;
Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei &#039;&#039;test_file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#rhasspyShortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen|Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
Um das Verhalten von RHASSPY beeinflussen zu können, können neben den bei den Attributen verfügbaren &#039;&#039;Tweaks&#039;&#039; auch die folgenden Readings genutzt - und v.a. auch im laufenden Betrieb immer weider geändert - werden:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Ein Beispiel, mit dem dies per Sprachkommando erfolgt, ist in &#039;&#039;contrib&#039;&#039; zu finden, mit der mobilen Satelliten per Funktionsaufruf in einem [[#rhasspyIntents|rhasspyIntent]] einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
\[deutlich{Factor:2}] ( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Factor&amp;lt;/code&amp;gt; Dieser Wert wird mit der Standard-Schrittweite (&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; im Mapping) multipliziert&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37449</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37449"/>
		<updated>2022-05-24T15:16:19Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Benutzerdefinierte Readings - Übersetzung/Klarstellung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;siteId&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;autoTraining&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;), 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden und &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt;, das für Tests und andere Text-Eingabemöglichkeiten wichtig ist.&lt;br /&gt;
&lt;br /&gt;
=== baseUrl ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== devspec ===&lt;br /&gt;
&#039;&#039;devspec&#039;&#039; der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
&lt;br /&gt;
=== defaultRoom ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== language ===&lt;br /&gt;
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== fhemId ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== siteId ===&lt;br /&gt;
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als &#039;&#039;Satellit&#039;&#039; 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 &#039;&#039;language&#039;&#039;-Kürzel und der &#039;&#039;fhemId&#039;&#039; zusammengesetzt.&lt;br /&gt;
{{Hinweis|Für die Funktionalitäten &#039;&#039;test_sentence&#039;&#039;, &#039;&#039;test_file&#039;&#039;, &#039;&#039;msgDialog&#039;&#039; und &#039;&#039;AMAD.*&#039;&#039; ist es &#039;&#039;&#039;zwingend erforderlich&#039;&#039;&#039;, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}&lt;br /&gt;
&lt;br /&gt;
=== prefix ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== useGenericAttrs ===&lt;br /&gt;
Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen und die automatisierte Eigenschaftenerkennung. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== encoding ===&lt;br /&gt;
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== handleHotword ===&lt;br /&gt;
Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#rhasspyHotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autoTraining ===&lt;br /&gt;
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 &amp;quot;0&amp;quot;, wird diese Funktion deaktiviert, alle anderen numerischen Werte werden als Änderung dieses Timeouts (in Sekunden) interpretiert&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;autoTraining=60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteId, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set-Befehle (SET) ==&lt;br /&gt;
&lt;br /&gt;
=== customSlot ===&lt;br /&gt;
Erstellt einen neuen - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
* &amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
* &amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fetchSiteIds ===&lt;br /&gt;
Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
Sendet eine WAV Datei an Rhasspy, &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== speak ===&lt;br /&gt;
Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
&lt;br /&gt;
Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== textCommand ===&lt;br /&gt;
Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
Mangels siteId erfolgt hier keine Rückmeldung zum ausgeführten Kommando.&lt;br /&gt;
&lt;br /&gt;
=== trainRhasspy ===&lt;br /&gt;
Startet das Training von Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&#039;&#039;update&#039;&#039; kennt diverse Abstufungen:&lt;br /&gt;
&lt;br /&gt;
==== update devicemap ====&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update devicemap_only ====&lt;br /&gt;
Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update slots ====&lt;br /&gt;
Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
&lt;br /&gt;
Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
* de.fhem.AllKeywords  (Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
* de.fhem.Device&lt;br /&gt;
* de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
* de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
* de.fhem.Group&lt;br /&gt;
* de.fhem.Room&lt;br /&gt;
* de.fhem.MediaChannels&lt;br /&gt;
* de.fhem.Color&lt;br /&gt;
* de.fhem.NumericType&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== slots_no_training ====&lt;br /&gt;
Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update language ====&lt;br /&gt;
Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
&lt;br /&gt;
Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update intent_filter ====&lt;br /&gt;
Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#intentFilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update all ====&lt;br /&gt;
Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== volume ===&lt;br /&gt;
Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float). Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden sollte, v.a. wenn das [[#autoTraining|autoTraining]] in der DEF deaktiviert wurde!}}&lt;br /&gt;
&lt;br /&gt;
== Get-Befehle (GET) ==&lt;br /&gt;
=== export_mapping ===&lt;br /&gt;
Liefert für das angegebene Device ein &amp;quot;klassisches&amp;quot; &#039;&#039;rhasspyMapping&#039;&#039;, das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen (z.B. bei &#039;&#039;SetScene&#039;&#039; und dem Szenen-Format für &#039;&#039;HUEBridge&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== test_file ===&lt;br /&gt;
Anzugeben ist der Dateiname (einschl. Pfad)&lt;br /&gt;
&lt;br /&gt;
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 &#039;_result.txt&#039; endet. &#039;&#039;stop&#039;&#039; 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.&lt;br /&gt;
Für diese Funktion ist es zwingend erforderlich, dass die &#039;&#039;siteId&#039;&#039; der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
=== test_sentence ===&lt;br /&gt;
Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei &#039;&#039;test_file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#rhasspyShortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen|Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
Um das Verhalten von RHASSPY beeinflussen zu können, können neben den bei den Attributen verfügbaren &#039;&#039;Tweaks&#039;&#039; auch die folgenden Readings genutzt - und v.a. auch im laufenden Betrieb immer weider geändert - werden:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Ein Beispiel, mit dem dies per Sprachkommando erfolgt, ist in &#039;&#039;contrib&#039;&#039; zu finden, mit der mobilen Satelliten per Funktionsaufruf in einem [[#rhasspyIntent|rhasspyIntent]] einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
\[deutlich{Factor:2}] ( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Factor&amp;lt;/code&amp;gt; Dieser Wert wird mit der Standard-Schrittweite (&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; im Mapping) multipliziert&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37448</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37448"/>
		<updated>2022-05-24T15:08:19Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Formatierung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;siteId&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;autoTraining&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;), 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden und &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt;, das für Tests und andere Text-Eingabemöglichkeiten wichtig ist.&lt;br /&gt;
&lt;br /&gt;
=== baseUrl ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== devspec ===&lt;br /&gt;
&#039;&#039;devspec&#039;&#039; der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
&lt;br /&gt;
=== defaultRoom ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== language ===&lt;br /&gt;
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== fhemId ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== siteId ===&lt;br /&gt;
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als &#039;&#039;Satellit&#039;&#039; 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 &#039;&#039;language&#039;&#039;-Kürzel und der &#039;&#039;fhemId&#039;&#039; zusammengesetzt.&lt;br /&gt;
{{Hinweis|Für die Funktionalitäten &#039;&#039;test_sentence&#039;&#039;, &#039;&#039;test_file&#039;&#039;, &#039;&#039;msgDialog&#039;&#039; und &#039;&#039;AMAD.*&#039;&#039; ist es &#039;&#039;&#039;zwingend erforderlich&#039;&#039;&#039;, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}&lt;br /&gt;
&lt;br /&gt;
=== prefix ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== useGenericAttrs ===&lt;br /&gt;
Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen und die automatisierte Eigenschaftenerkennung. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== encoding ===&lt;br /&gt;
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== handleHotword ===&lt;br /&gt;
Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#rhasspyHotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autoTraining ===&lt;br /&gt;
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 &amp;quot;0&amp;quot;, wird diese Funktion deaktiviert, alle anderen numerischen Werte werden als Änderung dieses Timeouts (in Sekunden) interpretiert&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;autoTraining=60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteId, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set-Befehle (SET) ==&lt;br /&gt;
&lt;br /&gt;
=== customSlot ===&lt;br /&gt;
Erstellt einen neuen - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
* &amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
* &amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fetchSiteIds ===&lt;br /&gt;
Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
Sendet eine WAV Datei an Rhasspy, &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== speak ===&lt;br /&gt;
Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
&lt;br /&gt;
Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== textCommand ===&lt;br /&gt;
Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
Mangels siteId erfolgt hier keine Rückmeldung zum ausgeführten Kommando.&lt;br /&gt;
&lt;br /&gt;
=== trainRhasspy ===&lt;br /&gt;
Startet das Training von Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&#039;&#039;update&#039;&#039; kennt diverse Abstufungen:&lt;br /&gt;
&lt;br /&gt;
==== update devicemap ====&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update devicemap_only ====&lt;br /&gt;
Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update slots ====&lt;br /&gt;
Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
&lt;br /&gt;
Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
* de.fhem.AllKeywords  (Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
* de.fhem.Device&lt;br /&gt;
* de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
* de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
* de.fhem.Group&lt;br /&gt;
* de.fhem.Room&lt;br /&gt;
* de.fhem.MediaChannels&lt;br /&gt;
* de.fhem.Color&lt;br /&gt;
* de.fhem.NumericType&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== slots_no_training ====&lt;br /&gt;
Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update language ====&lt;br /&gt;
Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
&lt;br /&gt;
Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update intent_filter ====&lt;br /&gt;
Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#intentFilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update all ====&lt;br /&gt;
Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== volume ===&lt;br /&gt;
Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float). Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden sollte, v.a. wenn das [[#autoTraining|autoTraining]] in der DEF deaktiviert wurde!}}&lt;br /&gt;
&lt;br /&gt;
== Get-Befehle (GET) ==&lt;br /&gt;
=== export_mapping ===&lt;br /&gt;
Liefert für das angegebene Device ein &amp;quot;klassisches&amp;quot; &#039;&#039;rhasspyMapping&#039;&#039;, das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen (z.B. bei &#039;&#039;SetScene&#039;&#039; und dem Szenen-Format für &#039;&#039;HUEBridge&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== test_file ===&lt;br /&gt;
Anzugeben ist der Dateiname (einschl. Pfad)&lt;br /&gt;
&lt;br /&gt;
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 &#039;_result.txt&#039; endet. &#039;&#039;stop&#039;&#039; 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.&lt;br /&gt;
Für diese Funktion ist es zwingend erforderlich, dass die &#039;&#039;siteId&#039;&#039; der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
=== test_sentence ===&lt;br /&gt;
Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei &#039;&#039;test_file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#rhasspyShortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen|Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
\[deutlich{Factor:2}] ( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Factor&amp;lt;/code&amp;gt; Dieser Wert wird mit der Standard-Schrittweite (&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; im Mapping) multipliziert&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37447</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37447"/>
		<updated>2022-05-24T15:07:34Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: links repariert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;siteId&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;autoTraining&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;), 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden und &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt;, das für Tests und andere Text-Eingabemöglichkeiten wichtig ist.&lt;br /&gt;
&lt;br /&gt;
=== baseUrl ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== devspec ===&lt;br /&gt;
&#039;&#039;devspec&#039;&#039; der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
&lt;br /&gt;
=== defaultRoom ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== language ===&lt;br /&gt;
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== fhemId ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== siteId ===&lt;br /&gt;
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als &#039;&#039;Satellit&#039;&#039; 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 &#039;&#039;language&#039;&#039;-Kürzel und der &#039;&#039;fhemId&#039;&#039; zusammengesetzt.&lt;br /&gt;
{{Hinweis|Für die Funktionalitäten &#039;&#039;test_sentence&#039;&#039;, &#039;&#039;test_file&#039;&#039;, &#039;&#039;msgDialog&#039;&#039; und &#039;&#039;AMAD.*&#039;&#039; ist es &#039;&#039;&#039;zwingend erforderlich&#039;&#039;&#039;, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}&lt;br /&gt;
&lt;br /&gt;
=== prefix ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== useGenericAttrs ===&lt;br /&gt;
Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen und die automatisierte Eigenschaftenerkennung. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== encoding ===&lt;br /&gt;
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== handleHotword ===&lt;br /&gt;
Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#rhasspyHotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autoTraining ===&lt;br /&gt;
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 &amp;quot;0&amp;quot;, wird diese Funktion deaktiviert, alle anderen numerischen Werte werden als Änderung dieses Timeouts (in Sekunden) interpretiert&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;autoTraining=60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteId, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set-Befehle (SET) ==&lt;br /&gt;
&lt;br /&gt;
=== customSlot ===&lt;br /&gt;
Erstellt einen neuen - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
* &amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
* &amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fetchSiteIds ===&lt;br /&gt;
Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
Sendet eine WAV Datei an Rhasspy, &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== speak ===&lt;br /&gt;
Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
&lt;br /&gt;
Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== textCommand ===&lt;br /&gt;
Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
Mangels siteId erfolgt hier keine Rückmeldung zum ausgeführten Kommando.&lt;br /&gt;
&lt;br /&gt;
=== trainRhasspy ===&lt;br /&gt;
Startet das Training von Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&#039;&#039;update&#039;&#039; kennt diverse Abstufungen:&lt;br /&gt;
&lt;br /&gt;
==== update devicemap ====&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update devicemap_only ====&lt;br /&gt;
Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update slots ====&lt;br /&gt;
Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
&lt;br /&gt;
Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
* de.fhem.AllKeywords  (Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
* de.fhem.Device&lt;br /&gt;
* de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
* de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
* de.fhem.Group&lt;br /&gt;
* de.fhem.Room&lt;br /&gt;
* de.fhem.MediaChannels&lt;br /&gt;
* de.fhem.Color&lt;br /&gt;
* de.fhem.NumericType&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== slots_no_training ====&lt;br /&gt;
Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update language ====&lt;br /&gt;
Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
&lt;br /&gt;
Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update intent_filter ====&lt;br /&gt;
Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#intentFilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update all ====&lt;br /&gt;
Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== volume ===&lt;br /&gt;
Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float). Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden sollte, v.a. wenn das [[#autoTraining|autoTraining]] in der DEF deaktiviert wurde!}}&lt;br /&gt;
&lt;br /&gt;
== Get-Befehle (GET) ==&lt;br /&gt;
=== export_mapping ===&lt;br /&gt;
Liefert für das angegebene Device ein &amp;quot;klassisches&amp;quot; &#039;&#039;rhasspyMapping&#039;&#039;, das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen (z.B. bei &#039;&#039;SetScene&#039;&#039; und dem Szenen-Format für &#039;&#039;HUEBridge&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== test_file ===&lt;br /&gt;
Anzugeben ist der Dateiname (einschl. Pfad)&lt;br /&gt;
&lt;br /&gt;
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 &#039;_result.txt&#039; endet. &#039;&#039;stop&#039;&#039; 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.&lt;br /&gt;
Für diese Funktion ist es zwingend erforderlich, dass die &#039;&#039;siteId&#039;&#039; der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
=== test_sentence ===&lt;br /&gt;
Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei &#039;&#039;test_file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#rhasspyShortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen|Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
\[deutlich{Factor:2}] ( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Factor&amp;lt;/code&amp;gt; Dieser Wert wird mit der Standard-Schrittweite (&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; im Mapping) multipliziert&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37446</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37446"/>
		<updated>2022-05-24T15:05:07Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: volume =&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;siteId&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;autoTraining&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;), 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden und &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt;, das für Tests und andere Text-Eingabemöglichkeiten wichtig ist.&lt;br /&gt;
&lt;br /&gt;
=== baseUrl ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== devspec ===&lt;br /&gt;
&#039;&#039;devspec&#039;&#039; der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
&lt;br /&gt;
=== defaultRoom ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== language ===&lt;br /&gt;
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== fhemId ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== siteId ===&lt;br /&gt;
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als &#039;&#039;Satellit&#039;&#039; 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 &#039;&#039;language&#039;&#039;-Kürzel und der &#039;&#039;fhemId&#039;&#039; zusammengesetzt.&lt;br /&gt;
{{Hinweis|Für die Funktionalitäten &#039;&#039;test_sentence&#039;&#039;, &#039;&#039;test_file&#039;&#039;, &#039;&#039;msgDialog&#039;&#039; und &#039;&#039;AMAD.*&#039;&#039; ist es &#039;&#039;&#039;zwingend erforderlich&#039;&#039;&#039;, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}&lt;br /&gt;
&lt;br /&gt;
=== prefix ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== useGenericAttrs ===&lt;br /&gt;
Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen und die automatisierte Eigenschaftenerkennung. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== encoding ===&lt;br /&gt;
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== handleHotword ===&lt;br /&gt;
Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#rhasspyHotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autoTraining ===&lt;br /&gt;
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 &amp;quot;0&amp;quot;, wird diese Funktion deaktiviert, alle anderen numerischen Werte werden als Änderung dieses Timeouts (in Sekunden) interpretiert&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;autoTraining=60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteId, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set-Befehle (SET) ==&lt;br /&gt;
&lt;br /&gt;
=== customSlot ===&lt;br /&gt;
Erstellt einen neuen - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
* &amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
* &amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fetchSiteIds ===&lt;br /&gt;
Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
Sendet eine WAV Datei an Rhasspy, &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== speak ===&lt;br /&gt;
Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
&lt;br /&gt;
Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== textCommand ===&lt;br /&gt;
Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
Mangels siteId erfolgt hier keine Rückmeldung zum ausgeführten Kommando.&lt;br /&gt;
&lt;br /&gt;
=== trainRhasspy ===&lt;br /&gt;
Startet das Training von Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&#039;&#039;update&#039;&#039; kennt diverse Abstufungen:&lt;br /&gt;
&lt;br /&gt;
==== update devicemap ====&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update devicemap_only ====&lt;br /&gt;
Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update slots ====&lt;br /&gt;
Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
&lt;br /&gt;
Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
* de.fhem.AllKeywords  (Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
* de.fhem.Device&lt;br /&gt;
* de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
* de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
* de.fhem.Group&lt;br /&gt;
* de.fhem.Room&lt;br /&gt;
* de.fhem.MediaChannels&lt;br /&gt;
* de.fhem.Color&lt;br /&gt;
* de.fhem.NumericType&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== slots_no_training ====&lt;br /&gt;
Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update language ====&lt;br /&gt;
Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
&lt;br /&gt;
Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update intent_filter ====&lt;br /&gt;
Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#intentFilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update all ====&lt;br /&gt;
Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== volume ===&lt;br /&gt;
Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float). Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden sollte, v.a. wenn das [[#autoTraining|autoTraining]] in der DEF deaktiviert wurde!}}&lt;br /&gt;
&lt;br /&gt;
== Get-Befehle (GET) ==&lt;br /&gt;
=== export_mapping ===&lt;br /&gt;
Liefert für das angegebene Device ein &amp;quot;klassisches&amp;quot; &#039;&#039;rhasspyMapping&#039;&#039;, das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen (z.B. bei &#039;&#039;SetScene&#039;&#039; und dem Szenen-Format für &#039;&#039;HUEBridge&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== test_file ===&lt;br /&gt;
Anzugeben ist der Dateiname (einschl. Pfad)&lt;br /&gt;
&lt;br /&gt;
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 &#039;_result.txt&#039; endet. &#039;&#039;stop&#039;&#039; 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.&lt;br /&gt;
Für diese Funktion ist es zwingend erforderlich, dass die &#039;&#039;siteId&#039;&#039; der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
=== test_sentence ===&lt;br /&gt;
Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei &#039;&#039;test_file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
\[deutlich{Factor:2}] ( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Factor&amp;lt;/code&amp;gt; Dieser Wert wird mit der Standard-Schrittweite (&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; im Mapping) multipliziert&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37445</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37445"/>
		<updated>2022-05-24T15:04:18Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Set-Befehle (SET) - Ergänzungen + Formatierung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;siteId&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;autoTraining&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;), 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden und &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt;, das für Tests und andere Text-Eingabemöglichkeiten wichtig ist.&lt;br /&gt;
&lt;br /&gt;
=== baseUrl ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== devspec ===&lt;br /&gt;
&#039;&#039;devspec&#039;&#039; der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
&lt;br /&gt;
=== defaultRoom ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== language ===&lt;br /&gt;
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== fhemId ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== siteId ===&lt;br /&gt;
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als &#039;&#039;Satellit&#039;&#039; 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 &#039;&#039;language&#039;&#039;-Kürzel und der &#039;&#039;fhemId&#039;&#039; zusammengesetzt.&lt;br /&gt;
{{Hinweis|Für die Funktionalitäten &#039;&#039;test_sentence&#039;&#039;, &#039;&#039;test_file&#039;&#039;, &#039;&#039;msgDialog&#039;&#039; und &#039;&#039;AMAD.*&#039;&#039; ist es &#039;&#039;&#039;zwingend erforderlich&#039;&#039;&#039;, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}&lt;br /&gt;
&lt;br /&gt;
=== prefix ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== useGenericAttrs ===&lt;br /&gt;
Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen und die automatisierte Eigenschaftenerkennung. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== encoding ===&lt;br /&gt;
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== handleHotword ===&lt;br /&gt;
Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#rhasspyHotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autoTraining ===&lt;br /&gt;
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 &amp;quot;0&amp;quot;, wird diese Funktion deaktiviert, alle anderen numerischen Werte werden als Änderung dieses Timeouts (in Sekunden) interpretiert&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;autoTraining=60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteId, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set-Befehle (SET) ==&lt;br /&gt;
&lt;br /&gt;
=== customSlot ===&lt;br /&gt;
Erstellt einen neuen - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
* &amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
* &amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fetchSiteIds ===&lt;br /&gt;
Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== play ===&lt;br /&gt;
Sendet eine WAV Datei an Rhasspy, &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== speak ===&lt;br /&gt;
Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
&lt;br /&gt;
Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== textCommand ===&lt;br /&gt;
Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
Mangels siteId erfolgt hier keine Rückmeldung zum ausgeführten Kommando.&lt;br /&gt;
&lt;br /&gt;
=== trainRhasspy ===&lt;br /&gt;
Startet das Training von Rhasspy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&#039;&#039;update&#039;&#039; kennt diverse Abstufungen:&lt;br /&gt;
&lt;br /&gt;
==== update devicemap ====&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update devicemap_only ====&lt;br /&gt;
Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update slots ====&lt;br /&gt;
Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
&lt;br /&gt;
Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
* de.fhem.AllKeywords  (Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
* de.fhem.Device&lt;br /&gt;
* de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
* de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
* de.fhem.Group&lt;br /&gt;
* de.fhem.Room&lt;br /&gt;
* de.fhem.MediaChannels&lt;br /&gt;
* de.fhem.Color&lt;br /&gt;
* de.fhem.NumericType&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== slots_no_training ====&lt;br /&gt;
Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update language ====&lt;br /&gt;
Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
&lt;br /&gt;
Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update intent_filter ====&lt;br /&gt;
Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#intentFilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== update all ====&lt;br /&gt;
Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== volume ====&lt;br /&gt;
Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float). Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden sollte, v.a. wenn das [[#autoTraining|autoTraining]] in der DEF deaktiviert wurde!}}&lt;br /&gt;
&lt;br /&gt;
== Get-Befehle (GET) ==&lt;br /&gt;
=== export_mapping ===&lt;br /&gt;
Liefert für das angegebene Device ein &amp;quot;klassisches&amp;quot; &#039;&#039;rhasspyMapping&#039;&#039;, das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen (z.B. bei &#039;&#039;SetScene&#039;&#039; und dem Szenen-Format für &#039;&#039;HUEBridge&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== test_file ===&lt;br /&gt;
Anzugeben ist der Dateiname (einschl. Pfad)&lt;br /&gt;
&lt;br /&gt;
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 &#039;_result.txt&#039; endet. &#039;&#039;stop&#039;&#039; 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.&lt;br /&gt;
Für diese Funktion ist es zwingend erforderlich, dass die &#039;&#039;siteId&#039;&#039; der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
=== test_sentence ===&lt;br /&gt;
Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei &#039;&#039;test_file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
\[deutlich{Factor:2}] ( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Factor&amp;lt;/code&amp;gt; Dieser Wert wird mit der Standard-Schrittweite (&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; im Mapping) multipliziert&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37443</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37443"/>
		<updated>2022-05-24T13:30:46Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Factor bei SetNumeric ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;siteId&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;autoTraining&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;), 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden und &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt;, das für Tests und andere Text-Eingabemöglichkeiten wichtig ist.&lt;br /&gt;
&lt;br /&gt;
=== baseUrl ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== devspec ===&lt;br /&gt;
&#039;&#039;devspec&#039;&#039; der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
&lt;br /&gt;
=== defaultRoom ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== language ===&lt;br /&gt;
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== fhemId ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== siteId ===&lt;br /&gt;
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als &#039;&#039;Satellit&#039;&#039; 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 &#039;&#039;language&#039;&#039;-Kürzel und der &#039;&#039;fhemId&#039;&#039; zusammengesetzt.&lt;br /&gt;
{{Hinweis|Für die Funktionalitäten &#039;&#039;test_sentence&#039;&#039;, &#039;&#039;test_file&#039;&#039;, &#039;&#039;msgDialog&#039;&#039; und &#039;&#039;AMAD.*&#039;&#039; ist es &#039;&#039;&#039;zwingend erforderlich&#039;&#039;&#039;, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}&lt;br /&gt;
&lt;br /&gt;
=== prefix ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== useGenericAttrs ===&lt;br /&gt;
Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen und die automatisierte Eigenschaftenerkennung. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== encoding ===&lt;br /&gt;
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== handleHotword ===&lt;br /&gt;
Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#rhasspyHotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autoTraining ===&lt;br /&gt;
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 &amp;quot;0&amp;quot;, wird diese Funktion deaktiviert, alle anderen numerischen Werte werden als Änderung dieses Timeouts (in Sekunden) interpretiert&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;autoTraining=60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteId, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle (SET)==&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-customslot&amp;quot;&amp;gt;customSlot&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
:&amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
:&amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
:&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-fetchsiteids&amp;quot;&amp;gt;fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
:Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-play&amp;quot;&amp;gt;play&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet eine WAV Datei an Rhasspy.&lt;br /&gt;
:&amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
:Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
:&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-speak&amp;quot;&amp;gt;speak&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
:Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-textcommand&amp;quot;&amp;gt;textCommand&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-trainrhasspy&amp;quot;&amp;gt;trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
:Startet das Training von Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-update&amp;quot;&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemap&amp;quot;&amp;gt;devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemaponly&amp;quot;&amp;gt;devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slots&amp;quot;&amp;gt;slots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
::Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
::*de.fhem.AllKeywords&lt;br /&gt;
::*de.fhem.Device&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
::*de.fhem.Group&lt;br /&gt;
::*de.fhem.Room&lt;br /&gt;
::*de.fhem.MediaChannels&lt;br /&gt;
::*de.fhem.Color&lt;br /&gt;
::*de.fhem.NumericType&lt;br /&gt;
::(Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slotsnotraining&amp;quot;&amp;gt;slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
::Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
::Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-udpate-intentfilter&amp;quot;&amp;gt;intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
::Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#intentFilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-all&amp;quot;&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-volume&amp;quot;&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
::Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).&lt;br /&gt;
::Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden sollte, v.a. wenn das [[#autoTraining|autoTraining]] in der DEF deaktiviert wurde!}}&lt;br /&gt;
&lt;br /&gt;
== Get-Befehle (GET) ==&lt;br /&gt;
=== export_mapping ===&lt;br /&gt;
Liefert für das angegebene Device ein &amp;quot;klassisches&amp;quot; &#039;&#039;rhasspyMapping&#039;&#039;, das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen (z.B. bei &#039;&#039;SetScene&#039;&#039; und dem Szenen-Format für &#039;&#039;HUEBridge&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== test_file ===&lt;br /&gt;
Anzugeben ist der Dateiname (einschl. Pfad)&lt;br /&gt;
&lt;br /&gt;
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 &#039;_result.txt&#039; endet. &#039;&#039;stop&#039;&#039; 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.&lt;br /&gt;
Für diese Funktion ist es zwingend erforderlich, dass die &#039;&#039;siteId&#039;&#039; der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
=== test_sentence ===&lt;br /&gt;
Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei &#039;&#039;test_file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
\[deutlich{Factor:2}] ( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Factor&amp;lt;/code&amp;gt; Dieser Wert wird mit der Standard-Schrittweite (&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; im Mapping) multipliziert&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37440</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37440"/>
		<updated>2022-05-24T13:10:58Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Sprachliche Korrekturen, Verweise&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;siteId&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;autoTraining&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;), 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden und &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt;, das für Tests und andere Text-Eingabemöglichkeiten wichtig ist.&lt;br /&gt;
&lt;br /&gt;
=== baseUrl ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== devspec ===&lt;br /&gt;
&#039;&#039;devspec&#039;&#039; der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
&lt;br /&gt;
=== defaultRoom ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== language ===&lt;br /&gt;
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== fhemId ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== siteId ===&lt;br /&gt;
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als &#039;&#039;Satellit&#039;&#039; 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 &#039;&#039;language&#039;&#039;-Kürzel und der &#039;&#039;fhemId&#039;&#039; zusammengesetzt.&lt;br /&gt;
{{Hinweis|Für die Funktionalitäten &#039;&#039;test_sentence&#039;&#039;, &#039;&#039;test_file&#039;&#039;, &#039;&#039;msgDialog&#039;&#039; und &#039;&#039;AMAD.*&#039;&#039; ist es &#039;&#039;&#039;zwingend erforderlich&#039;&#039;&#039;, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}&lt;br /&gt;
&lt;br /&gt;
=== prefix ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== useGenericAttrs ===&lt;br /&gt;
Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen und die automatisierte Eigenschaftenerkennung. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== encoding ===&lt;br /&gt;
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== handleHotword ===&lt;br /&gt;
Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#rhasspyHotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== autoTraining ===&lt;br /&gt;
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 &amp;quot;0&amp;quot;, wird diese Funktion deaktiviert, alle anderen numerischen Werte werden als Änderung dieses Timeouts (in Sekunden) interpretiert&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;autoTraining=60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteId, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle (SET)==&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-customslot&amp;quot;&amp;gt;customSlot&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
:&amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
:&amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
:&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-fetchsiteids&amp;quot;&amp;gt;fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
:Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-play&amp;quot;&amp;gt;play&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet eine WAV Datei an Rhasspy.&lt;br /&gt;
:&amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
:Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
:&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-speak&amp;quot;&amp;gt;speak&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
:Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-textcommand&amp;quot;&amp;gt;textCommand&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-trainrhasspy&amp;quot;&amp;gt;trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
:Startet das Training von Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-update&amp;quot;&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemap&amp;quot;&amp;gt;devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemaponly&amp;quot;&amp;gt;devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slots&amp;quot;&amp;gt;slots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
::Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
::*de.fhem.AllKeywords&lt;br /&gt;
::*de.fhem.Device&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
::*de.fhem.Group&lt;br /&gt;
::*de.fhem.Room&lt;br /&gt;
::*de.fhem.MediaChannels&lt;br /&gt;
::*de.fhem.Color&lt;br /&gt;
::*de.fhem.NumericType&lt;br /&gt;
::(Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slotsnotraining&amp;quot;&amp;gt;slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
::Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
::Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-udpate-intentfilter&amp;quot;&amp;gt;intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
::Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#intentFilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-all&amp;quot;&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-volume&amp;quot;&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
::Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).&lt;br /&gt;
::Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden sollte, v.a. wenn das [[#autoTraining|autoTraining]] in der DEF deaktiviert wurde!}}&lt;br /&gt;
&lt;br /&gt;
== Get-Befehle (GET) ==&lt;br /&gt;
=== export_mapping ===&lt;br /&gt;
Liefert für das angegebene Device ein &amp;quot;klassisches&amp;quot; &#039;&#039;rhasspyMapping&#039;&#039;, das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen (z.B. bei &#039;&#039;SetScene&#039;&#039; und dem Szenen-Format für &#039;&#039;HUEBridge&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== test_file ===&lt;br /&gt;
Anzugeben ist der Dateiname (einschl. Pfad)&lt;br /&gt;
&lt;br /&gt;
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 &#039;_result.txt&#039; endet. &#039;&#039;stop&#039;&#039; 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.&lt;br /&gt;
Für diese Funktion ist es zwingend erforderlich, dass die &#039;&#039;siteId&#039;&#039; der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
=== test_sentence ===&lt;br /&gt;
Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei &#039;&#039;test_file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37439</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37439"/>
		<updated>2022-05-24T12:35:31Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Get-Befehle eingefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;siteId&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;autoTraining&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;). 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden.&lt;br /&gt;
&lt;br /&gt;
=== baseUrl ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== devspec ===&lt;br /&gt;
devspec der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
&lt;br /&gt;
=== defaultRoom ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== language ===&lt;br /&gt;
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== fhemId ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== siteId ===&lt;br /&gt;
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als &#039;&#039;Satellit&#039;&#039; 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 &#039;&#039;language&#039;&#039;-Kürzel und der &#039;&#039;fhemId&#039;&#039; zusammengesetzt.&lt;br /&gt;
{{Hinweis|Für die Funktionalitäten &#039;&#039;test_sentence&#039;&#039;, &#039;&#039;test_file&#039;&#039;, &#039;&#039;msgDialog&#039;&#039; und &#039;&#039;AMAD.*&#039;&#039; ist es &#039;&#039;&#039;zwingend erforderlich&#039;&#039;&#039;, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}&lt;br /&gt;
&lt;br /&gt;
=== prefix ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== useGenericAttrs ===&lt;br /&gt;
Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen und die automatisierte Eigenschaftenerkennung. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== encoding ===&lt;br /&gt;
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== handleHotword ===&lt;br /&gt;
Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#attr-rhasspyhotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteID, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle (SET)==&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-customslot&amp;quot;&amp;gt;customSlot&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
:&amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
:&amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
:&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-fetchsiteids&amp;quot;&amp;gt;fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
:Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-play&amp;quot;&amp;gt;play&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet eine WAV Datei an Rhasspy.&lt;br /&gt;
:&amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
:Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
:&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-speak&amp;quot;&amp;gt;speak&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
:Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-textcommand&amp;quot;&amp;gt;textCommand&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-trainrhasspy&amp;quot;&amp;gt;trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
:Startet das Training von Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-update&amp;quot;&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemap&amp;quot;&amp;gt;devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemaponly&amp;quot;&amp;gt;devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slots&amp;quot;&amp;gt;slots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
::Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
::*de.fhem.AllKeywords&lt;br /&gt;
::*de.fhem.Device&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
::*de.fhem.Group&lt;br /&gt;
::*de.fhem.Room&lt;br /&gt;
::*de.fhem.MediaChannels&lt;br /&gt;
::*de.fhem.Color&lt;br /&gt;
::*de.fhem.NumericType&lt;br /&gt;
::(Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slotsnotraining&amp;quot;&amp;gt;slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
::Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
::Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-udpate-intentfilter&amp;quot;&amp;gt;intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
::Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#attr-rhasspytweaks-intentfilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-all&amp;quot;&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-volume&amp;quot;&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
::Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).&lt;br /&gt;
::Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden muss!}}&lt;br /&gt;
&lt;br /&gt;
== Get-Befehle (GET) ==&lt;br /&gt;
=== export_mapping ===&lt;br /&gt;
Liefert für das angegebene Device ein &amp;quot;klassisches&amp;quot; &#039;&#039;rhasspyMapping&#039;&#039;, das dann als Basis für eigene Weiterentwicklungen genutzt werden kann. Funktioniert ggf. nicht in allen Fällen, v.a. bei &#039;&#039;SetScene&#039;&#039; und dem Szenen-Format für &#039;&#039;HUEBridge&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== test_file ===&lt;br /&gt;
Anzugeben ist der Dateiname (einschl. Pfad)&lt;br /&gt;
&lt;br /&gt;
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 &#039;_result.txt&#039; endet. &#039;&#039;stop&#039;&#039; als ateiname 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.&lt;br /&gt;
Für diese Funktion ist es zwingend erforderlich, dass die &#039;&#039;siteId&#039;&#039; der RHASSPY-Instanz bei der Intent-Recognition-Komponente in Rhasspy als Satellit angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
=== test_sentence ===&lt;br /&gt;
Es kann ein beliebiger einzelner Satz eingegeben werden, die Ausgabe erfolgt dann in einem eigenen Dialogfeld, ansonsten gilt sinngemäß dasselbe wie bei &#039;&#039;test_file&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37438</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37438"/>
		<updated>2022-05-24T12:23:28Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: /* Definition von RHASSPY (DEF) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;siteId&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;autoTraining&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;). 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden.&lt;br /&gt;
&lt;br /&gt;
=== baseUrl ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== devspec ===&lt;br /&gt;
devspec der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
&lt;br /&gt;
=== defaultRoom ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== language ===&lt;br /&gt;
Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== fhemId ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== siteId ===&lt;br /&gt;
Wenn bestimmte Funktionen genutzt werden sollen, muss die RHASSPY-Instanz für Rhasspy als &#039;&#039;Satellit&#039;&#039; 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 &#039;&#039;language&#039;&#039;-Kürzel und der &#039;&#039;fhemId&#039;&#039; zusammengesetzt.&lt;br /&gt;
{{Hinweis|Für die Funktionalitäten &#039;&#039;test_sentence&#039;&#039;, &#039;&#039;test_file&#039;&#039;, &#039;&#039;msgDialog&#039;&#039; und &#039;&#039;AMAD.*&#039;&#039; ist es &#039;&#039;&#039;zwingend erforderlich&#039;&#039;&#039;, die siteId in der Rhasspy-Intent-Recognition-Komponente einzutragen!}}&lt;br /&gt;
&lt;br /&gt;
=== prefix ===&lt;br /&gt;
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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== useGenericAttrs ===&lt;br /&gt;
Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen und die automatisierte Eigenschaftenerkennung. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== encoding ===&lt;br /&gt;
Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== handleHotword ===&lt;br /&gt;
Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#attr-rhasspyhotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteID, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle (SET)==&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-customslot&amp;quot;&amp;gt;customSlot&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
:&amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
:&amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
:&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-fetchsiteids&amp;quot;&amp;gt;fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
:Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-play&amp;quot;&amp;gt;play&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet eine WAV Datei an Rhasspy.&lt;br /&gt;
:&amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
:Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
:&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-speak&amp;quot;&amp;gt;speak&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
:Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-textcommand&amp;quot;&amp;gt;textCommand&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-trainrhasspy&amp;quot;&amp;gt;trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
:Startet das Training von Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-update&amp;quot;&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemap&amp;quot;&amp;gt;devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemaponly&amp;quot;&amp;gt;devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slots&amp;quot;&amp;gt;slots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
::Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
::*de.fhem.AllKeywords&lt;br /&gt;
::*de.fhem.Device&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
::*de.fhem.Group&lt;br /&gt;
::*de.fhem.Room&lt;br /&gt;
::*de.fhem.MediaChannels&lt;br /&gt;
::*de.fhem.Color&lt;br /&gt;
::*de.fhem.NumericType&lt;br /&gt;
::(Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slotsnotraining&amp;quot;&amp;gt;slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
::Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
::Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-udpate-intentfilter&amp;quot;&amp;gt;intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
::Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#attr-rhasspytweaks-intentfilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-all&amp;quot;&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-volume&amp;quot;&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
::Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).&lt;br /&gt;
::Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden muss!}}&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37437</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37437"/>
		<updated>2022-05-24T12:06:49Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Einrichtung MQTT2_CLIENT subscriptions ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected hermes/hotword/toggleOn     hermes/hotword/toggleOff hermes/tts/say &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;). 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-baseurl&amp;quot;&amp;gt;baseUrl&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-devspec&amp;quot;&amp;gt;devspec&amp;lt;/code&amp;gt;&lt;br /&gt;
:devspec der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-defaultroom&amp;quot;&amp;gt;defaultRoom&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-fhemid&amp;quot;&amp;gt;fhemId&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-prefix&amp;quot;&amp;gt;prefix&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-usegenericattrs&amp;quot;&amp;gt;&#039;&#039;&#039;useGenericAttrs&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-encoding&amp;quot;&amp;gt;encoding&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;handlehotword&amp;quot;&amp;gt;handleHotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#attr-rhasspyhotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteID, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle (SET)==&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-customslot&amp;quot;&amp;gt;customSlot&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
:&amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
:&amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
:&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-fetchsiteids&amp;quot;&amp;gt;fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
:Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-play&amp;quot;&amp;gt;play&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet eine WAV Datei an Rhasspy.&lt;br /&gt;
:&amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
:Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
:&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-speak&amp;quot;&amp;gt;speak&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
:Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-textcommand&amp;quot;&amp;gt;textCommand&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-trainrhasspy&amp;quot;&amp;gt;trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
:Startet das Training von Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-update&amp;quot;&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemap&amp;quot;&amp;gt;devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemaponly&amp;quot;&amp;gt;devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slots&amp;quot;&amp;gt;slots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
::Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
::*de.fhem.AllKeywords&lt;br /&gt;
::*de.fhem.Device&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
::*de.fhem.Group&lt;br /&gt;
::*de.fhem.Room&lt;br /&gt;
::*de.fhem.MediaChannels&lt;br /&gt;
::*de.fhem.Color&lt;br /&gt;
::*de.fhem.NumericType&lt;br /&gt;
::(Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slotsnotraining&amp;quot;&amp;gt;slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
::Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
::Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-udpate-intentfilter&amp;quot;&amp;gt;intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
::Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#attr-rhasspytweaks-intentfilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-all&amp;quot;&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-volume&amp;quot;&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
::Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).&lt;br /&gt;
::Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden muss!}}&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37436</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37436"/>
		<updated>2022-05-24T12:03:44Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Einrichtung MQTT2_CLIENT subscriptions ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;). 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-baseurl&amp;quot;&amp;gt;baseUrl&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-devspec&amp;quot;&amp;gt;devspec&amp;lt;/code&amp;gt;&lt;br /&gt;
:devspec der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-defaultroom&amp;quot;&amp;gt;defaultRoom&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-fhemid&amp;quot;&amp;gt;fhemId&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-prefix&amp;quot;&amp;gt;prefix&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-usegenericattrs&amp;quot;&amp;gt;&#039;&#039;&#039;useGenericAttrs&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-encoding&amp;quot;&amp;gt;encoding&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;handlehotword&amp;quot;&amp;gt;handleHotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#attr-rhasspyhotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteID, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle (SET)==&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-customslot&amp;quot;&amp;gt;customSlot&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
:&amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
:&amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
:&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-fetchsiteids&amp;quot;&amp;gt;fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
:Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-play&amp;quot;&amp;gt;play&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet eine WAV Datei an Rhasspy.&lt;br /&gt;
:&amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
:Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
:&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-speak&amp;quot;&amp;gt;speak&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
:Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-textcommand&amp;quot;&amp;gt;textCommand&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-trainrhasspy&amp;quot;&amp;gt;trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
:Startet das Training von Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-update&amp;quot;&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemap&amp;quot;&amp;gt;devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemaponly&amp;quot;&amp;gt;devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slots&amp;quot;&amp;gt;slots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
::Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
::*de.fhem.AllKeywords&lt;br /&gt;
::*de.fhem.Device&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
::*de.fhem.Group&lt;br /&gt;
::*de.fhem.Room&lt;br /&gt;
::*de.fhem.MediaChannels&lt;br /&gt;
::*de.fhem.Color&lt;br /&gt;
::*de.fhem.NumericType&lt;br /&gt;
::(Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slotsnotraining&amp;quot;&amp;gt;slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
::Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
::Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-udpate-intentfilter&amp;quot;&amp;gt;intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
::Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#attr-rhasspytweaks-intentfilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-all&amp;quot;&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-volume&amp;quot;&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
::Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).&lt;br /&gt;
::Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden muss!}}&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37435</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37435"/>
		<updated>2022-05-24T11:47:09Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Attribute um fehlende/neue ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;). 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-baseurl&amp;quot;&amp;gt;baseUrl&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-devspec&amp;quot;&amp;gt;devspec&amp;lt;/code&amp;gt;&lt;br /&gt;
:devspec der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-defaultroom&amp;quot;&amp;gt;defaultRoom&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-fhemid&amp;quot;&amp;gt;fhemId&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-prefix&amp;quot;&amp;gt;prefix&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-usegenericattrs&amp;quot;&amp;gt;&#039;&#039;&#039;useGenericAttrs&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-encoding&amp;quot;&amp;gt;encoding&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;handlehotword&amp;quot;&amp;gt;handleHotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#attr-rhasspyhotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteID, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle (SET)==&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-customslot&amp;quot;&amp;gt;customSlot&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
:&amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
:&amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
:&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-fetchsiteids&amp;quot;&amp;gt;fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
:Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-play&amp;quot;&amp;gt;play&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet eine WAV Datei an Rhasspy.&lt;br /&gt;
:&amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
:Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
:&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-speak&amp;quot;&amp;gt;speak&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
:Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-textcommand&amp;quot;&amp;gt;textCommand&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-trainrhasspy&amp;quot;&amp;gt;trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
:Startet das Training von Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-update&amp;quot;&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemap&amp;quot;&amp;gt;devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemaponly&amp;quot;&amp;gt;devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slots&amp;quot;&amp;gt;slots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
::Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
::*de.fhem.AllKeywords&lt;br /&gt;
::*de.fhem.Device&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
::*de.fhem.Group&lt;br /&gt;
::*de.fhem.Room&lt;br /&gt;
::*de.fhem.MediaChannels&lt;br /&gt;
::*de.fhem.Color&lt;br /&gt;
::*de.fhem.NumericType&lt;br /&gt;
::(Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slotsnotraining&amp;quot;&amp;gt;slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
::Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
::Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-udpate-intentfilter&amp;quot;&amp;gt;intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
::Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#attr-rhasspytweaks-intentfilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-all&amp;quot;&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-volume&amp;quot;&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
::Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).&lt;br /&gt;
::Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden muss!}}&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confidenceMin====&lt;br /&gt;
Rhasspy ermittelt u.A. auch einen Indikator, anhand dem bestimmt werden kann, wie genau ein Satz erkannt wurde. Ist dieser &#039;&#039;confidence&#039;&#039;-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.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;confidenceMin= default=0.6 SetMute=0.4 SetOnOffGroup=0.8 SetOnOff=0.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mappingOverwrite====&lt;br /&gt;
Wird diese Option aktiviert, wird bei gesetztem &#039;&#039;rhasspyMapping&#039;&#039;-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 &#039;&#039;rhasspyMapping&#039;&#039; dieses Geräts angegeben ist.&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
:mappingOverwrite=1&lt;br /&gt;
&lt;br /&gt;
====extrarooms====&lt;br /&gt;
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.&lt;br /&gt;
Diese werden in die Slots für &amp;lt;code&amp;gt;rooms&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;mainrooms&amp;lt;/code&amp;gt; integriert.&lt;br /&gt;
Beispiel:&lt;br /&gt;
:extrarooms= barn,music collection,cooking recipies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37434</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37434"/>
		<updated>2022-05-24T11:28:18Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Attribute - Formatierung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;). 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-baseurl&amp;quot;&amp;gt;baseUrl&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-devspec&amp;quot;&amp;gt;devspec&amp;lt;/code&amp;gt;&lt;br /&gt;
:devspec der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-defaultroom&amp;quot;&amp;gt;defaultRoom&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-fhemid&amp;quot;&amp;gt;fhemId&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-prefix&amp;quot;&amp;gt;prefix&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-usegenericattrs&amp;quot;&amp;gt;&#039;&#039;&#039;useGenericAttrs&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-encoding&amp;quot;&amp;gt;encoding&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;handlehotword&amp;quot;&amp;gt;handleHotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#attr-rhasspyhotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteID, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle (SET)==&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-customslot&amp;quot;&amp;gt;customSlot&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
:&amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
:&amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
:&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-fetchsiteids&amp;quot;&amp;gt;fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
:Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-play&amp;quot;&amp;gt;play&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet eine WAV Datei an Rhasspy.&lt;br /&gt;
:&amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
:Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
:&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-speak&amp;quot;&amp;gt;speak&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
:Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-textcommand&amp;quot;&amp;gt;textCommand&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-trainrhasspy&amp;quot;&amp;gt;trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
:Startet das Training von Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-update&amp;quot;&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemap&amp;quot;&amp;gt;devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemaponly&amp;quot;&amp;gt;devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slots&amp;quot;&amp;gt;slots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
::Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
::*de.fhem.AllKeywords&lt;br /&gt;
::*de.fhem.Device&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
::*de.fhem.Group&lt;br /&gt;
::*de.fhem.Room&lt;br /&gt;
::*de.fhem.MediaChannels&lt;br /&gt;
::*de.fhem.Color&lt;br /&gt;
::*de.fhem.NumericType&lt;br /&gt;
::(Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slotsnotraining&amp;quot;&amp;gt;slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
::Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
::Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-udpate-intentfilter&amp;quot;&amp;gt;intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
::Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#attr-rhasspytweaks-intentfilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-all&amp;quot;&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-volume&amp;quot;&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
::Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).&lt;br /&gt;
::Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden muss!}}&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===IODev===&lt;br /&gt;
Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===forceNEXT===&lt;br /&gt;
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.&lt;br /&gt;
Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===languageFile===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Bei Nutzung von configDB wird diese Datei aus der Datenbank gelesen.}}&lt;br /&gt;
Pfad zur Sprach-Datei&lt;br /&gt;
Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
&#039;&#039;languageFile&#039;&#039; erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====response====&lt;br /&gt;
{{Hinweis|Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rhasspyHotwords===&lt;br /&gt;
Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
{{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.}}&lt;br /&gt;
Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
===rhasspyIntents===&lt;br /&gt;
Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
Ein Intent pro Zeile.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
* NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
* DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
* siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein &#039;&#039;&#039;HASH&#039;&#039;&#039; oder &#039;&#039;&#039;ARRAY&#039;&#039;&#039; übergeben werden.&lt;br /&gt;
* Im Falle eines &#039;&#039;&#039;ARRAY&#039;&#039;&#039;s wird das erste Element als &#039;&#039;response&#039;&#039; interpretiert und kann ein reiner Text sein, womit der Dialog beendet wird. &lt;br /&gt;
* Ist das erste Element ein &#039;&#039;&#039;HASH&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
===rhasspyShortcuts===&lt;br /&gt;
Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung zu den Abkürzungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
* &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
* &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
* &amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===rhasspyTweaks===&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
====timerLimits====&lt;br /&gt;
Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
:&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
====timerSounds====&lt;br /&gt;
Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====updateSlots====&lt;br /&gt;
Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
* &amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntents====&lt;br /&gt;
Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet. &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents, &amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
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 &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====confirmIntentResponses====&lt;br /&gt;
Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
====intentFilter====&lt;br /&gt;
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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
====ignoreKeywords====&lt;br /&gt;
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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====gdt2groups====&lt;br /&gt;
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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37433</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37433"/>
		<updated>2022-05-24T11:07:30Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: SetOnOffGroup - Klarstellungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;). 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-baseurl&amp;quot;&amp;gt;baseUrl&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-devspec&amp;quot;&amp;gt;devspec&amp;lt;/code&amp;gt;&lt;br /&gt;
:devspec der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-defaultroom&amp;quot;&amp;gt;defaultRoom&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-fhemid&amp;quot;&amp;gt;fhemId&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-prefix&amp;quot;&amp;gt;prefix&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-usegenericattrs&amp;quot;&amp;gt;&#039;&#039;&#039;useGenericAttrs&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-encoding&amp;quot;&amp;gt;encoding&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;handlehotword&amp;quot;&amp;gt;handleHotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#attr-rhasspyhotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteID, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle (SET)==&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-customslot&amp;quot;&amp;gt;customSlot&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
:&amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
:&amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
:&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-fetchsiteids&amp;quot;&amp;gt;fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
:Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-play&amp;quot;&amp;gt;play&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet eine WAV Datei an Rhasspy.&lt;br /&gt;
:&amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
:Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
:&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-speak&amp;quot;&amp;gt;speak&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
:Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-textcommand&amp;quot;&amp;gt;textCommand&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-trainrhasspy&amp;quot;&amp;gt;trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
:Startet das Training von Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-update&amp;quot;&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemap&amp;quot;&amp;gt;devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemaponly&amp;quot;&amp;gt;devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slots&amp;quot;&amp;gt;slots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
::Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
::*de.fhem.AllKeywords&lt;br /&gt;
::*de.fhem.Device&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
::*de.fhem.Group&lt;br /&gt;
::*de.fhem.Room&lt;br /&gt;
::*de.fhem.MediaChannels&lt;br /&gt;
::*de.fhem.Color&lt;br /&gt;
::*de.fhem.NumericType&lt;br /&gt;
::(Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slotsnotraining&amp;quot;&amp;gt;slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
::Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
::Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-udpate-intentfilter&amp;quot;&amp;gt;intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
::Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#attr-rhasspytweaks-intentfilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-all&amp;quot;&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-volume&amp;quot;&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
::Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).&lt;br /&gt;
::Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden muss!}}&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-iodev&amp;quot;&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-forcenext&amp;quot;&amp;gt;forceNext&amp;lt;/code&amp;gt;&lt;br /&gt;
: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.&lt;br /&gt;
:Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
:Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
:Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
:Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-languagefile&amp;quot;&amp;gt;languageFile&amp;lt;/code&amp;gt;&lt;br /&gt;
:Pfad zur Sprach-Datei&lt;br /&gt;
:Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
:Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
: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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
:Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
:languageFile erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-response&amp;quot;&amp;gt;response&amp;lt;/code&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;Hinweis:&#039;&#039;&#039;: Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-rhasspyhotwords&amp;quot;&amp;gt;rhasspyHotwords&amp;lt;/code&amp;gt;&lt;br /&gt;
:Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
:Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
:&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; 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.&lt;br /&gt;
:Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
:Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
:$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-rhasspyintents&amp;quot;&amp;gt;rhasspyIntents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
:Ein Intent pro Zeile.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
:in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
:schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
:Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
:*NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
:*DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
:*siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
:Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
:Es kann aber auch ein HASH oder ARRAY übergeben werden.&lt;br /&gt;
:Im Falle eines ARRAYs wird das erste Element als &#039;&#039;response&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
: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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
:Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-rhasspyshortcuts&amp;quot;&amp;gt;rhasspyShortcuts&amp;lt;/code&amp;gt;&lt;br /&gt;
:Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
:Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
:Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erklärung zu den Abkürzungen:&lt;br /&gt;
:*&amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
::Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
:*&amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
::Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
:*&amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
::Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
:*&amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
::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.&lt;br /&gt;
::Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
:*&amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
::Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
::In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
::Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
::*&amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
::*&amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
::Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-rhasspytweaks&amp;quot;&amp;gt;rhasspyTweaks&amp;lt;/code&amp;gt;&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-timerlimits&amp;quot;&amp;gt;timerLimits&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
::&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
::Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
::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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-timersounds&amp;quot;&amp;gt;timerSounds&amp;lt;/code&amp;gt;&lt;br /&gt;
::Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
::&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
::Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
::&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-updateslots&amp;quot;&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
::*&amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
:::Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
::*&amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
:::RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
::*&amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
:::Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
:::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:::&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-confirmintents&amp;quot;&amp;gt;confirmIntents&amp;lt;/code&amp;gt;&lt;br /&gt;
::Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
::Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet.&lt;br /&gt;
:::&amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents&lt;br /&gt;
:::&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
:::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:::&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
::Befehle werden nur nach einer positiven Bestätigung ausgeführt. Das bedeutet, es muss unbedingt ein &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-confirmintentresponses&amp;quot;&amp;gt;confirmIntentResponses&amp;lt;/code&amp;gt;&lt;br /&gt;
::Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
::Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-intentfilter&amp;quot;&amp;gt;intentFilter&amp;lt;/code&amp;gt;&lt;br /&gt;
::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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;ignoreKeywords&amp;lt;/code&amp;gt;&lt;br /&gt;
::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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
::Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt;  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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;, oder allgemein kommend aus rhasspyTweaks - gdt2groups).&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte die lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte sämtliche lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(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}&lt;br /&gt;
\[(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}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37432</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37432"/>
		<updated>2022-05-24T10:45:28Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Choice und andere Kleinigkeiten&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;). 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-baseurl&amp;quot;&amp;gt;baseUrl&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-devspec&amp;quot;&amp;gt;devspec&amp;lt;/code&amp;gt;&lt;br /&gt;
:devspec der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-defaultroom&amp;quot;&amp;gt;defaultRoom&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-fhemid&amp;quot;&amp;gt;fhemId&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-prefix&amp;quot;&amp;gt;prefix&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-usegenericattrs&amp;quot;&amp;gt;&#039;&#039;&#039;useGenericAttrs&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-encoding&amp;quot;&amp;gt;encoding&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;handlehotword&amp;quot;&amp;gt;handleHotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#attr-rhasspyhotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteID, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle (SET)==&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-customslot&amp;quot;&amp;gt;customSlot&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
:&amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
:&amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
:&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-fetchsiteids&amp;quot;&amp;gt;fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
:Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-play&amp;quot;&amp;gt;play&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet eine WAV Datei an Rhasspy.&lt;br /&gt;
:&amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
:Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
:&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-speak&amp;quot;&amp;gt;speak&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
:Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-textcommand&amp;quot;&amp;gt;textCommand&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-trainrhasspy&amp;quot;&amp;gt;trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
:Startet das Training von Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-update&amp;quot;&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemap&amp;quot;&amp;gt;devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemaponly&amp;quot;&amp;gt;devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slots&amp;quot;&amp;gt;slots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
::Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
::*de.fhem.AllKeywords&lt;br /&gt;
::*de.fhem.Device&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
::*de.fhem.Group&lt;br /&gt;
::*de.fhem.Room&lt;br /&gt;
::*de.fhem.MediaChannels&lt;br /&gt;
::*de.fhem.Color&lt;br /&gt;
::*de.fhem.NumericType&lt;br /&gt;
::(Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slotsnotraining&amp;quot;&amp;gt;slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
::Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
::Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-udpate-intentfilter&amp;quot;&amp;gt;intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
::Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#attr-rhasspytweaks-intentfilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-all&amp;quot;&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-volume&amp;quot;&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
::Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).&lt;br /&gt;
::Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden muss!}}&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-iodev&amp;quot;&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-forcenext&amp;quot;&amp;gt;forceNext&amp;lt;/code&amp;gt;&lt;br /&gt;
: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.&lt;br /&gt;
:Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
:Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
:Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
:Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-languagefile&amp;quot;&amp;gt;languageFile&amp;lt;/code&amp;gt;&lt;br /&gt;
:Pfad zur Sprach-Datei&lt;br /&gt;
:Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
:Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
: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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
:Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
:languageFile erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-response&amp;quot;&amp;gt;response&amp;lt;/code&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;Hinweis:&#039;&#039;&#039;: Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-rhasspyhotwords&amp;quot;&amp;gt;rhasspyHotwords&amp;lt;/code&amp;gt;&lt;br /&gt;
:Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
:Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
:&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; 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.&lt;br /&gt;
:Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
:Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
:$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-rhasspyintents&amp;quot;&amp;gt;rhasspyIntents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
:Ein Intent pro Zeile.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
:in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
:schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
:Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
:*NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
:*DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
:*siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
:Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
:Es kann aber auch ein HASH oder ARRAY übergeben werden.&lt;br /&gt;
:Im Falle eines ARRAYs wird das erste Element als &#039;&#039;response&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
: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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
:Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-rhasspyshortcuts&amp;quot;&amp;gt;rhasspyShortcuts&amp;lt;/code&amp;gt;&lt;br /&gt;
:Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
:Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
:Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erklärung zu den Abkürzungen:&lt;br /&gt;
:*&amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
::Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
:*&amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
::Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
:*&amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
::Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
:*&amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
::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.&lt;br /&gt;
::Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
:*&amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
::Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
::In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
::Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
::*&amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
::*&amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
::Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-rhasspytweaks&amp;quot;&amp;gt;rhasspyTweaks&amp;lt;/code&amp;gt;&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-timerlimits&amp;quot;&amp;gt;timerLimits&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
::&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
::Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
::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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-timersounds&amp;quot;&amp;gt;timerSounds&amp;lt;/code&amp;gt;&lt;br /&gt;
::Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
::&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
::Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
::&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-updateslots&amp;quot;&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
::*&amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
:::Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
::*&amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
:::RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
::*&amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
:::Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
:::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:::&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-confirmintents&amp;quot;&amp;gt;confirmIntents&amp;lt;/code&amp;gt;&lt;br /&gt;
::Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
::Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet.&lt;br /&gt;
:::&amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents&lt;br /&gt;
:::&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
:::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:::&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
::Befehle werden nur nach einer positiven Bestätigung ausgeführt. Das bedeutet, es muss unbedingt ein &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-confirmintentresponses&amp;quot;&amp;gt;confirmIntentResponses&amp;lt;/code&amp;gt;&lt;br /&gt;
::Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
::Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-intentfilter&amp;quot;&amp;gt;intentFilter&amp;lt;/code&amp;gt;&lt;br /&gt;
::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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;ignoreKeywords&amp;lt;/code&amp;gt;&lt;br /&gt;
::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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
::Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt;  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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
Dafür ist ein SetOnOff-Mapping benötigt und alle gewünschten Geräte müssen dasselbe Attribut &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt; haben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte alle lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(schalt|mach)] (alle | sämtliche ) $de.fhem.Group-SetOnOff{Group} [[in|im|in der|auf der] [( überall:global | $de.fhem.Room ){Room}] ein{Value:on}&lt;br /&gt;
\[(schalt|mach)] (alle | sämtliche ) $de.fhem.Group-SetOnOff{Group} [[in|im|in der|auf der] [( überall:global | $de.fhem.Room ){Room}] aus{Value:off}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die folgenden Intents &#039;&#039;CancelAction&#039;&#039; und &#039;&#039;Choice&#039;&#039; (bzw. die überholten Varianten &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039;) auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Um eine Aktion tatsächlich auszuführen, ist als Rückgabe zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039; erforderlich, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden, was zur Beendigung des Dialogs ohne Aktion führt.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Choice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl von einem oder mehreren der folgenden Elemente:&lt;br /&gt;
&amp;lt;code&amp;gt;{Device}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{Room}&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;{Scene}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Choice]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
choose= ( nimm [bitte] | [bitte] nimm | ich hätte gerne | [ich] (wähle|nehme) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; [( Gerät | $de.fhem.Aliases{Device} )] ] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&amp;lt;choose&amp;gt; [ &amp;lt;den&amp;gt; ] $de.fhem.Aliases{Device} [ ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room} ]&lt;br /&gt;
&amp;lt;choose&amp;gt; [ ( 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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ChoiceRoom ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Raums, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
==== ChoiceDevice ====&lt;br /&gt;
Veralteter Intent. Diente im Rahmen von Dialogen der Auswahl eines Gerätes, wird heute pauschal nach &#039;&#039;Choice&#039;&#039; umgeleitet und sollte nicht mehr verwendet werden!&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=RHASSPY enthält für &amp;lt;code&amp;gt;{Value}&amp;lt;/code&amp;gt; nunmehr auch einen Konverter, der Leerzeichen aus Zahlenwerten entfernt. Enthält dieses Datenfeld bei der Übergabe aus Rhasspy z.B. &amp;lt;code&amp;gt;- 10 .5&amp;lt;/code&amp;gt;, wird dies automatisch in &amp;lt;code&amp;gt;-10.5&amp;lt;/code&amp;gt; umgewandelt.}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=MQTT2_CLIENT&amp;diff=37428</id>
		<title>MQTT2 CLIENT</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=MQTT2_CLIENT&amp;diff=37428"/>
		<updated>2022-05-20T18:28:24Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: ignoreRegexp für tasmota-discovery ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Stellt als Gateway die Verbindung zu einem MQTT-Broker her&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=MQTT2_CLIENT&lt;br /&gt;
|ModForumArea=MQTT&lt;br /&gt;
|ModTechName=10_MQTT2_CLIENT.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])}}&lt;br /&gt;
Das Modul [[MQTT2_CLIENT]] ermöglicht es, Geräte einzubinden, die über eine MQTT-Schnittstelle verfügen. Es fungiert als [[Interface|Verbindung]] zwischen FHEM und einem externen MQTT Server (z.B. &#039;&#039;mosquitto&#039;&#039;) und repräsentiert ein  &#039;&#039;&#039;&#039;&#039;MQTT Gateway&#039;&#039;&#039;&#039;&#039;. Die durch die Module [[MQTT2_DEVICE]] oder {{Link2CmdRef|Anker=MQTT_GENERIC_BRIDGE|Lang=en|Label=MQTT_GENERIC_BRIDGE}} repräsentierten Client-Geräte sind gesondert anzulegen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Es muss für jedes MQTT-Gateway ein MQTT-Server eingerichtet und erreichbar sein.&lt;br /&gt;
Eine Anleitung zur Einrichtung eines Mosquitto-Brokers finden Sie z.B. im Artikel [[MQTT Einführung]].&lt;br /&gt;
{{Hinweis|FHEM selbst kann ebenfalls mit {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} als MQTT-Server eingesetzt werden. In diesem Fall ist innerhalb dieser FHEM-Instanz kein MQTT2_CLIENT-Gerät erforderlich. Befindet sich ein MQTT2_SERVER in einer anderen FHEM-Instanz, kann dieser von dort aus mit MQTT2_CLIENT verbunden werden.}}&lt;br /&gt;
&lt;br /&gt;
== Kurzübersicht ==&lt;br /&gt;
{{Hinweis|Eine Übersicht über die verschiedenen Möglichkeiten, MQTT in FHEM zu nutzen, ist in [[MQTT#FHEM und MQTT]] zu finden.}}&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
Das MQTT Gateway wird angelegt mit&lt;br /&gt;
&amp;lt;code&amp;gt;define &#039;&#039;&#039;meinMQTT2Client&#039;&#039; MQTT2_CLIENT &amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Sofern der MQTT-Server mit FEHM über localhost kommunizieren kann, sollte als IP 127.0.0.1 verwendet werden.}}&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
Danach können entsprechende Client-Devices angelegt werden, in der Regel als [[MQTT2 DEVICE|MQTT2_DEVICE]]. Dabei kann ein physikalisches Device (Sensor oder Aktor), das über mqtt kommuniziert (z.B. ein ESP8266- oder ESP32-basiertes Gerät), ein oder mehrere Devices des Typs &#039;&#039;MQTT2_DEVICE&#039;&#039; entsprechen.&lt;br /&gt;
&lt;br /&gt;
=== autocreate und bridgeRegexp ===&lt;br /&gt;
{{Randnotiz|RNTyp=g|RNText=Für weitere bridge-Geräte wird bei Verwendung des MQTT2_CLIENT empfohlen, die betreffenden templates jeweils auf eine Kopie des &amp;quot;Sammeldevices&amp;quot; MQTT2_CLIENT_general_bridge anzuwenden und dabei vorab die CID auf einen anderen Wert festzulegen als die ClientID des MQTT2_CLIENT-Geräts&amp;lt;ref&amp;gt;Dabei empfielt sich der [[Import von Code Snippets|RAW-Editor]], beachten Sie hierzu aber die Hinweise zur Änderung der CID!&amp;lt;/ref&amp;gt;! Hat man neue Geräte mit bridgeRegexp-Einträgen erstellt oder die bridgeRegexp-Einträge verändert, kann in der Regel gefahrlos zunächst die readingList am &amp;quot;Sammeldevice&amp;quot; (bzw. der MQTT2_CLIENT_general_bridge) gelöscht werden, so dass dann eingehende Nachrichten auch tatsächlich gegen die bridgeRegexp geprüft werden müssen.}}Möchte man &#039;&#039;autocreate&#039;&#039; verwenden, um automatisiert MQTT2_DEVICE-Geräte anlegen zu lassen, empfiehlt es sich, auf das erste automatisch angelegte Gerät das [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|template]] &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; anzuwenden. Dadurch werden anschließend bestimmte eingehenden MQTT-Messages für eine Anzahl häufig anzutreffender Gerätetypen in separate, automatisch angelegte MQTT2_DEVICE-Geräte umgeleitet&amp;lt;ref&amp;gt;Näheres zur Entstehung der derzeitigen bridgeRegexp des templates &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; sind diesem {{Link2Forum|Topic=98126|LinkText=Forenthread}} zu entnehmen.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
{{Hinweis|Da hierzu die typischen Topicstrukturen und Benennungen genutzt werden, sollten die MQTT-Einstellungen hinsichtlich des topictrees auf den Geräten auf den jeweiligen defaults belassen werden.}}&lt;br /&gt;
&lt;br /&gt;
Das attrTemplate &#039;&#039;MQTT2_CLIENT_general_bridge&#039;&#039; löscht die readingList des Geräts, auf das es angewendet wird und ergänzt das Device mit der beschriebenen &#039;&#039;bridgeRegexp&#039;&#039;. Dies muß nur einmalig erfolgen, für alle weiteren - mittels bridgeRegexp erstellten - Geräte gilt dann - mit o.g. Einschränkungen bei der Erstellung von weiteren &#039;&#039;bridge&#039;&#039;-Geräten - das allgemeine Vorgehen für MQTT2_DEVICE, z.B. auch die Festlegung weiterer Geräten mit &#039;&#039;bridgeRegexp&#039;&#039;-Attributen wie in den [[MQTT2-Module - Praxisbeispiele|Praxisbeispielen]] beschrieben, dort findet sich auch ein Abschnitt zum Attribut [[MQTT2-Module_-_Praxisbeispiele#bridgeRegexp|bridgeRegexp]] allgemein.&lt;br /&gt;
&lt;br /&gt;
Will man Geräte unterscheiden, die sich nur z.B im ersten Teil der Topic-Struktur unterscheiden, kann man dies durch Anpassung der &#039;&#039;bridgeRegexp&#039;&#039; erreichen oder dadurch, dass man die betreffenden Geräte manuell anlegt. Dabei sollte man jedoch tendenziell sehr restriktive bridgeRegexp-Ausdrücke verwenden&amp;lt;ref&amp;gt;Zum Hintergrund siehe diese {{Link2Forum|Topic=98206|LinkText=Forendiskussion}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== ignoreRegexp ===&lt;br /&gt;
Da ein externer MQTT-Server auch alle ausgehenden Anweisungen wieder an alle Clients zurückliefert, führt dies iVm. &#039;&#039;autocreate&#039;&#039; dazu, dass in vielen Fälle Events doppelt - und überdies in Teilen sachlich falsch - erzeugt werden. Um nur die Rückmeldung des Geräts über den Vollzug der Anweisung auszuwerten und die ausgehenden Informationen zu verwerfen, kann man am Interface ein &#039;&#039;ignoreRegexp&#039;&#039; setzen. Für typische Befehlsstrukturen von Tasmota, Shelly und zigbee2mqtt sowie das Auswerten von - für HomeAssistant gedachten - autodiscovery-Meldungen wäre z.B. folgendes &#039;&#039;ignoreRegexp&#039;&#039; zu verwenden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr MQTT2_Mosquitto_Client ignoreRegexp cmnd/[^:&amp;quot;]+:|homeassistant/[^:&amp;quot;]+/config:|shellies/[^:&amp;quot;]+/command:|zigbee2mqtt/[^/]+/set:|milight/0x[0-9a-fA-F]{1,4}/.*/[0-8]:|tasmota/discovery/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Dieses Attribut wäre auch an einem &#039;&#039;MQTT2_SERVER&#039;&#039; sinnvollerweise entsprechend zu setzen, wenn über diesen andere (Software-)Client-Systeme angebunden werden, die ebenfalls direkt MQTT-Anweisungen an die anderen Clients senden können sollen. Beispiele wären verteilte Systeme mit MQTT2_CLIENT auf entfernten FHEM-Installationen oder die Verwendung von MQTT-basierten User-Interfaces (NodeRed oä).}}&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:IP Components|IP Komponenten]]&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:Rhasspy_fhem.png&amp;diff=37423</id>
		<title>Datei:Rhasspy fhem.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:Rhasspy_fhem.png&amp;diff=37423"/>
		<updated>2022-05-09T07:46:24Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Beta-User lud eine neue Version von Datei:Rhasspy fhem.png hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
Schematische Darstellung&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY/Vertiefung&amp;diff=37422</id>
		<title>RHASSPY/Vertiefung</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY/Vertiefung&amp;diff=37422"/>
		<updated>2022-05-08T14:28:50Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: /* Eigene Dialoge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Erste Schritte ==&lt;br /&gt;
Diese Seite knüpft an die [[RHASSPY/Schnellstart| Schnellstart-Anleitung]] an, welche die ersten grundlegenden Schritte einfach erklärt.&lt;br /&gt;
Es wird dabei davon ausgegangen, dass das Feature &amp;quot;useGenericAttrs&amp;quot; aktiv ist.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Falls bereits eine andere Sprachsteuerungslösung installiert ist, kann es sein, dass RHASSPY bereits sehr viele Geräte in der &#039;&#039;devicemap&#039;&#039; enthält. Wem dies zu unübersichtlich ist, kann den devspec-Parameter in der DEF z.B. so anpassen, um z.B. zunächst nur Geräte im Wohnzimmer zu erfassen: &amp;lt;code&amp;gt;devspec=room=Wohnzimmer:FILTER=genericDeviceType=.+,room=Esszimmer:FILTER=genericDeviceType=.+&amp;lt;/code&amp;gt;. Dies kann später ohne weiteres wieder erweitert werden.}}&lt;br /&gt;
Ziel dieser Vertiefung ist zu zeigen, wie man auf einfachem Weg Sprachbefehle umsetzen kann wie&lt;br /&gt;
- &amp;quot;schalte alle Lichter beim Sofa an&amp;quot; &lt;br /&gt;
- &amp;quot;schließe die Rollläden&amp;quot; (gemeint: im Wohnzimmer)&lt;br /&gt;
- &amp;quot;mach überall die Lichter aus&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Es empfiehlt sich für diese Vertiefung, einige wenige, jeweils gleichartige Geräte in einem oder besser zwei Räumen zu betrachten, also z.B. vier Leuchten (genericDeviceType &#039;&#039;light&#039;&#039;) und einige Rollläden oder Jalousien (&#039;&#039;blind&#039;&#039;). Im Folgenden wird unterstellt, dass je zwei &#039;&#039;light&#039;&#039; und &#039;&#039;blind&#039;&#039;-Geräte im Wohn- und Esszimmer vorhanden sind.&lt;br /&gt;
&lt;br /&gt;
== Die &#039;&#039;devicemap&#039;&#039; ==&lt;br /&gt;
Im Schnellstart im Abschnitt [[RHASSPY/Schnellstart#Ein_Ger.C3.A4t_mit_Rhasspy_verbinden| Ein Gerät mit Rhasspy verbinden]] wurde bereits darauf hingewiesen, dass mit Hilfe des Befehls &amp;lt;code&amp;gt;list rhasspy&amp;lt;/code&amp;gt; in Erfahrung gebracht werden kann, welche &amp;quot;Eigenschaften&amp;quot; die automatische Erkennung für die einzelnen Geräte erkannt hat. Wenn also im Folgenden Änderungen vorgenommen werden, empfiehlt es sich dann jeweils nach der Änderung ein &amp;lt;code&amp;gt;set rhasspy update devicemap_only&amp;lt;/code&amp;gt; durchzuführen und dann die Auswirkungen im &#039;&#039;list&#039;&#039; bei &#039;&#039;rhasspy&#039;&#039; zu betrachten. Sind alle Änderungen dann soweit ok, können diese mit &amp;lt;code&amp;gt;set rhasspy update devicemap&amp;lt;/code&amp;gt; an Rhasspy übergeben und das Training veranlasst werden.&lt;br /&gt;
&lt;br /&gt;
== Grundlegende Strukturierungsmerkmale ==&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Es ist zu empfehlen, hin und wieder auch zu überprüfen, ob alle Wörter auch für Rhasspy &#039;&#039;hörbar&#039;&#039; sind. Dazu ist die [https://rhasspy.readthedocs.io/en/latest/usage/#words-page Words-Seite] in der Rhasspy-Konfiguration aufzurufen, mit derem Hilfe man bisher unbekannte Wörter phonetisch beschreiben kann.}}Für die Sprachsteuerung ist es wichtig, dass die Geräte möglichst eingängig und innerhalb nachvollziehbarer Strukturen angesprochen werden können. Alle verwendeten Begriffe, insbesondere die eigentlichen Geräte-&#039;&#039;Namen&#039;&#039; sollten daher folgende Bedingungen erfüllen: &lt;br /&gt;
Sie sollten &lt;br /&gt;
* &#039;&#039;&#039;sprechbar&#039;&#039;&#039;&lt;br /&gt;
* hinreichend &#039;&#039;&#039;eindeutig&#039;&#039;&#039; und&lt;br /&gt;
* &#039;&#039;&#039;eingängig&#039;&#039;&#039;&lt;br /&gt;
sein. Doppelbelegungen sind zwar zulässig, es sollte aber für die Software auf der jeweiligen Stufe möglich sein, ein eindeutiges Ergebnis zu ermitteln. Dies geschieht in der Regel über den Kontext, in dem etwas gesagt wird - ganz wie im richtigen Leben macht es einen Unterschied, ob die Anweisung &amp;quot;Mach das Licht aus&amp;quot; im &#039;&#039;Wohnzimmer&#039;&#039; oder im &#039;&#039;Esszimmer&#039;&#039; erfolgt. Die Orts-Information ergibt sich hier z.B. aus dem Ort, an dem sich der Empfänger der Anweisung befindet.&lt;br /&gt;
&lt;br /&gt;
=== Optionale Elemente in sentences.ini ===&lt;br /&gt;
Im Schnellstart wurde folgender Intent für das Ein- und Ausschalten vorgestellt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
schalte das $de.fhem.Device-SetOnOff{Device} ( an{Value:on} | aus{Value:off})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Demgegenüber enthält der Abschnitt [[RHASSPY#SetOnOff|SetOnOff]] zu den einzelnen Intens eine deutlich erweiterte Variante:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Spätestens jetzt ist zu empfehlen, das [https://www.youtube.com/watch?v=sWVl0ZoXZEo Informationsvideo] zu den Optionen anzusehen, die sentences.ini innerhalb Rhasspy bietet!&lt;br /&gt;
Hier ist bereits zu erkennen, dass es sinnvoll ist&lt;br /&gt;
- optionale Zusatzinformationen (sprechend) ergänzen zu können (oder diese eben auszulassen)&lt;br /&gt;
- bestimmte Wortkombinationen auf die Geräte-Typen zu beschränken, für die das sprachlich überhaupt paßt.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Öffnen&amp;quot; oder &amp;quot;schließen&amp;quot; kann man ein Licht in der Regel nicht, einen Rollladen oder eine Tür sehr wohl. Unterstellt, es sind keine automtatischen Türöffner vorhanden, könnte vielleicht folgende Ergänzung sinnvoll sein:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
 (öffne{Value:on}|schliesse{Value:off})[den|die|das] $de.fhem.Device-blind{Device} [[(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Werden alle drei Datenelemente (&#039;&#039;Value&#039;&#039;, &#039;&#039;Device&#039;&#039; und &#039;&#039;Room&#039;&#039;) übergeben, sollte es für RHASSPY möglich sein, ein FHEM-Device zu ermitteln, auf das die beiden wesentlichen Informationen (&#039;&#039;Device&#039;&#039; und &#039;&#039;Room&#039;&#039;) paßt. Fehlt &#039;&#039;Room&#039;&#039;, bleibt immer noch die Möglichkeit, dass RHASSPY die fehlende Information ergänzen kann - insbesondere, indem ausgewertet wird, wo die Information herkam.&lt;br /&gt;
&lt;br /&gt;
Damit innerhalb des RHASSPY-Codes Verwechslungsgefahren minimiert werden, werden &lt;br /&gt;
* alle intern verwendeten Bezeichnungen &#039;&#039;&#039;klein gemacht&#039;&#039;&#039;, also insbesondere alle Namen, Gruppen- und Raumnamen werden nach devicemap in Kleinschreibung übernommen (und auch so an Rhasspy übermittelt),&lt;br /&gt;
* &#039;&#039;&#039;englische Schlüsselwörter&#039;&#039;&#039; für typische Kommandos verwendet (also z.B. &#039;&#039;on&#039;&#039; und &#039;&#039;off&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;Farbwerte&#039;&#039;&#039; und ähnliches &#039;&#039;&#039;nummerisch&#039;&#039;&#039; übergeben&lt;br /&gt;
Tauchen irgendwo Großbuchstaben auf, handelt es sich in der Regel um ein Schlüsselwort wie &#039;&#039;Value&#039;&#039; oder &#039;&#039;Room&#039;&#039;, dem dann ein Wert zugewiesen ist.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;must match&amp;quot;-Prinzip ===&lt;br /&gt;
Eine Besonderheit der in den Standardeinstellungen bei Rhasspy verwendeten &#039;&#039;speech-to-text-engine&#039;&#039; besteht darin, dass diese &#039;&#039;&#039;zwingend ein Ergebnis&#039;&#039;&#039; liefern muss. Daher sollten folgende Aspekte bei der Gestaltung der &#039;&#039;sentences.ini&#039;&#039; berücksichtigt werden:&lt;br /&gt;
* alle nicht zwingend erforderlichen Angaben sollten in optionaler Form notiert werden&lt;br /&gt;
* Stille wird auf den kürzesten verfügbaren Satz gemappt. Dieser kürzeste Satz sollte &#039;&#039;&#039;unbedingt dem Intent &#039;&#039;CancelAction&#039;&#039; zugeordnet&#039;&#039;&#039; sein!&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Das Verhalten von Rhasspy kann durch Änderungen der Einstellungen der STT-Engine oder deren komplettem Austausch geändert werden! Rhasspy ist in dieser Hinsicht sehr flexibel, allerdings werden in der Regel für schnelle und gute Ergebnisse mit anderen Einstellungen deutlich höhere Hardwareanforderungen gestellt.}}&lt;br /&gt;
&lt;br /&gt;
=== Namen ===&lt;br /&gt;
[[File:Rhasspy07.png|thumb|Helper für eine Lampe im RHASSPY Modul: Unter dem technischen Namen ist der &#039;&#039;alias&#039;&#039; aufgelistet, darunter ggf. die weiteren Namen, unter denen das Gerät ansprechbar ist ]]Dem Umstand, dass die üblichen FHEM-Gerätenamen in der Regel nicht sprechbar sind, kann man dadurch begegnen, dass man einfach sprechbare Namen vergibt. Wie im wiklichen Leben ist es dabei denkbar, dass etwas unter mehreren Bezeichnungen bekannt ist. Im nebenstehenden &#039;&#039;rhasspy-list&#039;&#039; für das Gerät &amp;quot;Office&amp;quot; ist zu erkennen, dass dieses einen &#039;&#039;alias&#039;&#039; namens &#039;&#039;licht&#039;&#039; hat. Diese Information könnte entweder aus dem gleichnamigen (allgemeinen) Attribut kommen, es könnte aber auch die Folge davon sein, dass z.B. ein &#039;&#039;alexaName&#039;&#039; o.ä. vergeben ist, oder diese Bezeichnung im Attribut &#039;&#039;rhasspyName&#039;&#039; zu finden ist. Der Schlüssel &#039;&#039;alias&#039;&#039; wird immer nur eine (Haupt-) Bezeichnung enthalten, der weitere Schlüssel &#039;&#039;names&#039;&#039; kann eine im Prinzip unbeschränkter Werte enthalten.&lt;br /&gt;
Die Namen müssen nicht eindeutig sein, jedenfalls dann nicht, wenn sich aus dem Kontext ableiten läßt, welches Gerät gemeint ist. Es spricht also nichts dagegen, jeweils einen &#039;&#039;alias&#039;&#039; &#039;&#039;rollladen&#039;&#039; zu vergeben, wenn sich in einem Raum jeweils nur ein einziger befindet. Entsprechendes gilt für Lichter, wobei es durchaus zulässig ist, z.B. die Hauptbeleuchtung mit &#039;&#039;licht&#039;&#039; zu bezeichnen. Wird das Attribut &#039;&#039;rhasspyName&#039;&#039; verwendet, um diese Werte zu erzeugen, wird der erste angegebene Name als &#039;&#039;alias&#039;&#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Exkurs: Die allgemeine Logik der rhasspy-Attribute ===&lt;br /&gt;
Es empfiehlt sich, bei einem Device nachzuvollziehen, wie ggf. vorhandene &#039;&#039;alias&#039;&#039;-, &#039;&#039;siriName&#039;&#039;- (etc.) und &#039;&#039;rhasspyName&#039;&#039;-Attribute zusammenwirken. &lt;br /&gt;
RHASSPY wird dabei immer die &#039;&#039;eigenen&#039;&#039; Attribute bevorzugen, falls diese gesetzt sind, mit der Wirkung, dass andere, automatisch ermittelten Werte vollständig verdrängt werden. Dies gilt genauso z.B. für &#039;&#039;rhasspyMapping&#039;&#039;.&lt;br /&gt;
Dieses Prinzip ist an vielen Stellen in RHASSPY anzutreffen. So gibt es teils Möglichkeiten, die man entweder allgemein in &#039;&#039;rhasspyTweaks&#039;&#039; einstellen kann, oder speziell für einzelne Devices in &#039;&#039;rhasspySpecials&#039;&#039;. Auch in diesen Fällen wird die spezifischere Angabe am Device die generelle Vorgabe (an &#039;&#039;rhasspy&#039;&#039;) verdrängen.&lt;br /&gt;
&lt;br /&gt;
=== Gruppen ===&lt;br /&gt;
Um eine Anweisung wie das oben genannte &amp;quot;schließe die Rollläden&amp;quot; umzusetzen, muss RHASSPY wissen, dass es (uU.) mehrere Geräte gibt, die unter einer Sammelbezeichnung angesprochen werden können. Ist also ein &#039;&#039;group&#039;&#039;-Attribut vergeben, wird diese Angabe dann auch im &#039;&#039;rhasspy-list&#039;&#039; zu finden sein.&lt;br /&gt;
Um die automatische Gruppen-Zuordnung zu verbessern, stehen zwei Schlüssel für das Attribut &#039;&#039;rhasspyTweaks&#039;&#039; zur Verfügung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr rhasspy rhasspyTweaks ignoreKeywords=rooms=MQTT.*|alexa|homebridge|googleassistant|Steuerung.* groups=Türen.und.Fenster|Schalter\&lt;br /&gt;
gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der erste &#039;&#039;ignoreKeywords&#039;&#039; bewirkt (u.a.), dass bestimmte, im allgemeinen Attribut &#039;&#039;group&#039;&#039; vorzufindende Gruppennamen &#039;&#039;&#039;nicht ausgewertet&#039;&#039;&#039; werden, der zweite &#039;&#039;gdt2groups&#039;&#039; führt dazu, dass für die dirt genannten genericDeviceType bestimmte Gruppennamen automatisch vergeben werden.&lt;br /&gt;
Auch hier kann diese generelle Vorgabe durch das Setzen des speziellen Attributs &#039;&#039;rhasspyGroup&#039;&#039; überschrieben werden, so dass dann z.B. eine Leinwand (gDT &#039;&#039;blind&#039;&#039;) dann auch wieder aus den Gruppen &#039;&#039;rollläden,rollladen&#039;&#039; genommen werden kann und z.B. der Gruppe &#039;&#039;mediengeräte&#039;&#039; zugeordnet werden könnte.&lt;br /&gt;
&lt;br /&gt;
=== Räume ===&lt;br /&gt;
Das Vorgenannte gilt für Räume (allgemeines Attribut &#039;&#039;room&#039;&#039; vs- &#039;&#039;rhasspyRooms&#039;&#039;) entsprechend, wobei der erste in &#039;&#039;rhasspyRooms&#039;&#039; angegebene Raum dann ggf. wieder eine Sonderfunktion hat und daher dem &#039;&#039;Hauptraum&#039;&#039; entsprechen sollte, dem man dieses Gerät örtlich hauptsächlich zuordnet.&lt;br /&gt;
&lt;br /&gt;
=== Gruppen vs. Räume ===&lt;br /&gt;
Worin besteht nun der Unterschied zwischen Gruppen und Räumen? Räume sind eher dazu gedacht, Geräte örtlich zu kennzeichnen, Gruppen sind dagegen eher funktional, und die Wirkung eines Gruppenbefehls ist in RHASSPY in der Regel (s.u.) begrenzt durch den Raum, der jeweils mit angesprochen wird. &#039;&#039;&#039;Ist in dem von Rhasspy an RHASSPY übergebenen Datensatz keine ausdrückliche &#039;&#039;{Room}&#039;&#039;-Information enthalten, wird  RHASSPY daher in der Regel zunächst versuchen, dies aus der in der &#039;&#039;siteId&#039;&#039; enthaltenen Ortsinformation abzuleiten, und dann erst die Suche außerhalb des Raums fortsetzen, wenn dies nicht möglich ist.&#039;&#039;&#039; Natürlich ist es zulässig, auch in der Gruppenbezeichnung eine Ortsinformation mitzugeben, indem (zusätzliche) Gruppen gesetzt werden wie &amp;quot;lichter beim sofa&amp;quot;, oder die Ortsinfo &amp;quot;beim sofa&amp;quot; als zusätzlichen Raum anzugeben (was aber dann dazu führt, dass &amp;quot;lichter beim sofa im wohnzimmer&amp;quot; uU. nicht zum gewünschten Ergebnis führt.  &lt;br /&gt;
&lt;br /&gt;
=== Gruppen, Räume und Funktionalitäten als &#039;&#039;slots&#039;&#039; ===&lt;br /&gt;
Die sich aus diesen ganzen &#039;&#039;Meta-Informationen&#039;&#039; ergebenden &amp;quot;sprechbaren&amp;quot; Informationsanteilen führt RHASSPY für Rhasspy zu einer Vielzahl von &#039;&#039;slots&#039;&#039; zusammen, mit deren Hilfe dann die Kombinationsmöglichkeiten für die eigentliche Spracherkennung soweit eingeschränkt werden kann, dass im Optimalfall dann nur (aus Sicht von RHASSPY) gültige Datensätze zurückkommen, die dann auch ausgeführt werden können. Es empfiehlt sich daher, sich etwas intensiver mit diesen &#039;&#039;slots&#039;&#039; zu befassen, die sich ergeben, sobald man die ersten paar Geräte in der &#039;&#039;devicemap&#039;&#039; sauber strukturiert hat. Sind in den &#039;&#039;slots&#039;&#039; Informationen enthalten, die so nicht erwartet wurden, kann man diese in der Regel über die &#039;&#039;devicemap&#039;&#039; im rhasspy-list zurückverfolgen und muss dann eben die entsprechenden Attribute anpassen bzw. ggf. den &#039;&#039;ignoreKeywords&#039;&#039;-Filter in &#039;&#039;rhasspyTweaks&#039;&#039; anpassen.&lt;br /&gt;
&lt;br /&gt;
=== Einer statt alle ===&lt;br /&gt;
Wie bereits dargestellt, wird RHASSPY zunächst versuchen herauszufinden, an welches FHEM-Device ein Kommando eigentlich gerichtet ist. Ist kein Raum angegeben, wird der logische Kette von der siteId zu dem Raum gefolgt, in dem primär gesucht werden soll. Gibt es das Gerät dort nicht, aber systemweit nur ein Gerät mit einem bestimmten Namen, ist es hinreichend eindeutig. Was aber tun, wenn mehrere Geräte in Frage kommen, sei es innerhalb, sei es außerhalb des Raums des Sprechenden oder des angefragten Raumes? &lt;br /&gt;
Klar, RHASSPY kann rückfragen und tut dann genau das... Zu Dialogen kommen wir aber erst später, hier soll nun eine andere Option erläutert werden, mit der man für mehr Eindeutigkeit sorgen kann. Wie üblich, wenn etwas als Device-spezifisches &#039;&#039;Extra&#039;&#039; anzusehen ist, ist dieses im Attribut &#039;&#039;rhasspySpecials&#039;&#039; zu finden. Das folgende Beispiel wird daher alle Anfragen, die entweder in dessen Raum erfolgen oder für die es kein Ergebnis innerhalb des Raums gibt auf diesen Sensor umleiten:&lt;br /&gt;
 attr sensor_outside_main rhasspySpecials priority:inRoom=temperature outsideRoom=temperature,humidity,pressure&lt;br /&gt;
&lt;br /&gt;
Entsprechend kann verfahren werden, wenn z.B. für die Regelung der Temperatur in einem Raum ein Wand-Thermostat verbaut ist, der dann seinerseit die Regelung der einzelnen Heizkörper übernimmt:&lt;br /&gt;
 attr wall_thermostat rhasspySpecials priority:inRoom=desired-temp&lt;br /&gt;
&lt;br /&gt;
== Gruppen-Intents ==&lt;br /&gt;
=== Beispiel SetOnOffGroup ===&lt;br /&gt;
Ist die &#039;&#039;devicemap&#039;&#039; also soweit vorbereitet, dass sprechbare Namen vergeben sind und Gruppen- und Raumstrukturen (sprechbar) beschrieben sind, können wir den ersten Gruppen-Intent anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
(schalte|schalt|mache|mach|stelle|stell|starte) ([überall{Room:global} [die]] | alle | sämtliche ) $de.fhem.Group-SetOnOff{Group} [[(im|in dem|auf dem|in der|auf der)] $de.fhem.Room {Room}] (an|ein){Value:on}&lt;br /&gt;
(schalte|schalt|mache|mach|stelle|stell) ([überall{Room:global} [die]] | alle | sämtliche ) $de.fhem.Group-SetOnOff{Group} [[(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room}] aus{Value:off}&lt;br /&gt;
(fahre|fahr|mach|mache) ([überall{Room:global} [die]] | alle | sämtliche ) $de.fhem.Group-blind{Group} [[(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room}] ((hoch|auf){Value:on}|(zu|runter){Value:off})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Unterscheidung zu dem einfachen SetOnOff-Intent besteht dabei sprachlich zum einen in den Gruppennamen, und zum anderen in der zusätzlich erforderlichen Angabe, ob &#039;&#039;überall&#039;&#039; oder &#039;&#039;alle&#039;&#039; bzw. &#039;&#039;sämtliche&#039;&#039; Geräte angesprochen werden sollen. &#039;&#039;global&#039;&#039; ist dabei ein spezieller Raumname, der schlicht alle passenden Geräte umfasst.&lt;br /&gt;
&lt;br /&gt;
=== Timing-Aspekte ===&lt;br /&gt;
Werden gleichzeitig mehrere Geräte geschaltet, kann es zu Problemen kommen, insbesondere, wenn diese über Funk-Interfaces angesteuert werden. Um solche Probleme zu minimieren, stehen im Attribut &#039;&#039;rhasspySpecials&#039;&#039; mehrere Optionen zur Verfügung, die auch mehr oder weniger beliebig miteinander kombiniert werden können. &lt;br /&gt;
&lt;br /&gt;
==== async_delay ====&lt;br /&gt;
Die einfachste ist, die Befehle für jedes der betroffenen Devices zeitlich zu entzerren.&lt;br /&gt;
 attr lamp1 rhasspySpecials group:async_delay=0.3&lt;br /&gt;
Dies würde bewirken, dass das betreffende Device bei einem Gruppen-Intent mit 300 ms Verzögerung angesprochen wird, falls bei dem Gruppe-Befehl überhaupt weitere Geräte zu schalten sind (oder gerade weitere Gruppenbefehle abgearbeitet werden). RHASSPY wird dabei versuchen, immer zunächst den (verbleibenden) Befehl mit der geringsten Verzögerung zu verarbeiten und alle anderen dann entsprechend zurückstellen.&lt;br /&gt;
&lt;br /&gt;
==== prio ====&lt;br /&gt;
Die Reihenfolge der Abarbeitung kann durch das weitere Element &#039;&#039;prio&#039;&#039; beeinflusst werden. Falls &#039;&#039;lamp1&#039;&#039; zuerst eingeschaltet werden soll, wenn es über eine Gruppenschaltung mit &#039;&#039;lamp2&#039;&#039; adressiert wird, kann dem anderen Gerät .&lt;br /&gt;
 attr lamp1 rhasspySpecials group:async_delay=0.3&lt;br /&gt;
 attr lamp2 rhasspySpecials group:prio=1&lt;br /&gt;
Dies würde bewirken, dass zuerst &#039;&#039;lamp1&#039;&#039; geschaltet wird, und dann mit 300ms Verzögerung &#039;&#039;lamp2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== partOf ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Durch derartige Gruppenadressierungen kann es vorkommen, dass dann auch Geräte außerhalb des eigentlichen Ziel-Raums und/oder der eigentlichen Ziel-Group geschalten werden!}}Zu guter Letzt ist es auch möglich, RHASSPY mitzuteilen, dass ein einzelnes Gerät bei Gruppenschaltung nicht als Einzeldevice behandelt werden soll, sondern als Teil von einer an anderer Stelle festgelegten Struktur. Dies könnte z.B. ein &#039;&#039;[[structure]]&#039;&#039;-Device sein oder eine gemeinsam steuerbare Hardware-Gruppe, wie sie z.B. [[ZigBee]] kennt: &lt;br /&gt;
 attr lamp1 rhasspySpecials group:partOf=zigbeegr5&lt;br /&gt;
Dabei wird der betreffende Gruppenbefehl nur einmalig versendet, selbst wenn mehrere angesprochene Geräte Mitglied dieser externen Gruppe sind. Falls zugleich &#039;&#039;prio&#039;&#039; und/oder &#039;&#039;async_delay&#039;&#039; verwendet werden soll, ist dies bei allen zur externen Gruppe gehörenden Geräten einheitlich anzugeben! &lt;br /&gt;
&lt;br /&gt;
== Nummerische Werte ==&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Nummerische Sprachanweisungen sind in der sprachlichen Realität deutlich vielfältiger, als es auf den ersten Blick erscheinen mag. Die Bandbreite geht von klaren Anweisungen wie &amp;quot;Stelle die Leuchte am Esstisch auf die Helligkeit 72&amp;quot; über &amp;quot;mach dunkler&amp;quot; bis hin zu &amp;quot;halte den Rollladen an&amp;quot; und &amp;quot;erhöhe die Temperatur um 10%&amp;quot;. RHASSPY enthält intern einen recht komplexen Code, der sowohl absolute wie relative Anweisungen verarbeiten kann und/oder aus (zuordenbaren) Richtungsangaben das/die passende/n Gerät/e ableitet. &lt;br /&gt;
Je nachdem, welche Rahmenbedingungen sonst bekannt sind, kann eine Kombination der Datenfelder &#039;&#039;{Device}&#039;&#039;, &#039;&#039;{Value}&#039;&#039; (ein nummerischer Wert), &#039;&#039;{Change}&#039;&#039; oder &#039;&#039;{Type}&#039;&#039; ausreichend sein, &#039;&#039;{Room}&#039;&#039; ist optional. Ergänzend kann das optionale Feld &#039;&#039;{Unit}&#039;&#039; (ausschließlich mit dem Wert &#039;&#039;percent&#039;&#039;) genutzt werden, um prozentuale Berechnungen (immer bezogen auf die Spanne zwischen Minimal- und Maximal-Wert) zu starten. Für &#039;&#039;{Change}&#039;&#039; können folgende Werte ausgewertet werden:&lt;br /&gt;
* lightUp, lightDown (abgeleitet wird, dass ein setter vom &#039;&#039;{Type}&#039;&#039; &#039;&#039;brightness&#039;&#039; angesteuert werden soll)&lt;br /&gt;
* volUp, volDown (setter vom &#039;&#039;{Type}&#039;&#039; &#039;&#039;volume&#039;&#039;)&lt;br /&gt;
* tempUp, tempDown (setter vom &#039;&#039;{Type}&#039;&#039; &#039;&#039;temperature&#039;&#039;, wobei der setter in der Regel eher als &#039;&#039;desired-temp&#039;&#039; oä. angesteuert wird)&lt;br /&gt;
* setUp, setDown (allgemeiner setter vom &#039;&#039;{Type}&#039;&#039; &#039;&#039;setTarget&#039;&#039;)&lt;br /&gt;
* cmdStop (spezielles Kommando für genericDeviceType &#039;&#039;blind&#039;&#039;-Geräte)&lt;br /&gt;
&lt;br /&gt;
Der passende Intent sähe dann z.b. so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
\[ ( schalt | mach ) ] [(den | die | das )] $de.fhem.Device-media{Device} [[(im | in der )] $de.fhem.Room{Room}] [um] [(0..10){Value!int}] [dezibel{Unit:decibel}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
( mach | stelle ) [(den | die | das )] $de.fhem.Device-thermostat{Device} [[(im | in der )] $de.fhem.Room{Room}] [um] [(0..10){Value!int}] [grad{Unit:degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
( mach |schalt|schalte|stelle) [(den | die | das )] $de.fhem.Device-light{Device} [[(im | in der )] $de.fhem.Room{Room}] [um] [(0..100){Value}] [prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
(schalt | schalte | stelle ) [(den | die | das )] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [[(im | in der )] $de.fhem.Room{Room}] auf (0..100){Value!float}&lt;br /&gt;
( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [[(im | in der )] $de.fhem.Room{Room}]&lt;br /&gt;
(schalt | schalte | stelle ) $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!float}&lt;br /&gt;
( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
( halte | stoppe ) ( den | die ) $de.fhem.Device-blind{Device} [[(im | in der )] $de.fhem.Room{Room}] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Geräte, die als Einzelgerät per SetNumeric-Intent gesteuert werden können, können auch über den entsprechenden Gruppen-Intent angesteuert werden. Wird dabei ein Gruppenname verwendet, in dem auch Geräte enthalten sind, die einzelen Gruppenbefehle nicht umsetzen können, werden diese Geräte einfach übergangen. So kann z.B. eine Gruppe, die über &#039;&#039;$de.fhem.Group-light&#039;&#039; uU. auch Geräte beinhaltet, die nur &#039;&#039;SetOnOff&#039;&#039; beherrschen, aber nicht gedimmt werden können, ohne weiteres über einen Helligkeitsbefehl angesteuert werden.&lt;br /&gt;
&lt;br /&gt;
=== Rollladengeräte ===&lt;br /&gt;
Einen Sonderfall innerhalb der per &#039;&#039;SetNumeric&#039;&#039; steuerbaren Geräte stellen Rollladen-Geräte (genericDeviceType &#039;&#039;blind&#039;&#039;) dar. Zum einen kennen diese in der Regel Sonderbefehle wie &amp;quot;stop&amp;quot; oder gelegentlich auch spezielle Zwischenpositionen (wie &amp;quot;myPosition&amp;quot; für Somfy-Geräte), zum anderen kennen manche Aktoren auch einen &amp;quot;venetian mode&amp;quot;, also die ergänzende Ansteuerung von drehbaren Lamellen (in diesem Sinne wird im Folgenden von &#039;&#039;Jalousie&#039;&#039; gesprochen).&lt;br /&gt;
&lt;br /&gt;
==== Spezielle Positionskommandos ====&lt;br /&gt;
Für Rollladengeräte könnten z.B. folgende Beispiel-Sätze in &#039;&#039;sentences.ini&#039;&#039; für &#039;&#039;SetNumeric&#039;&#039; verwendet werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
(halte|stopp|stoppe) [den|die|das] $de.fhem.Device-blind{Device} [[(im|in|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room}] [an] {Change:cmdStop}&lt;br /&gt;
(fahre|fahr|stelle|stell) [den|die|das] $de.fhem.Device-blind{Device} [[(im|in|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room}] auf Beschatten{Value:21.8}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Der erste dient dazu, das &amp;quot;stop&amp;quot;-Kommando als relative Wertangabe zu übergeben. Ist im SetNumeric-Mapping ein entsprechende Kommando hinterlegt (dieses wird in der Regel automatisch erkannt, wenn vorhanden), wird der Rollladen schlicht an der aktuellen Position anhalten.&lt;br /&gt;
* Der zweite dient dazu, einen eher ungewöhnlichen Zahlenwert als &#039;&#039;Value&#039;&#039; zu übergeben. Dieser kann dann über einen &#039;numericValueMap&#039;-Eintrag im Attribut &#039;&#039;rhasspySpecials&#039;&#039; auf ein beliebiges anderes Kommando an diesem Gerät umgeleitet werden (hier wird davon ausgegangen, dass &#039;&#039;Beschatten&#039;&#039; mit einem Befehl &amp;lt;code&amp;gt;set blind1 pct 30&amp;lt;/code&amp;gt; umgesetzt werden soll, und es sind gleich noch einige weitere beispielhafte Optionen aufgeführt):&lt;br /&gt;
 attr blind1 rhasspySpecials numericValueMap:21.8=&#039;pct 30&#039; 10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&lt;br /&gt;
&lt;br /&gt;
==== Jalousien ====&lt;br /&gt;
Für Jalousien ist es in der Regel erforderlich, zusätzlich zum eigentlichen Positionskommando (für die Behanghöhe) noch ein weiteres Positionskommando abzusetzen. Dazu muss RHASSPY zum einen wissen, dass das erforderlich ist, und zum anderen muss bekannt sein, ob es ein Befehl am selben Device ist oder an einem anderen, und wie dieser heißt.&lt;br /&gt;
Diese ergänzenden Informationen sind im Attribut &#039;&#039;rhasspySpecials&#039;&#039; in einer Zeile für &#039;&#039;venetianBlind&#039;&#039; zu hinterlegen:&lt;br /&gt;
 attr blind1 rhasspySpecials venetianBlind:setter=dim device=blind1_slats stopCommand=&amp;quot;set blind1_slats dim [blind1_slats:dim]&amp;quot;&lt;br /&gt;
Hier würde also ein zusätzliches anderes Gerät mit gesteuert, wobei der setter &#039;&#039;dim&#039;&#039; verwendet würde. Als Wert für die Lamellendrehung wird dabei bei normalen Positionskommandos nochmals der Wert für die Behanghöhe verwendet, für &#039;&#039;stop&#039;&#039;-Kommandos wird im obigen Beispiel der letzte bekannte Lammellenwinkel verwendet. Diese Einstellungen sind passend für ZWave-Geräte, bei denen die Lamellen als eigenes Device abgebildet werden. &lt;br /&gt;
&lt;br /&gt;
== Farben ==&lt;br /&gt;
=== Farbangaben als Nummern ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Für die Steuerung farbiger Lampen exisitert auch eine ältere Methode über das Attribut &#039;&#039;rhasspyColors&#039;&#039;. Es wird ausdrücklich davon abgeraten, diese Methode heute noch neu einzurichten! Diese verwendet intern auch eine andere Logik als sie hier dargestellt wird.}}Farben - oder allgemeiner gesagt, alles, was mir Farbwerten zu tun hat (also auch Weißwerte und ggf. Farbsättigung) - erwartet RHASPY in nummerischer Form. In der Muster-Sprachdatei, die wir im Schnellstart kennengelernt haben, ist daher bereits eine beispielhafte &amp;quot;Umrechnungstabelle&amp;quot; von gesprochenen Farbangaben zu nummerischen Werten enthalten, die erforderlichenfalls angepaßt werden kann. &lt;br /&gt;
Zum Start sollte z.B. folgender Eintrag in der sentences.ini genügen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetColor]&lt;br /&gt;
\[setze|färbe|stelle] [(den | die | das )] $de.fhem.Device-light{Device} [[(im | in der )] $de.fhem.Room{Room}] [auf die Farbe] ( $de.fhem.Colors{Hue} | $de.fhem.Colortemp{Colortemp} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dadurch wird in der Regel der Farbwert in der &#039;&#039;Hue&#039;&#039;-Dimension innerhalb des [https://de.wikipedia.org/wiki/HSV-Farbraum HSV-Farbraums] übergeben, also insbesondere ohne Helligkeitsangabe. Kennt ein Gerät keine Hue-Dimension in seinen settern, wird stattdessen der rgb-Farbraum verwendet, mit den aus der de-language-File ersichtlichen rgb-Entsprechungen der Hue-Werte.&lt;br /&gt;
&lt;br /&gt;
=== Spezielle Mappings ===&lt;br /&gt;
Da diese Vorgehensweise zwar häufig passende Ergebnisse liefert, aber manche Hardwaregeräte diese Befehle anders umsetzen wie üblich, kann über verschiedene Schalter in &#039;&#039;rhasspySpecials&#039;&#039; eine abweichende Behandlung erreicht werden:&lt;br /&gt;
==== colorForceHue2rgb ====&lt;br /&gt;
Wird dieser Schalter (Syntax: &amp;lt;code&amp;gt;attr lamp1 rhasspySpecials colorForceHue2rgb:1&amp;lt;/code&amp;gt;) eingeschaltet, wird das Gerät so behandelt, als hätte es keinen Hue-Setter, also als reines rgb-Gerät.&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Die hier angegebenen nummerischen Farbwerte werden auf andere Befehle abgeleitet - ganz ähnlich der oben genannten Option &#039;&#039;numericValueMap&#039;&#039; für &#039;&#039;blind&#039;&#039;-Type-Geräte. Beispiel:&lt;br /&gt;
 attr lamp1 rhasspySpecials colorCommandMap:0=&#039;rgb FF0000&#039; 120=&#039;rgb 00FF00&#039; 240=&#039;rgb 0000FF&#039;&lt;br /&gt;
==== colorTempMap ====&lt;br /&gt;
Entspricht dem zu &#039;&#039;colorCommandMap&#039;&#039; gesagten, nur dass hier als Eingangsinformation ein Weiß-Wert erforderlich ist statt einer &#039;&#039;Hue&#039;&#039;-Angabe.&lt;br /&gt;
&lt;br /&gt;
== Szenen ==&lt;br /&gt;
Um einzelne oder mehrere Geräte gleichzeitig in einen zueinander passenden Modus zu versetzen, stehen verschiedene Mechanismen bereit, die hier in der Zusammengschau kurz erläutert werden sollen:&lt;br /&gt;
=== echte Szenen ===&lt;br /&gt;
Viele Geräte kennen Optionen, bestimmte Einstellungen zu speichern und &amp;quot;auf Knopfdruck&amp;quot; wieder abrufen zu können, einige Interface-Typen kennen dies als Funktion, übergeordnet mehrere Geräte zu steuern und mit [[LightScene]] steht in FHEM auch ein Modul bereit, mit dem das ebenfalls für mehrere Geräte vorab abgespeicherte Zustände wieder hergestellt werden können.&lt;br /&gt;
&lt;br /&gt;
Erkennt die automatische Geräte-Analyse, dass ein Gerät über eine Szenenfunktion verfügt, wird dieses Gerät auch für die Ansteuerung seiner Szenen vorbereitet. Allerdings sind diese Szenen in der Regel nicht sprechbar, und häufig werden auch sehr viele Szenen angeboten, die gar nicht genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Über das &#039;&#039;rhasspySpecial&#039;&#039; &#039;&#039;scene&#039;&#039; kann solchen Geräten sprechbare Szenenbezeichnungen zugeordnet werden, und es können mit der Angabe &#039;&#039;none&#039;&#039; auch einzelne oder alle Szenen deaktiviert werden. Details sind der commandref zu entnehmen. &lt;br /&gt;
&lt;br /&gt;
=== ähnliche Optionen === &lt;br /&gt;
Stehen keine direkten Szenen-Funktionen zur Verfügung, kann entweder ein LightScene-Gerät erstellt werden, oder es können alternativ folgende ähnliche Funktionalitäten verwendet werden, um ähnliche Ergebnisse zu erziehlen&lt;br /&gt;
==== rhasspyShortcuts ====&lt;br /&gt;
Dieser Intent ermöglicht es, verschiedenen Sprachsequenzen jeweils im Prinzip beliebigen Befehlen (FHEM-Kommandos oder Perl-Code) zuzuordnen. &lt;br /&gt;
==== Custom Intents ====&lt;br /&gt;
Ist ähnlich wie &#039;&#039;rhasspyShortcuts&#039;&#039;, bietet aber den vollen Zugriff auf die von Rhasspy übergebenen Daten und erfordert Perl-Code, über den dann auch Dialoge gestaltet werden können.&lt;br /&gt;
==== rhasspyChannels ====&lt;br /&gt;
Wäre eine weitere (veraltete) Methode, um eine ähnliche Funktionalität zu erzielen.&lt;br /&gt;
&lt;br /&gt;
== Dialoge ==&lt;br /&gt;
Üblicherweise schließt RHASSPY den laufenden Dialog, wenn eine Aktion abgeschlossen werden konnte. Hier werden die Ausnahmen dargestellt:&lt;br /&gt;
&lt;br /&gt;
=== Rückfragen ===&lt;br /&gt;
Kann RHASSPY nicht feststellen, welches Gerät genau gemeint ist, erfolgt entweder die Rückmeldung, dass insgesamt zu wenige Angaben gemacht wurden (und die Sitzung wird geschlossen), oder es erfolgt eine Rückfrage nach dem Device (wenn mehrere passende Devices im &amp;quot;angefragten&amp;quot; Raum vorhanden sind) oder dem Raum (weil mehrere Räume in Frage kommen).&lt;br /&gt;
&lt;br /&gt;
Zur Weiterführung derartiger Rückfragen (oder deren vorzeitigem Abbruch) werden weitere Intents benötigt: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ChoiceRoom]&lt;br /&gt;
nimm [das Gerät] ( aus ( dem | der ) | im | den | die ) $de.fhem.MainRooms{Room}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:ChoiceDevice]&lt;br /&gt;
ich hätte gerne [das Gerät] $de.fhem.Aliases{Device}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
(lass es | nein | abbrechen | abbruch ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bestätigungen ===&lt;br /&gt;
Über &#039;&#039;rhasspyShortcuts&#039;&#039;, &#039;&#039;rhasspyTweaks&#039;&#039; und/oder &#039;&#039;rhasspySpecials&#039;&#039; kann eine Bestätigungsanfrage ausgelöst werden. Um eine solche Aktion freizugeben, wird ein weiterer Intent benötigt, der genau &#039;&#039;OK&#039;&#039; als &#039;&#039;{Mode}&#039;&#039; zurückliefern muss. Dieser könnte in sentences.ini etwa so aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( ja mach | tu es | ist ok | aber gerne doch ){Mode:OK}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Eigene Dialoge ===&lt;br /&gt;
Über Custom Intents in Verbindung mit passenden Rückgabewerten aus myUtils-Perl-Code lassen sich Sitzungen offen halten und so eigene Dialoge gestalten. (siehe [[RHASSPY#Intents_in_eigenen_Dateien| Intents in eigenen Dateien]])&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37416</id>
		<title>RHASSPY</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=RHASSPY&amp;diff=37416"/>
		<updated>2022-05-02T10:36:40Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Bild getauscht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 10_RHASSPY.pm. &lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModCmdRef=RHASSPY&lt;br /&gt;
|ModForumArea=Frontends/Sprachsteuerung&lt;br /&gt;
|ModFTopic=119447&lt;br /&gt;
|ModTechName=10_RHASSPY.pm&lt;br /&gt;
|ModOwner=Beta-User ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[File:Rhasspy_fhem.png|thumb|right|Schematische Darstellung von Rhasspy und FHEM/RHASSPY]]&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
[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.&lt;br /&gt;
&lt;br /&gt;
Die Anbindung weiterer Räume ist über sogenannte &amp;quot;Satelliten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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!&lt;br /&gt;
&lt;br /&gt;
=== Konventionen ===&lt;br /&gt;
{{Hinweis| In diesem Artikel und der CommandRef werden folgende Schreibweisen verwendet:&lt;br /&gt;
* &#039;&#039;&#039;[[RHASSPY]]&#039;&#039;&#039; bezieht sich auf das FHEM-Modul&lt;br /&gt;
* &#039;&#039;&#039;rhasspy&#039;&#039;&#039; bezieht sich auf das das FHEM-Device&lt;br /&gt;
* &#039;&#039;&#039;Rhasspy&#039;&#039;&#039; bezeichnet die (zentrale) Serverinstallation}}&lt;br /&gt;
&lt;br /&gt;
{{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 &#039;&#039;RHASSPY&#039;&#039; eingestellt ist}}&lt;br /&gt;
&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Details zur Verwaltung des RHASSPY Moduls ===&lt;br /&gt;
Das Modul ist derzeit nicht in der &amp;quot;offiziellen&amp;quot; FHEM Distribution enthalten und muss daher manuell installiert werden. Dafür gibt es zwei Möglichkeiten.&lt;br /&gt;
&lt;br /&gt;
*Im Subversion Repository, kurz SVN von FHEM ist die jeweils aktuelle &amp;quot;stable&amp;quot; Version des Moduls im &#039;&#039;contrib&#039;&#039;-Zweig zu finden. Diese kann mit folgendem Befehl, der im FHEM Befehls-Eingabefeld einzugeben ist, heruntergeladen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/10_RHASSPY.pm&#039;, &#039;FHEM/10_RHASSPY.pm&#039;) }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Genauere Informationen zu dieser Vorgangsweise finden sich unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen]]. Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
*FHEM Update und GitHub&lt;br /&gt;
Im GitHub-Repository des Moduls gibt es zwei Branches &#039;&#039;main&#039;&#039; und &#039;&#039;dev&#039;&#039;. In &#039;&#039;main&#039;&#039; ist die stabile Version des Moduls, in &#039;&#039;dev&#039;&#039; die jeweils aktuelle Entwicklungsversion. Aus Gründen der Stabilität ist natürlich die aus &#039;&#039;main&#039;&#039; zu bevorzugen.&lt;br /&gt;
&lt;br /&gt;
Um das Modul zu installieren bzw. zu aktualisieren, kann der &#039;&#039;update&#039;&#039;-Mechanismus von FHEM genutzt werden. Dazu muss das Repository in der Liste der vom update-Befehl verarbeiteten Repositorien aufgenommen werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann mit folgendem Befehl das Modul installiert oder aktualisiert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;main&#039;&#039; durch &#039;&#039;dev&#039;&#039; ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu dieser Vorgangsweise in der stehen in der [https://fhem.de/commandref.html#update CommandRef] oder im [[Update|FHEM-Wiki]].&lt;br /&gt;
&lt;br /&gt;
Nach Installation des Moduls muss FHEM neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung MQTT2_CLIENT ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zuerst muss ein MQTT2_CLIENT Device erstellt werden, welches sich mit dem MQTT-Server (Mosquitto) von Rhasspy verbindet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;deviceName&amp;gt; MQTT2_CLIENT &amp;lt;ip-oder-hostname-des-mqtt-servers&amp;gt;:&amp;lt;port&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anschließend wird die &#039;&#039;clientOrder&#039;&#039; gesetzt, um die richtige Benachrichtigungsreihenfolge einzustellen. Wird das MQTT2_CLIENT Device nur für RHASSPY verwendet, reicht hier die Angabe &amp;lt;code&amp;gt;RHASSPY&amp;lt;/code&amp;gt;. Ansonsten müssen noch alle anderen Devices (z.B. &amp;lt;code&amp;gt;MQTT_GENERIC_BRIDGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MQTT2_DEVICE&amp;lt;/code&amp;gt;) angegeben werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; clientOrder RHASSPY [device2] [device3]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;setByTheProgram&amp;lt;/code&amp;gt;. Ansonsten müssen alle für RHASSPY notwendigen Topics eingefügt werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions setByTheProgram&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr &amp;lt;deviceName&amp;gt; subscriptions hermes/intent/+ hermes/dialogueManager/sessionStarted hermes/dialogueManager/sessionEnded hermes/nlu/intentNotRecognized hermes/hotword/+/detected&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Beispiele&lt;br /&gt;
* 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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY&lt;br /&gt;
attr rhasspyMQTT2 subscriptions setByTheProgram&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod rhasspyMQTT2 MQTT2_CLIENT 192.168.1.122:1884&lt;br /&gt;
attr rhasspyMQTT2 clientOrder RHASSPY MQTT_GENERIC_BRIDGE MQTT2_DEVICE&lt;br /&gt;
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]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definition von RHASSPY (DEF)==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;name&amp;gt; RHASSPY &amp;lt;baseUrl&amp;gt; &amp;lt;devspec&amp;gt; &amp;lt;defaultRoom&amp;gt; &amp;lt;language&amp;gt; &amp;lt;fhemId&amp;gt; &amp;lt;prefix&amp;gt; &amp;lt;useGenericAttrs&amp;gt; &amp;lt;handleHotword&amp;gt; &amp;lt;encoding&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=RHASSPY verwendet sehr oft &amp;lt;parseParams&amp;gt;. 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.}}&lt;br /&gt;
Alle Parameter sind &#039;&#039;&#039;optional&#039;&#039;&#039;. Die meisten werden im Normalfall gar nicht benötigt (z.B. &amp;lt;code&amp;gt;fhemId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;prefix&amp;lt;/code&amp;gt;). 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 &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, möchte man eine andere Sprache als Englisch oder Deutsch verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-baseurl&amp;quot;&amp;gt;baseUrl&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;baseUrl=http://127.0.0.1:12101&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-devspec&amp;quot;&amp;gt;devspec&amp;lt;/code&amp;gt;&lt;br /&gt;
:devspec der Geräte, die mit Rhasspy gesteuert werden sollen. Wenn der &#039;&#039;genericDeviceType&#039;&#039;-Support aktiviert ist, ist der Default &amp;lt;code&amp;gt;devspec=genericDeviceType=.+&amp;lt;/code&amp;gt;, sonst wird &amp;lt;code&amp;gt;devspec=room=Rhasspy&amp;lt;/code&amp;gt; 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. &amp;lt;code&amp;gt;devspec=room=livingroom,room=bathroom,bedroomlamp&amp;lt;/code&amp;gt;) verwendet werden können, finden sich in der [https://commandref.fhem.de/commandref.html#devspec CommandRef].&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-defaultroom&amp;quot;&amp;gt;defaultRoom&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;defaultRoom=default&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sprache, in der mit Rhasspy gesprochen wird. Der Standard-Wert hängt vom &#039;&#039;global&#039;&#039;-Device ab. Dieser ist standardmäßig &amp;lt;code&amp;gt;language=en&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-fhemid&amp;quot;&amp;gt;fhemId&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;fhemId=fhem&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-prefix&amp;quot;&amp;gt;prefix&amp;lt;/code&amp;gt;&lt;br /&gt;
: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 &amp;lt;code&amp;gt;prefix=rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-usegenericattrs&amp;quot;&amp;gt;&#039;&#039;&#039;useGenericAttrs&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Üblicherweise verwendet RHASSPY - wie auch einige andere FHEM Module für Sprachassistenten - das Attribut &#039;&#039;genericDeviceType&#039;&#039; um Schaltmöglichkeiten von Geräten automatisch zu erkennen. Dieser Parameter fügt das Attribut &#039;&#039;genericDeviceType&#039;&#039; zur globalen Attributliste hinzu. Der Wert 0 verhindert dieses hinzufügen. Default ist &amp;lt;code&amp;gt;useGenericAttrs=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;def-encoding&amp;quot;&amp;gt;encoding&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sollte es Probleme mit Umlauten geben, kann das Character-Encoding geändert werden. Default ist &amp;lt;code&amp;gt;encoding=utf8&amp;lt;/code&amp;gt;.&lt;br /&gt;
;&amp;lt;code id=&amp;quot;handlehotword&amp;quot;&amp;gt;handleHotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Triggert das Reading &#039;&#039;hotword&#039;&#039;, wenn ein Hotword erkannt wurde (und erstellt das Reading, falls noch nicht vorhanden). Weitere Informationen dazu stehen beim Attribut [[#attr-rhasspyhotwords|&#039;&#039;rhasspyHotwords&#039;&#039;]]. Default ist &amp;lt;code&amp;gt;handleHotword=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Nach dem Definieren eines RHASSPY-Modules sollte das IODev manuell gesetzt werden um ein automatische IO-Zuweisung zu verhindern. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; IODev &amp;lt;m2client&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
;Beispiele:&lt;br /&gt;
Läuft Rhasspy auf der selben Maschine wie FHEM, die Sprache ist im &#039;&#039;global&#039;&#039;-Device bereits richtig eingestellt und der Standardraum entspricht der siteID, die in Rhasspy vergeben wurde:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;genericDeviceType&#039;&#039; Attribut, als auch die Geräte &#039;&#039;device_a1&#039;&#039; und &#039;&#039;device_xy&#039;&#039; gesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define Rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 defaultRoom=&amp;quot;Büro Lisa&amp;quot; language=de devspec=genericDeviceType=.+,device_a1,device_xy handleHotword=1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Set-Befehle (SET)==&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-customslot&amp;quot;&amp;gt;customSlot&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erstellt einen neue - oder überschreibt einen alten - Slot in Rhasspy&lt;br /&gt;
:&amp;lt;code&amp;gt;slotname&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;slotdata&amp;lt;/code&amp;gt; sind verpflichtend&lt;br /&gt;
:&amp;lt;code&amp;gt;overwrite&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;overwrite=true&amp;lt;/code&amp;gt;. Das Setzen eines anderes Wertes verhindert das Überschreiben einen bereits bestehenden Slot mit gleichem Namen.&lt;br /&gt;
:&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt; ist optional. Default ist &amp;lt;code&amp;gt;training=true&amp;lt;/code&amp;gt;. Das Setzen eines anderen Wertes verhindert ein Training von Rhasspy nach dem Speichern des Slots.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot mySlot a,b,c overwrite training&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; customSlot slotname=mySlot slotdata=a,b,c overwrite=false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-fetchsiteids&amp;quot;&amp;gt;fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Liest alle in Rhasspy vorhandenen siteIDs aus und speichert sie im Reading &#039;&#039;siteIds&#039;&#039;. Wird z.B. verwendet, um festzustellen, auf welchem Satelliten der User über das Ende eines Timers benachrichtigt werden soll.&lt;br /&gt;
:Muss immer ausgeführt werden, wenn eine neue siteId in Rhasspy hinzugefügt wird (neuer Satellit z.B.).&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; fetchSiteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-play&amp;quot;&amp;gt;play&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet eine WAV Datei an Rhasspy.&lt;br /&gt;
:&amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;path&amp;gt; sind verpflichtend!&lt;br /&gt;
:Optional kann die Anzahl der Wiederholungen (Default: 1) und die Dauer der Pause zwischen den jeweiligen Wiederholungen (Default: 15) angeben werden.&lt;br /&gt;
:&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;/opt/fhem/test.wav&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; play siteId=&amp;quot;default&amp;quot; path=&amp;quot;./test.wav&amp;quot; repeats=3 wait=20&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-speak&amp;quot;&amp;gt;speak&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet einen Text an das TTS-Sytem, welches ihn dann als Sprache ausgibt.&lt;br /&gt;
:Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; sind verpflichtend!&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; speak siteId=&amp;quot;wohnzimmer&amp;quot; text=&amp;quot;This is a test&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-textcommand&amp;quot;&amp;gt;textCommand&amp;lt;/code&amp;gt;&lt;br /&gt;
:Sendet ein Text-Kommando an Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; textCommand schalte das licht ein&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-trainrhasspy&amp;quot;&amp;gt;trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
:Startet das Training von Rhasspy.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; trainRhasspy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-update&amp;quot;&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemap&amp;quot;&amp;gt;devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-devicemaponly&amp;quot;&amp;gt;devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Datenstruktur von RHASSPY. Es werden weder Slots in Rhasspy geändert, noch das Training gestartet.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update devicemap_only&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slots&amp;quot;&amp;gt;slots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert (bzw. erstellt) alle Slots in Rhasspy mit den aktuellen Geräten, Räumen, usw.&lt;br /&gt;
::Erstellte/Aktualisierte Slots sind z.B.:&lt;br /&gt;
::*de.fhem.AllKeywords&lt;br /&gt;
::*de.fhem.Device&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;genericDeviceType&#039;&#039;&lt;br /&gt;
::*de.fhem.Device-&#039;&#039;Intent&#039;&#039;&lt;br /&gt;
::*de.fhem.Group&lt;br /&gt;
::*de.fhem.Room&lt;br /&gt;
::*de.fhem.MediaChannels&lt;br /&gt;
::*de.fhem.Color&lt;br /&gt;
::*de.fhem.NumericType&lt;br /&gt;
::(Hinweis: Die ersten beiden Teile &#039;&#039;de&#039;&#039; und &#039;&#039;fhem&#039;&#039; hängen von der DEF des RHASSPY-Devices ab)&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-slotsnotraining&amp;quot;&amp;gt;slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wie &amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;, aber ohne Training nach dem Update.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update slots_no_training&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-language&amp;quot;&amp;gt;language&amp;lt;/code&amp;gt;&lt;br /&gt;
::Liest das das Sprach-File (&#039;&#039;languageFile&#039;&#039;) neu ein.&lt;br /&gt;
::Muss immer ausgeführt werden, wenn in diesem File oder dem Attribut &#039;&#039;languageFile&#039;&#039; etwas geändert wurde!&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update language&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-udpate-intentfilter&amp;quot;&amp;gt;intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
::Setzt die Intent Filter, die vom Rhasspy Dialogue Manger verwendet werden zurück. Details dazu bei [[#attr-rhasspytweaks-intentfilter|intentFilter]] im &#039;&#039;rhasspyTweaks&#039;&#039;-Attribut.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update intent_filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:;&amp;lt;code id=&amp;quot;set-update-all&amp;quot;&amp;gt;all&amp;lt;/code&amp;gt;&lt;br /&gt;
::Aktualisiert die Devicemap und das languageFile&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; update all&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;set-volume&amp;quot;&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
::Stellt die Lautstärke der gewünschten siteId auf einen Wert zwischen 0 and 1 (float).&lt;br /&gt;
::Beide Argumente &amp;lt;code&amp;gt;siteId&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt; sind verpflichtend.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;set &amp;lt;rhasspyDevice&amp;gt; siteId=&amp;quot;default&amp;quot; volume=&amp;quot;0.5&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Bitte nicht vergessen, dass nach jeder Änderung an RHASSPY oder an einem von RHASSPY gesteuerten Gerät ein &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt; ausgeführt werden muss!}}&lt;br /&gt;
&lt;br /&gt;
==Attribute (ATTR)==&lt;br /&gt;
Um RHASSPY zum Laufen zu bringen, müssen unterschiedliche Attribute gesetzt werden. Dabei gibt es&lt;br /&gt;
*Attribute, die im RHASSPY-Device selbst gesetzt werden müssen und&lt;br /&gt;
*Attribute, die in den Devices gesetzt werden müssen, die von RHASSPY kontrolliert werden sollen.&lt;br /&gt;
&lt;br /&gt;
Letztere werden im Abschnitt [[#FHEM-Devices für die Verwendung mit Rhasspy konfigurieren|FHEM-Devices für die Verwendung mit Rhasspy konfigurieren]] behandelt.&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden die Attribute behandelt, die auf das RHASSPY-Device selbst wirken.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-iodev&amp;quot;&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT2_CLIENT Device, welches die MQTT-Nachrichten für RHASSPY liefert.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; IODev rhasspyMQTT2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-forcenext&amp;quot;&amp;gt;forceNext&amp;lt;/code&amp;gt;&lt;br /&gt;
: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.&lt;br /&gt;
:Standardmäßig werden diese Nachrichten nicht weitergeleitet um eine bessere Kompatibilität mit dem &#039;&#039;autocreate&#039;&#039;-Feature des MQTT2_DEVICE sicher zu stellen.&lt;br /&gt;
:Siehe dazu das {{Link2CmdRef|Anker=MQTT2_CLIENT-attr-clientOrder|Lang=en|Label=clientOrder}}-Attribut in der CommandRef zum MQTT2_CLIENT Device.&lt;br /&gt;
:Das Setzen dieses Attributs in einer RHASSPY-Instanz kann auch andere eventuell vorhandene RHASSPY-Instanzen beinflussen.&lt;br /&gt;
:Default ist &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; forceNext 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-languagefile&amp;quot;&amp;gt;languageFile&amp;lt;/code&amp;gt;&lt;br /&gt;
:Pfad zur Sprach-Datei&lt;br /&gt;
:Ist dieses Argument nicht gesetzt, wird ein Standard-Set an englischen Sätzen für die Sprachantworten verwendet.&lt;br /&gt;
:Die Datei selbst muss ein gültiges JSON-File sein, dass sich nach der Struktur aus den englischen Standardwerten richtet.&lt;br /&gt;
: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&#039;s name: &amp;lt;code&amp;gt;{toJSON($defs{RHASSPY}-&amp;gt;{helper}{lng})}&amp;lt;/code&amp;gt;, das Ergebnis dann bearbeiten und es als eigenes languageFile verwenden.&lt;br /&gt;
:Im Standard-Set sind auch einige Variablen enthalten. Auch die können im eigenen File verwendet werden.&lt;br /&gt;
:languageFile erlaubt auch eine Kombination aus vorhandenen und eigenen Sätzen. Dazu können die eigenen Sätzen einfach im Sub-Tree &#039;&#039;user&#039;&#039; abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; (vorausgesetzt, die Sprach-Datei ist im selben Verzeichnis wie fhem.pl):&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; languageFile ./rhasspy-de.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-response&amp;quot;&amp;gt;response&amp;lt;/code&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;Hinweis:&#039;&#039;&#039;: Die Verwendung dieses Attributs ist nicht mehr empfohlen. Bessere Alternative ist die Sprach-Datei.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Mit diesem Attribut können eigene Standardantworten definiert werden.&lt;br /&gt;
Mögliche Schlüsselwörter sind &amp;lt;code&amp;gt;DefaultError&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NoActiveMediaDevice&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;DefaultConfirmation&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;DefaultError=&lt;br /&gt;
DefaultConfirmation=Klaro, mach ich&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-rhasspyhotwords&amp;quot;&amp;gt;rhasspyHotwords&amp;lt;/code&amp;gt;&lt;br /&gt;
:Kann verwendet werden, um benutzerdefinierte Aktionen auszuführen, sobald ein bestimmtes Hotword erkannt wurde. Dazu sind keine speziellen Konfigurationsschritte in anderen FHEM Devices notwendig.&lt;br /&gt;
:Wenn mittels Attribut oder DEF aktiviert, wird ein Reading &#039;&#039;hotword&#039;&#039; erstellt und mit dem erkannten Hotword und der siteId befüllt um ein Event-Handling zu ermöglichen.&lt;br /&gt;
:&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; 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.&lt;br /&gt;
:Ein Hotword pro Zeile, Syntax entweder einfach oder erweitert&lt;br /&gt;
 &lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;bumblebee_linux = set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;porcupine_linux = livingroom=&amp;quot;set amplifier mute on&amp;quot; default={Log3($DEVICE,3,&amp;quot;device $DEVICE - room $ROOM - value $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Im ersten Beispiel wird der Befehl immer ausgeführt, wenn das Hotword &#039;&#039;bumblebee_linux&#039;&#039; erkannt wurde.&lt;br /&gt;
:Im zweiten nur, wenn das Hotword &#039;&#039;porcupine_linux&#039;&#039; in der siteId &#039;&#039;livingroom&#039;&#039; erkannt wurde.&lt;br /&gt;
:$DEVICE wird ausgewertet als der Name des RHASSPY Devices, $ROOM als siteId und $VALUE als das verwendete Hotword.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-rhasspyintents&amp;quot;&amp;gt;rhasspyIntents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Definiert einen benutzerdefinierten Intent.&lt;br /&gt;
:Ein Intent pro Zeile.&lt;br /&gt;
:&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;rhasspyDevice&amp;gt; rhasspyIntents SetCustomIntentsTest=SetCustomIntentsTest(siteId,Type)&amp;lt;/code&amp;gt;&lt;br /&gt;
:in Kombination mit folgendem myUtils-Code&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub SetCustomIntentsTest {&lt;br /&gt;
my $room = shift;&lt;br /&gt;
my $type = shift;&lt;br /&gt;
Log3(&#039;rhasspy&#039;,3 , &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;);&lt;br /&gt;
return &amp;quot;RHASSPY: Room $room, Type $type&amp;quot;;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
:schreibt einen Log-Eintrag nach jedem Aufruf dieses Intents.&lt;br /&gt;
:Die folgenden Argumente können dabei übergeben werden:&lt;br /&gt;
:*NAME =&amp;gt; Name des RHASSPY-Devices&lt;br /&gt;
:*DATA =&amp;gt; komplette JSON-$data (wie intern geparsed), in JSON kodiert&lt;br /&gt;
:*siteId, Device etc. =&amp;gt; jedes Element, das in JSON-$data existiert&lt;br /&gt;
:Wird von der Funktion ein einfacher Text zurück geliefert, wird dieser als &#039;&#039;response&#039;&#039; angesehen. Wenn der Rückgabewert nicht definiert ist, wird die Standard-&#039;&#039;response&#039;&#039; verwendet.&lt;br /&gt;
:Es kann aber auch ein HASH oder ARRAY übergeben werden.&lt;br /&gt;
:Im Falle eines ARRAYs wird das erste Element als &#039;&#039;response&#039;&#039; 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 &amp;quot;d&amp;quot;-Parameter beim Attribut [[#attr-rhasspyshortcuts|rhasspyShortcuts]].&lt;br /&gt;
: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 &#039;&#039;intentFilter&#039;&#039;, falls die für den weiteren Dialog relevanten Intents eingeschränkt (oder erweitert) werden sollen. Dabei sollte möglichst der Intent &#039;&#039;CancelAction&#039;&#039; aktiv gehalten werden, damit der User die Option hat, den Dialog jederzeit aktiv zu beenden.&lt;br /&gt;
:Siehe dazu auch den Abschnitt [[#Eigene Intents erstellen]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-rhasspyshortcuts&amp;quot;&amp;gt;rhasspyShortcuts&amp;lt;/code&amp;gt;&lt;br /&gt;
:Hiermit können benutzerdefinierte Sätze erstellt werden ohne die sentences.ini in Rhasspy bearbeiten zu müssen.&lt;br /&gt;
:Diese Shortcuts werden zu Rhasspy hochgeladen, sobald das &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; [[#set-update|Set]]-Kommando ausgeführt wird.&lt;br /&gt;
:Ein Shortcut pro Zeile, Syntax ist entweder einfach oder erweitert.&lt;br /&gt;
:&#039;&#039;&#039;Beispiele:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;mute on=set amplifier2 mute on&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;lamp off={fhem(&amp;quot;set lampe1 off&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;du bist cool&amp;quot; f=&amp;quot;set $NAME speak siteId=&#039;livingroom&#039; text=&#039;danke dir! du bist noch viel cooler!&#039;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;schalte den ton aus&amp;quot; p={fhem (&amp;quot;set $NAME mute off&amp;quot;)} n=amplifier2 c=&amp;quot;soll ich den ton wirklich ausschalten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;i=&amp;quot;ich hab hunger&amp;quot; f=&amp;quot;set Herd on&amp;quot; d=&amp;quot;Herd&amp;quot; c=&amp;quot;möchtest du schweinsbraten?&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Erklärung zu den Abkürzungen:&lt;br /&gt;
:*&amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; =&amp;gt; intent&lt;br /&gt;
::Zeilen, die mit &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; beginnen, werden als erweiterte Syntax interpretiert. Soll die erweiterte Syntax verwendet werden, ist das &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; also Pflicht!&lt;br /&gt;
:*&amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; =&amp;gt; FHEM Befehl&lt;br /&gt;
::Syntax wie von der FHEM Kommandozeile gewohnt&lt;br /&gt;
:*&amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; =&amp;gt; Perl Befehl&lt;br /&gt;
::Syntax wie von der FHEM Kommandozeile gewohnt, eingerahmt in geschwungenen Klammern (&amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; hat Vorrang vor &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&lt;br /&gt;
:*&amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;gt; Device Name(en, Komma getrennt)&lt;br /&gt;
::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.&lt;br /&gt;
::Hinweis: Wenn Perl-Funktionen aufgerufen werden, wird der Rückgabewert dieser Funktion verwendet, sofern kein explizites Device angegeben ist.&lt;br /&gt;
:*&amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; =&amp;gt; Response&lt;br /&gt;
::Sprachanwort, die ausgegeben wird. Ist &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; nicht gesetzt, wird der Rückgabewert der aufgerufenen Funktion verwendet.&lt;br /&gt;
::In den Antwortsätze werden &#039;&#039;set magic&#039;&#039;-ähnliche Ersetzungen verarbeitet. Es ist also auch eine Zeile wie &amp;lt;code&amp;gt;i=&amp;quot;what&#039;s the time for sunrise&amp;quot; r=&amp;quot;at [Astro:SunRise] o&#039;clock&amp;quot;&amp;lt;/code&amp;gt; gültig.&lt;br /&gt;
::Mit den folgenden Abkürzungen kann auch nach einer Bestätigung für den Befehl gefragt werden:&lt;br /&gt;
::*&amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; =&amp;gt; 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.&lt;br /&gt;
::*&amp;lt;code&amp;gt;ct&amp;lt;/code&amp;gt; =&amp;gt; Numerischer Wert für das Timeout des Dialogs in Sekunden. Default ist &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;.&lt;br /&gt;
::Siehe [[#attr-rhasspytweaks-confirmintents|hier]] für weitere Informationen zu Bestätigungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;code id=&amp;quot;attr-rhasspytweaks&amp;quot;&amp;gt;rhasspyTweaks&amp;lt;/code&amp;gt;&lt;br /&gt;
Mit diesen Einstellungen können benutzerdefinierte Optimierungen an RHASSPY vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-timerlimits&amp;quot;&amp;gt;timerLimits&amp;lt;/code&amp;gt;&lt;br /&gt;
::Wird verwendet um den Timer anzuweisen mit z.B. &amp;quot;gestellt auf 30 Minuten&amp;quot; oder &amp;quot;gestellt auf 10:30&amp;quot; zu antworten&lt;br /&gt;
::&amp;lt;code&amp;gt;timerLimits=90,300,3000,2*HOURSECONDS,50&amp;lt;/code&amp;gt;&lt;br /&gt;
::Hierbei müssen fünf Werte gesetzt werden, die den Zeitgrenzen für Stufen in der Antwortstruktur &#039;&#039;timerSet&#039;&#039; entsprechen.&lt;br /&gt;
::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 &amp;quot;Uhrzeit&amp;quot;-Format gestellt ist.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-timersounds&amp;quot;&amp;gt;timerSounds&amp;lt;/code&amp;gt;&lt;br /&gt;
::Standardmäßig antwortet der Timer mit einer Sprachnachricht, wenn er abgelaufen ist. Soll lieber eine WAV-Datei verwendet werden, kann das hier eingestellt werden.&lt;br /&gt;
::&amp;lt;code&amp;gt;timerSounds= default=./yourfile1.wav eier=3:20:./yourfile2.wav kartoffeln=5:./yourfile3.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
::Die Keys in dieser Code-Zeile sind Beispiele und deren Name - bis auf &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; frei wählbar. Der Name muss aber zu den &#039;&#039;Label&#039;&#039;-Tags für die Timer in den Rhasspy-Sentences passen.&lt;br /&gt;
::&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist optional. Wenn gesetzt, wird dieses WAV-File für alle benannten Timer verwendet, für die kein Keyword in der Konfiguration ist.&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-updateslots&amp;quot;&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
::Ändert diverse Aspekte des Erstellens und Updatens von Slots&lt;br /&gt;
::*&amp;lt;code&amp;gt;noEmptySlots=1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::Per Default generiert RHASSPY einen zusätzlichen Slot für jeden &#039;&#039;genericDeviceType&#039;&#039;, der erkannt wird. Unabhängig davon, ob er bei einem Gerät gesetzt ist. Das kann zu leeren Slots führen.&lt;br /&gt;
:::Ist der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, werden keine leeren Slots erstellt.&lt;br /&gt;
::*&amp;lt;code&amp;gt;overwrite_all=false&amp;lt;/code&amp;gt;&lt;br /&gt;
:::RHASSPY überschreibt alle vorhandenen Slots wenn ein &amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt; ausgeführt wird. Ist das nicht gewünscht, muss dieser Wert auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; gesetzt werden.&lt;br /&gt;
::*&amp;lt;code&amp;gt;timeouts&amp;lt;/code&amp;gt;&lt;br /&gt;
:::Die Keywörter &amp;lt;code&amp;gt;confirm&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; können verwendet werden, um das Standard-Timeouts (15s/20s) für Dialoge zu ändern.&lt;br /&gt;
:::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:::&amp;lt;code&amp;gt;timeouts: confirm=25 default=30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-confirmintents&amp;quot;&amp;gt;confirmIntents&amp;lt;/code&amp;gt;&lt;br /&gt;
::Hiermit kann eingestellt werden, dass für bestimmte Intents immer ein Bestätigung erfragt wird. Unterstützt werden derzeit alle &amp;quot;set-&amp;quot;-Intents.&lt;br /&gt;
::Dazu werden &amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt;=&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt;-Paare verwendet.&lt;br /&gt;
:::&amp;lt;code&amp;gt;Intent&amp;lt;/code&amp;gt; ist der Name des gewünschten Intents&lt;br /&gt;
:::&amp;lt;code&amp;gt;regex&amp;lt;/code&amp;gt; ist eine Regex, die eine bestimmte Gruppe (für Gruppen-Intents) oder einen bestimmten Device-Namen beschreiben muss.&lt;br /&gt;
:::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
:::&amp;lt;code&amp;gt;confirmIntents=SetOnOffGroup=light|blinds SetOnOff=blind.*&amp;lt;/code&amp;gt;&lt;br /&gt;
::Befehle werden nur nach einer positiven Bestätigung ausgeführt. Das bedeutet, es muss unbedingt ein &amp;lt;code&amp;gt;Mode:OK&amp;lt;/code&amp;gt;-Wert vom &#039;&#039;ConfirmAction&#039;&#039;-Intent gesendet werden. Jede andere Wert für &amp;lt;code&amp;gt;Mode&amp;lt;/code&amp;gt; wird als Abbruch gewertet. Es kann aber auch der eigene Intent &#039;&#039;CancelAction&#039;&#039; für den Abbruch verwendet werden.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ConfirmAction]&lt;br /&gt;
( yes, please do it | go on | that&#039;s ok | yes, please ){Mode:OK}&lt;br /&gt;
( don&#039;t do it after all ){Mode}&lt;br /&gt;
&lt;br /&gt;
[de.fhem:CancelAction]&lt;br /&gt;
( let it be | oh no | cancel | cancellation ){Mode:Cancel}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-confirmintentresponses&amp;quot;&amp;gt;confirmIntentResponses&amp;lt;/code&amp;gt;&lt;br /&gt;
::Üblicherweise ist die Bestätigungs-Frage ein &amp;quot;Echo&amp;quot; des ursprünglich gesprochenen Befehls. Dies kann für jeden Intent geändert werden,&lt;br /&gt;
::Dies kann für jeden Intent individuell angepaßt werden, wobei die Variablen $target, ($rawInput) und $Value verwendet werden können.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;confirmIntentResponses=SetOnOffGroup=&amp;quot;wirklich die Gruppe $target $Value schalten&amp;quot; SetOnOff=&amp;quot;bestätige dass $target $Value geschaltet werden soll&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; wird dabei mit den defaults aus dem &#039;&#039;words&#039;&#039; key in der languageFile übersetz (falls vorhanden). Weitere Optionen für Ersetzungen von &amp;lt;code&amp;gt;$Value&amp;lt;/code&amp;gt; sind für einzelne Devices über den [[#attr-rhasspyspecials-confirmvaluemap|confirmValueMap]] key im Attribut &#039;&#039;rhasspySpecials&#039;&#039; verfügbar.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-intentfilter&amp;quot;&amp;gt;intentFilter&amp;lt;/code&amp;gt;&lt;br /&gt;
::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 &#039;&#039;language&#039;&#039; und &#039;&#039;fhemId&#039;&#039; anzugeben, oder eine explizite Anweisung zum ein- und Ausschalten (in der Form &amp;lt;code&amp;gt;intentname=true&amp;lt;/code&amp;gt;). 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.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;ignoreKeywords&amp;lt;/code&amp;gt;&lt;br /&gt;
::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 &#039;&#039;room&#039;&#039;-Werte wie &#039;&#039;MQTT&#039;&#039;, &#039;&#039;alexa&#039;&#039;, &#039;&#039;homebridge&#039;&#039; oder &#039;&#039;googleassistant&#039;&#039;. Die hier angegebenen key-value-Paare werden als Negativ-Filter für die angegebenen Werte verwendet (derzeit nur für &#039;&#039;rooms&#039;&#039; und &#039;&#039;group&#039;&#039;). &#039;&#039;value&#039;&#039; wird dabei als (case-insensitive) regex behandelt, verglichen wird auf exakten match (es müssen also ggf. vorne bzw. hinten &#039;&#039;.*&#039;&#039; angefügt werden).&lt;br /&gt;
::Dieses &#039;&#039;&#039;Beispiel&#039;&#039;&#039; filtert daher die o.g. Räume aus und dazu noch die strukturierten Unterräume unterhalb &#039;&#039;Steuerung&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;ignoreKeywords=rooms=mqtt.*|alexa|homebridge|googleassistant|steuerung-.&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt;  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 &#039;&#039;rhasspyGroup&#039;&#039; gesetzt ist.  Hier eine deutschsprachige Vorbelegung als &#039;&#039;&#039;Beispiel&#039;&#039;&#039;: &amp;lt;code&amp;gt;gdt2groups= blind=rollläden,rollladen thermostat=heizkörper light=lichter,leuchten&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Readings / Events==&lt;br /&gt;
;&amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das eingestellte IO-Device&lt;br /&gt;
;&amp;lt;code&amp;gt;intents&amp;lt;/code&amp;gt;&lt;br /&gt;
:Eine Liste der in Rhasspy vorhandenen Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentPayload&amp;lt;/code&amp;gt;&lt;br /&gt;
:Inhalt des letzten Intents der von FHEM empfangen wurde&lt;br /&gt;
;&amp;lt;code&amp;gt;lastIntentTopic&amp;lt;/code&amp;gt;&lt;br /&gt;
:Das MQTT-Topic des letzten Intents&lt;br /&gt;
;&amp;lt;code&amp;gt;listening_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ein Reading für jeden Raum bzw. jede siteId&lt;br /&gt;
:Wechselt auf 1 sobald ein Hotword erkannt wurde und zurück auf 0, sobald die Dialog-Session beendet ist.&lt;br /&gt;
:Kann z.B. verwendet werden, um den Ton eines TVs auszuschalten, während Rhasspy auf ein Kommando hört.&lt;br /&gt;
;&amp;lt;code&amp;gt;mute_roomname&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an, ob ein Raum / eine siteId vom Intent &#039;&#039;SetMute&#039;&#039; stumm geschalten wurde und somit keine Befehle ausführt.&lt;br /&gt;
:Jeweils ein Reading für jede siteId.&lt;br /&gt;
:Default ist 0.&lt;br /&gt;
;&amp;lt;code&amp;gt;responseType&amp;lt;/code&amp;gt;&lt;br /&gt;
:Der Typ der letzten Antwort (text/voice).&lt;br /&gt;
:voiceResponse and textResponse&lt;br /&gt;
:Antwort auf das letzte Sprach-/Text-Kommando.&lt;br /&gt;
;&amp;lt;code&amp;gt;siteIds&amp;lt;/code&amp;gt;&lt;br /&gt;
:Listet alle siteIds auf.&lt;br /&gt;
:Kann mit [[#set-fetchsiteids|fetchSiteIds]] aktualisiert werden.&lt;br /&gt;
;&amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;&lt;br /&gt;
:Zeigt an ob RHASSPY mit Rhasspy verbunden ist&lt;br /&gt;
;&amp;lt;code&amp;gt;training&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort auf einen [[#set-trainrhasspy|trainRhasspy]]-Befehl.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSentences&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
;&amp;lt;code&amp;gt;updateSlots&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letzte zurückgelieferte Antwort nach einem [[#set-update-slots|updateSlots]]-Befehl.&lt;br /&gt;
;&amp;lt;code&amp;gt;hotword&amp;lt;/code&amp;gt;&lt;br /&gt;
:Wenn aktiviert, beinhaltet dieses Reading das letzte verwendete Hotword und von welcher siteId es aufgerufen wurde.&lt;br /&gt;
;&amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;&lt;br /&gt;
:Letze Sprach-Antwort auf einen Sprach-Befehl&lt;br /&gt;
&lt;br /&gt;
=== Benutzerdefinierte Readings ===&lt;br /&gt;
&lt;br /&gt;
There are some readings you may find useful to tweak some aspects of RHASSPY&#039;s logics:&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2room_&amp;lt;/code&amp;gt; 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 &#039;&#039;siteId&#039;&#039;. So werden z.B. alle raumlosen Anweisungen von einem Satelliten names &#039;&#039;schlafzimmer&#039;&#039;, im Raum &#039;&#039;schlafzimmer&#039;&#039; ausgeführt werden (wenn möglich). Die Gruppenfunktion von Rhasspy wird unterstützt, so wird z.B. &#039;&#039;wohnzimmer.vorne&#039;&#039; ebenfalls automatisch dem Raum &#039;&#039;wohnzimmer&#039;&#039; zugeordnet. Über passende Angaben in &#039;&#039;siteId2room-Readings&#039;&#039; kann dieses Verhalten modifiziert werden:  &amp;lt;code&amp;gt;setreading siteId2room_mobile_phone1 wohnzimmer&amp;lt;/code&amp;gt; wird RHASSPY veranlassen, den Satelliten  &#039;&#039;mobile_phone1&#039;&#039; dem Raum &#039;&#039;wohnzimmer&#039;&#039; zuzuweisen. Hierzu ist in &#039;&#039;contrib&#039;&#039; auch eine Hilfsfunktion zu finden, mit der mobilen Satelliten per Sprachbefehl einem neuen Raum zugewiesen werden können.&lt;br /&gt;
*&amp;lt;code&amp;gt;siteId2doubleSpeak_&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
== FHEM-Devices für die Verwendung mit Rhasspy konfigurieren ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der einfachste - und empfohlene - Weg, dies zu erreichen, ist durch Setzen des Attributs &#039;&#039;&#039;&#039;&#039;genericDeviceType&#039;&#039;&#039;&#039;&#039;. Das Modul erkennt dann die möglichen Schalt - und Abfragemöglichkeiten des Gerätes automatisch.&lt;br /&gt;
&lt;br /&gt;
Sollte &#039;&#039;genericDeviceType&#039;&#039; (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 &#039;&#039;prefix&#039;&#039;, das in der DEF des RHASSPY-Moduls gesetzt wurde. Diese Dokumentation verwendet das Prefix &amp;lt;code&amp;gt;rhasspy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sind sowohl &#039;&#039;genericDeviceType&#039;&#039; als auch Spezial-Attribute vorhanden, werden die von gDT gesammelten Möglichkeiten durch die der Spezial-Attribute überschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039;&lt;br /&gt;
*Nach JEDER Änderung an den folgenden Attributen muss ein &amp;lt;code&amp;gt;[[#set-update-devicemap|update devicemap]]&amp;lt;/code&amp;gt; ausgeführt werden. Sonst erfahren weder RHASSPY, noch Rhasspy von der Änderung.&lt;br /&gt;
*RHASSPY sammelt alle Informationen aus diesen Attributen in seinem eigenen Device-HASH. Dieser wird durch das &amp;lt;code&amp;gt;update devicemap&amp;lt;/code&amp;gt;-Kommando aktualisiert und kann mittels &amp;lt;code&amp;gt;[[List|list]]&amp;lt;/code&amp;gt;-Befehl angezeigt werden. Für diesen HASH werden alle Namen und sonstige &amp;quot;Labels&amp;quot; in Kleinbuchstaben umgewandelt. Sollte man Slots händisch befüllen, muss also darauf geachtet werden, dass Rhasspy ebenfalls Werte in Kleinbuchstaben liefert.&lt;br /&gt;
*Die Mindestvoraussetzungen für ein FHEM Device um mit RHASSPY zusammenzuarbeiten sind:&lt;br /&gt;
**Das Device muss von der devspec im Define des RHASSPY-Devices abgedeckt werden&lt;br /&gt;
**Es muss mindestens eines der folgenden Attribute (im Normalfall &#039;&#039;genericDeviceType&#039;&#039;) im Device gesetzt sein.&lt;br /&gt;
*Die Mapping-Logik (für Namen, mögliche Schaltzustände, etc.) ist wie folgt:&lt;br /&gt;
**Sind RHASSPY-spezifische Attribute gesetzt, werden ausschließlich diese verwendet. Natürlich nur für den Zweck des gesetzten Attributs. Ein gesetzter &#039;&#039;rhasspyName&#039;&#039; z.B. wird also nicht verhindern, dass die durch &#039;&#039;genericDeviceType&#039;&#039; ermittelten möglichen Schaltzustände ebenfalls gespeichert werden.&lt;br /&gt;
**Je spezifischer ein Attribut ist, desto eher wird überschreiben, was weniger speziell ist. Ein gesetzter &#039;&#039;alias&#039;&#039; wird also verhindern, dass der (technische) Device-Name verwendet wird. Aber ein gesetztes Attribut &#039;&#039;alexaName&#039;&#039;, &#039;&#039;gassistantName&#039;&#039; oder &#039;&#039;siriName&#039;&#039; wird (auch) den &#039;&#039;alias&#039;&#039; überschreiben. Sind zwei &amp;quot;gleichwertige&amp;quot; Attribute vorhanden (z.B. &#039;&#039;siriName&#039;&#039; und &#039;&#039;alexaName&#039;&#039;), werden beide verwendet.&lt;br /&gt;
*Attribut-Werte werden typischerweise &amp;quot;Zeile für Zeile&amp;quot; gelesen. Wobei gilt, eine Zeile pro Wert/Befehl/Funktionalität. Zeilenumbrüche &#039;&#039;&#039;müssen&#039;&#039;&#039; also an den richtigen Stellen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;genericDeviceType&amp;lt;/code&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Ist dieses Attribut gesetzt &#039;&#039;&#039;und&#039;&#039;&#039; entspricht der Devicename der devspec, wird RHASSPY das Mapping (und andere eventuell schon vorhandene Werte) automatisch ermitteln.&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Werte für das Attribut genericDeviceType unterstützt:&lt;br /&gt;
*switch&lt;br /&gt;
*light&lt;br /&gt;
*thermostat&lt;br /&gt;
*thermometer&lt;br /&gt;
*HumiditySensor&lt;br /&gt;
*blind/blinds/shutter&lt;br /&gt;
*media&lt;br /&gt;
*motion/contact/ContactSensor/lock/presence&lt;br /&gt;
&lt;br /&gt;
Wird &#039;&#039;genericDeviceType&#039;&#039; verwendet, werden unter anderem folgende Informationen gesammelt:&lt;br /&gt;
* der Name (&amp;lt;code&amp;gt;NAME&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;) des Devices&lt;br /&gt;
* der (FHEM-)Raum, in dem sich das Device befindet.&lt;br /&gt;
* die Gruppe, zu der das Device gehört (ggf. unter Beachtung des Schlüssels  &amp;lt;code id=&amp;quot;attr-rhasspytweaks-ignorekeywords&amp;quot;&amp;gt;gdt2groups&amp;lt;/code&amp;gt; aus &#039;&#039;rhasspyTweaks&#039;&#039;)&lt;br /&gt;
* wie Informationen vom Gerät abgefragt werden können&lt;br /&gt;
* wie Werte/Status am Gerät gesetzt werden können&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &#039;&#039;genericDeviceType&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyName&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyName Lampe,Stehlampe,Wunderlicht&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyRoom&amp;lt;/code&amp;gt;===&lt;br /&gt;
Dieses Attribut kann verwendet werden, um Rhasspy mitzuteilen, in welchem physischem (oder logischen) Raum sich das Gerät befindet.&lt;br /&gt;
&lt;br /&gt;
Ist es nicht vorhanden, wird &amp;lt;code&amp;gt;alexaRoom&amp;lt;/code&amp;gt; oder das FHEM-Attribut &amp;lt;room&amp;gt; verwendet. Sind auch diese nicht vergeben, gehört das Gerät zum &amp;quot;Standard-Raum&amp;quot;, der im Define des RHASSPY-Devices angegeben wurde.&lt;br /&gt;
&lt;br /&gt;
Das Attribut ist nützlich, wenn man Sprachbefehle ohne explizite Raumangabe verwenden will. Gibt es z.B. ein Gerät mit dem Namen &#039;&#039;Lampe&#039;&#039; und dessen rhasspyRoom-Attribut ist gleich, wie die &#039;&#039;siteId&#039;&#039; von der aus der Sprachbefehl abgesetzt wird, reicht es zu sagen &amp;quot;Lampe ein&amp;quot;. Der Raum muss also nicht extra dazu gesagt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, mehrere Raum-Namen zu vergeben sofern diese durch ein Komma voneinander getrennt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyRoom livingroom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Wenn die &#039;&#039;siteId&#039;&#039; den Konventionen von Rhasspy zur Gruppierung von siteIds folgt (&#039;&#039;roomname.satellite&#039;&#039;), wird nur &amp;lt;code&amp;gt;roomname&amp;lt;/code&amp;gt; als Raum-Name angenommen. Beachte: Die automatisierte Zuweisung zu einem Raum kann durch &#039;&#039;siteId2room_.*&#039;&#039;-Readings modifiziert werden (s.o.). &lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt;===&lt;br /&gt;
Kommagetrennte Liste an Gruppen, zu denen das Gerät zugehörig ist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; rhasspyGroup Lampen,Beleuchtung Arbeitsfläche,Küchen Beleuchtung&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspyMapping&amp;lt;/code&amp;gt;===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Alles klar&amp;quot;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=off&lt;br /&gt;
GetNumeric:currentVal=pct,type=brightness&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
Status:response=Die Helligkeit in der Küche ist bei [&amp;lt;device&amp;gt;:pct]&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings====&lt;br /&gt;
Manche Intents können FHEM-Kommandos oder -Readings verwenden, um Werte auszulesen oder zu setzen.&lt;br /&gt;
&lt;br /&gt;
Dabei gibt es drei Möglichkeiten, wie diese geschrieben werden können:&lt;br /&gt;
*Direktes Verwenden von SET-Kommando oder Reading des aktuellen Device:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=on or currentReading=temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Umleiten eines Kommando auf ein anderes Device oder Verwenden eines Readings aus einem anderen Gerät:&lt;br /&gt;
:&amp;lt;code&amp;gt;cmd=Otherdevice:on or currentReading=Otherdevice:temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*Perl-Code um einen Befehl auszuführen oder einen Wert zu setzen:&lt;br /&gt;
:Das ermöglicht sehr komplexe Anfragen.&lt;br /&gt;
:Der Code muss in geschwungenen Klammern sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;{currentVal={ReadingsVal($DEVICE,&amp;quot;state&amp;quot;,0)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder&lt;br /&gt;
:&amp;lt;code&amp;gt; cmd={fhem(&amp;quot;set $DEVICE dim $VALUE&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
:$DEVICE ist das aktuelle FHEM-device. Der SetNumeric-Intent kann $VALUE für den Wert verwenden, der gesetzt werden soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;code&amp;gt;rhasspySpecials&amp;lt;/code&amp;gt;===&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
==== group ====&lt;br /&gt;
::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.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
::&amp;lt;code&amp;gt;attr lamp1 rhasspySpecials group:async_delay=100 prio=1 group=lights&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== numericValueMap ====&lt;br /&gt;
::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.&lt;br /&gt;
::&#039;&#039;&#039;Beispiel&#039;&#039;&#039;:&lt;br /&gt;
::&amp;lt;code&amp;gt;attr blind1 rhasspySpecials numericValueMap:10=&#039;Event Slit&#039; 50=&#039;myPosition&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
::führt dazu, dass ein numerischer Wert von 10 (im {Value}-key) das Kommando &amp;lt;code&amp;gt;set blind1 Event Slit&amp;lt;/code&amp;gt; ausführt.&lt;br /&gt;
&lt;br /&gt;
==== venetianBlind ====&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Jalousien|Vertiefung - Jalousien]]&lt;br /&gt;
&lt;br /&gt;
==== colorCommandMap ====&lt;br /&gt;
Sowie **colorTempMap** und **colorForceHue2rgb**&lt;br /&gt;
Siehe [[RHASSPY/Vertiefung#Farben|Vertiefung - Farben]]&lt;br /&gt;
&lt;br /&gt;
==== priority ====&lt;br /&gt;
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]]&lt;br /&gt;
&lt;br /&gt;
==== confirm ====&lt;br /&gt;
Ist eine Möglichkeit, Geräte nur nach Rückfrage und Bestätigung zu schalten (ähnlich wie &#039;&#039;confirmIntents&#039;&#039; in &#039;&#039;rhasspyTweaks&#039;&#039;). Es können entweder einfach nur Intent-Namen angegeben werden, oder Paare von **Intent** und zugehöriger **response**:&lt;br /&gt;
 SetOnOff=&amp;quot;Soll $target wirklich $Value geschaltet werden&amp;quot; SetScene&lt;br /&gt;
&lt;br /&gt;
==== confirmValueMap ====&lt;br /&gt;
Kann spezielle Übersetzungen für $Value enthalten, z.B. für Rollladen-Geräte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;confirm: SetOnOff=&amp;quot;wirklich $Value $target&amp;quot;&lt;br /&gt;
confirmValueMap: on=öffnen off=schließen&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scenes ====&lt;br /&gt;
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 &#039;&#039;none&#039;&#039; löscht die Szene von der Liste der übermittelten Szenen, wird die Kombination &#039;&#039;all=none&#039;&#039; angegeben, wird dieses Gerät insgesamt von der Vorbereitung für den Intent &#039;&#039;SetScene&#039;&#039; ausgeschlossen.&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr lamp1 rhasspySpecials scenes:scene2=&amp;quot;Kino zu zweit&amp;quot; scene3=Musik scene1=none scene4=none&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[RHASSPY/Vertiefung#echte_Szenen|Vertiefung - echte Szenen]]. &lt;br /&gt;
&lt;br /&gt;
=== Veraltete Attribute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyChannels&amp;lt;/code&amp;gt;====&lt;br /&gt;
Das Attribut wird vom Intent &#039;&#039;MediaControls&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
In diesem Attribut muss eine Zeile pro (Medien-)Kanal verwendet werden.&lt;br /&gt;
&lt;br /&gt;
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: &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; rhasspyChannels orf eins=channel 201&lt;br /&gt;
orf zwei=channel 202&lt;br /&gt;
orf drei=channel 203&lt;br /&gt;
netflix=launchApp Netflix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;rhasspyColors&amp;lt;/code&amp;gt;====&lt;br /&gt;
Ä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 &#039;&#039;colorCommandMap&#039;&#039; oder &#039;&#039;colorTempMap&#039;&#039; (siehe &#039;&#039;rhasspySpecials&#039;&#039;) zu konfigurieren!&lt;br /&gt;
&lt;br /&gt;
Um das Mapping zu verwenden, muss zuerst ein User-Attribut am zu steuernden Gerät angelegt werden. Z.B. &amp;lt;code&amp;gt;attr &amp;lt;deviceName&amp;gt; userattr rhasspyChannels:textField-long&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeile pro Farbe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr lamp1 rhasspyColors rot=rgb FF0000&lt;br /&gt;
grün=rgb 008000&lt;br /&gt;
blau=rgb 0000FF&lt;br /&gt;
gelb=rgb FFFF00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intents ==&lt;br /&gt;
Intents werden verwendet um FHEM zu sagen, was es nach einem erhaltenen Sprach-/Textkommand unternehmen soll. Dieses Modul stellt einige Intents bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Wichtig&lt;br /&gt;
:*Bei Tags (&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;, etc.) ist die Schreibweise sehr wichtig! Die sind case-sensitive. Bitte daher genau so schreiben, wie sie in dieser Dokumentation vorkommen.&lt;br /&gt;
:*RHASSPY erstellt bei einem &amp;lt;code&amp;gt;update slots&amp;lt;/code&amp;gt; auch Slots je nach Möglichkeiten der Geräte oder Gruppen. Unterstützt ein Gerät zum Beispiel den Intent &#039;&#039;GetNumeric&#039;&#039;, wird auch ein Slot &amp;lt;code&amp;gt;de.fhem.Device-GetNumeric&amp;lt;/code&amp;gt; erstellt. Ein Gerät, dass ein- und ausgeschalten werden kann, wird im Slot &amp;lt;code&amp;gt;de.fhem.Device-SetOnOff&amp;lt;/code&amp;gt; untergebracht. Ein einzelnes Gerät kann sich auch in mehreren Slots befinden. Um eine möglichst genaue Spracherkennung zu gewährleisten, ist &#039;&#039;&#039;empfohlen&#039;&#039;&#039;, diese &#039;&#039;&#039;spezifischen Slots&#039;&#039;&#039; - statt einfach nur &amp;lt;code&amp;gt;de.fhem.Device&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;de.fhem.Group&amp;lt;/code&amp;gt; - &#039;&#039;&#039;zu verwenden&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOff ===&lt;br /&gt;
Intent um Geräte zwischen zwei Zuständen (ein/aus, auf/zu, start/stop) zu schalten.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;Sir yes Sir&amp;quot;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response=&amp;quot;$DEVICE now [$DEVICE:state]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOn&amp;lt;/code&amp;gt; Befehl um das Gerät einzuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdOff&amp;lt;/code&amp;gt; Befehl um das Gerät auszuschalten. Siehe [[#Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings|Formatierung von Befehlen und Readings innerhalb eines rhasspyMappings]].&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalten das licht ein&lt;br /&gt;
schließe den rollladen im schlafzimmer&lt;br /&gt;
starte die kaffeemaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOff]&lt;br /&gt;
(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}&lt;br /&gt;
(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}&lt;br /&gt;
(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})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetOnOffGroup ===&lt;br /&gt;
Intent um Gruppen von Geräte zwischen zwei Zuständen zu schalten.&lt;br /&gt;
&lt;br /&gt;
Dafür ist ein SetOnOff-Mapping benötigt und alle gewünschten Geräte müssen dasselbe Attribut &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;rhasspyGroup&amp;lt;/code&amp;gt; haben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lampen in der küche aus&lt;br /&gt;
schließe alle rollläden im schlafzimmer&lt;br /&gt;
schalte alle lampen aus&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetOnOffGroup]&lt;br /&gt;
\[(schalt|mach)] (alle | sämtliche ) $de.fhem.Group-SetOnOff{Group} [[in|im|in der|auf der] [( überall:global | $de.fhem.Room ){Room}] ein{Value:on}&lt;br /&gt;
\[(schalt|mach)] (alle | sämtliche ) $de.fhem.Group-SetOnOff{Group} [[in|im|in der|auf der] [( überall:global | $de.fhem.Room ){Room}] aus{Value:off}&lt;br /&gt;
(ö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} )] &lt;br /&gt;
(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} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;Value:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOff ===&lt;br /&gt;
Intent um Geräte für eine bestimmte Zeitspanne in einen bestimmten Zustand zu versetzten.&lt;br /&gt;
&lt;br /&gt;
Device muss ein SetOnOff-Mapping haben und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte das licht für eine minute und dreißig sekunden aus&lt;br /&gt;
schalte die musik im bad bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOff]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimedOnOffGroup ===&lt;br /&gt;
Intent um eine Gruppe von Geräten für eine bestimmte Zeit zu schalten.&lt;br /&gt;
&lt;br /&gt;
Devices müssen ein SetOnOff-Mapping haben, in einer Gruppe sein und die {{Link2CmdRef|Anker=setExtensions|Lang=de|Label=SetExtentions}} unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
schalte alle lichter in der küche für fünfzig sekunden ein&lt;br /&gt;
schalte alle licher bis zwei uhr ein&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimedOnOffGroup]&lt;br /&gt;
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})&lt;br /&gt;
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})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetOnOff ===&lt;br /&gt;
Intent um den aktuellen Zustand eines Gerätes zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetOnOff:currentVal=state,valueOff=closed&lt;br /&gt;
GetOnOff:currentVal=state,valueOn=on&lt;br /&gt;
GetOnOff:currentVal=pct,valueOff=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
Hinweis: nur &amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; ODER &amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; müssen gesetzt werden. Der jeweils andere Wert bekommt den anderen Status.&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading aus dem der aktuelle Status hervorgeht&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOff&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;aus&#039;&#039; beschreibt&lt;br /&gt;
*&amp;lt;code&amp;gt;valueOn&amp;lt;/code&amp;gt; Wert, der den Zustand &#039;&#039;an&#039;&#039; beschreibt&lt;br /&gt;
&lt;br /&gt;
Optionale Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Eine benutzerdefinierte Antwort auf den Befehl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
ist das licht im bad ein&lt;br /&gt;
ist das fenster im wohnzimmer geöffnet&lt;br /&gt;
läuft die waschmaschine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetOnOff]&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (ein|geöffnet){State:on}&lt;br /&gt;
ist $de.fhem.Device-GetOnOff{Device} [$de.fhem.Room{Room}] (aus|geschlossen){State:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zustände &#039;&#039;ein&#039;&#039; und &#039;&#039;aus&#039;&#039; sollten in unterschiedlichen Sentences sein und müssen &amp;lt;code&amp;gt;{State:on}&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{State:off}&amp;lt;/code&amp;gt; beinhalten.&lt;br /&gt;
&lt;br /&gt;
Verpflichtende Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;State:on&amp;lt;/code&amp;gt; und/oder &amp;lt;code&amp;gt;State:off&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetNumeric ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. &lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetNumeric:currentVal=pct,cmd=dim,minVal=0,maxVal=99,step=25,type=brightness&lt;br /&gt;
SetNumeric:currentVal=volume,cmd=volume,minVal=0,maxVal=99,step=10,type=volume&lt;br /&gt;
SetNumeric:currentVal=brightness,cmd=brightness,minVal=0,maxVal=255,map=percent,step=1,type=brightness&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Reading, in dem der aktuelle Wert zu finden ist (wird zwingend benötigt).&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; Das **Set**-Kommando des Geräts, das in Folge des Sprachkommandos ausgeführt werden soll. (Notwendiger Parameter).&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zugelassener Wert, optional.&lt;br /&gt;
*&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt; Schrittweite für relative Änderungen wie &amp;lt;code&amp;gt;mach lauter&amp;lt;/code&amp;gt;. Optional. Default: 10.&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; 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 &amp;quot;stelle das Licht auf 50&amp;quot; dies so verstehen, als wäre die Anweisung &amp;quot;stelle das Licht auf 50 Prozent&amp;quot; gewesen. Das Licht wird daher auf 127 gestellt, und nicht auf (absolut) 50.&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Zur Unterscheidung, falls mehrere SetNumeric-Intents für das Gerät möglich sind. Empfohlener Parameter.&lt;br /&gt;
&lt;br /&gt;
Gut zu wissen:&lt;br /&gt;
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.&lt;br /&gt;
Setzt man also Mappings manuell, ist es ratsam, auch ein **GetOnOff**-Mapping zu setzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zulässige Typen sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Stelle das Licht auf 30 Prozent&lt;br /&gt;
Mach das Radio leiser&lt;br /&gt;
Stell die Temperatur im Wohnzimmer 2 Grad wärmer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
(Beachte: Wenn wie hier im Beispiel reele Zahlen (mit Komma) ermöglicht werden sollen (&amp;quot;acht Komma fünf&amp;quot;), wird ein [[#Custom Converter für reelle Zahlen| Custom Converter für reelle Zahlen]] benötigt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetNumeric]&lt;br /&gt;
den=(den|die|das)&lt;br /&gt;
cmdmulti=(schalte|schalt|mache|mach|stelle|stell)&lt;br /&gt;
rooms=([(im|in dem|auf dem|in der|auf der)] $de.fhem.Room{Room})&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-SetNumeric{Device} auf (0..100){Value!int} [Prozent{Unit:percent}]&lt;br /&gt;
\[&amp;lt;cmdmulti&amp;gt;] [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] $de.fhem.Device-media{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [die Lautstärke [an|am]] [dem|&amp;lt;den&amp;gt;] [$de.fhem.Device-media{Device}] [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!float}] [dezibel{Unit:decibel}|Prozent{Unit:percent}] ( lauter:volUp | leiser:volDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-thermostat{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..10){Value!int}] [Grad{Unit.degree}] ( wärmer:tempUp | kälter:tempDown ){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] $de.fhem.Device-light{Device} [&amp;lt;rooms&amp;gt;] [um] [(0..30 [Komma:. 1..9]){Value!customFloat}] [Prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}&lt;br /&gt;
&amp;lt;cmdmulti&amp;gt; [&amp;lt;den&amp;gt;] ( $de.fhem.Device-light | $de.fhem.Device-media |$de.fhem.Device-blind){Device}  [&amp;lt;rooms&amp;gt;] auf [(0..30 [Komma:. 1..9]){Value!customFloat}]&lt;br /&gt;
( mehr{Change:lightUp} | weniger{Change:lightDown} ) $de.fhem.Device-light{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;]&lt;br /&gt;
( halte | stoppe | stop ) [&amp;lt;den&amp;gt;] $de.fhem.Device-blind{Device} [&amp;lt;de.fhem:SetOnOff.rooms&amp;gt;] [an] {Change:cmdStop}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Derzeit werden folgende Typen für das Feld &amp;lt;code&amp;gt;{Change}&amp;lt;/code&amp;gt; ausgewertet:&lt;br /&gt;
*&amp;lt;code&amp;gt;tempUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;tempDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;volDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;lightUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lightDown&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setUp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;setDown&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notwendig sind:&lt;br /&gt;
*&amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Change&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optionale Tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Unit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SetNumericGroup ===&lt;br /&gt;
Intent, um Lampen zu dimmen, Rollladengeräte zu positionieren, Lautstärken oder Solltemperaturen zu ändern, usw.. Die Funktionsweise entspricht dabei dem des Intents &#039;&#039;SetNumeric&#039;&#039;, wobei eben statt eines einzelnen Devices eben ein oder mehrere Geräte über ihren Gruppennamen angesprochen werden. Statt des optionalen Tags &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; ist daher der Tag &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt; zu übergeben.&lt;br /&gt;
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:&lt;br /&gt;
* Vermeidung von Funk-Überschneidungen (&#039;&#039;Specials&#039;&#039; &#039;&#039;partOf&#039;&#039; und &#039;&#039;async_delay&#039;&#039;)&lt;br /&gt;
* Begrenzung der Gruppenzugehörigkeit durch die Raumzugehörigkeit (und die Aufhebung dieser Beschränkung durch die Übergabe des speziellen Raums &#039;&#039;global&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
=== GetNumeric ===&lt;br /&gt;
Intent, mit dem man Werte erfragen kann, wie z.B. die aktuelle Temperatur, Helligkeit, Lautstärke, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetNumeric:currentVal=temperature,part=1,type=temperature&lt;br /&gt;
GetNumeric:currentVal=pct,map=percent,minVal=0,maxVal=100,type=brightness&lt;br /&gt;
GetNumeric:currentVal=volume,type=volume&lt;br /&gt;
GetNumeric:currentVal=humidity,part=0,type=humidity&lt;br /&gt;
GetNumeric:currentVal=batteryPercent,type=battery&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Argumente:&lt;br /&gt;
*&amp;lt;code&amp;gt;currentVal&amp;lt;/code&amp;gt; Das Reading, das den abzufragenden Wert enthält&lt;br /&gt;
*&amp;lt;code&amp;gt;part&amp;lt;/code&amp;gt; Teile aus currentVal ableiten, indem am Leerzeichen getrennt wird. Ist &#039;&#039;currentVal&#039;&#039; beispielsweise &#039;&#039;23 C&#039;&#039;, entspricht &#039;&#039;part=1&#039;&#039; dem Wert &#039;&#039;23&#039;&#039;&lt;br /&gt;
*&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; Die Funktionswiese entspricht dem &#039;&#039;SetNumeric&#039;&#039; Intent. Wandelt den vorhandenen Wert in eine Prozent-Angabe um.&lt;br /&gt;
*&amp;lt;code&amp;gt;minVal&amp;lt;/code&amp;gt; Niedrigster zulässiger Wert (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;maxVal&amp;lt;/code&amp;gt; Höchster zulässiger Wert  (nur benötigt, wenn &#039;&#039;map&#039;&#039; angegeben ist).&lt;br /&gt;
*&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; Dient der Unterscheidung zwischen mehreren GetNumeric-Anfragemöglichkeiten für dasselbe Gerät (auch relevant für SetNumeric-Anweisungen).&lt;br /&gt;
&lt;br /&gt;
Mögliche Abfragetypen:&lt;br /&gt;
*&amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;battery&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;brightness&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;desired-temp&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;setTarget&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;soilMoisture&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;volume&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;waterLevel&amp;lt;/code&amp;gt;&lt;br /&gt;
Aus dem Abfragetypen ergibt sich die von RHASSPY ausgewählte Antwort.&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
what is the temperature in the living room&lt;br /&gt;
how bright is the floor lamp&lt;br /&gt;
what is the volume of the tv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:GetNumeric]&lt;br /&gt;
#actual temperature&lt;br /&gt;
(what is|how high is) the temperature{Type:temperature} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#desired-temperature&lt;br /&gt;
\[what is the|how high is the] (desired temperature){Type:desired-temp} [$de.fhem.Device-GetNumeric{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&lt;br /&gt;
#volume&lt;br /&gt;
(what is the|how high is the) volume{Type:volume} $de.fhem.Device-GetNumeric{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GetState ===&lt;br /&gt;
Intent to get specific information of a device. The respone can be defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
GetState:response=&amp;quot;Temperature is [$DEVICE:temp] degree at [Thermo:hum] percent humidity&amp;quot;&lt;br /&gt;
GetState:response={my $value=ReadingsVal(&amp;quot;$DEVICE&amp;quot;,&amp;quot;brightness&amp;quot;,&amp;quot;&amp;quot;); return &amp;quot;Brightness is $value&amp;quot;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; Text for the response Rhassyp will give.&lt;br /&gt;
:To use values from FHEM use format [Device:Reading].&lt;br /&gt;
:A comma within the response has to be escaped (\, instead of ,).&lt;br /&gt;
:Or you can use Perl-code enclosed in curley brackets to define the response.&lt;br /&gt;
:Mixing text and Perl-code is not supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
How is the state of the thermostat in the kitchen&lt;br /&gt;
state light in livingroom&lt;br /&gt;
state washer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetState]&lt;br /&gt;
\[how is the] (state) $de.fhem.Device{Device} [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaControls ===&lt;br /&gt;
Intent to control media devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mapping:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdBack=previous,cmdFwd=next&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options:&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPlay&amp;lt;/code&amp;gt; Play command of the device. See chapter Formatting Commands and Readings inside a rhasspyMapping.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdPause&amp;lt;/code&amp;gt; Command to pause the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdStop&amp;lt;/code&amp;gt; Command to stop the device.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdFwd&amp;lt;/code&amp;gt; Command to skip to the next track/channel/etc.&lt;br /&gt;
*&amp;lt;code&amp;gt;cmdBack&amp;lt;/code&amp;gt; Command to skip to the previous track/channel/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note on issuing a voice-command without a room-name:&lt;br /&gt;
As described in the SetNumeric-Intent, it is recommended to define a GetOnOff-Mapping to use the MediaControls-Intent without a room name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
skip to next track on the radio&lt;br /&gt;
pause&lt;br /&gt;
skip video on the dvd player&lt;br /&gt;
stop playback&lt;br /&gt;
next&lt;br /&gt;
previous&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:MediaControls]&lt;br /&gt;
(start){Command:cmdPlay} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(stop){Command:cmdStop} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(pause){Command:cmdPause} the playback [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(next){Command:Fwd} (song|title) [$de.fhem.Device-MediaControls{Device}]&lt;br /&gt;
(previous){Command:Back} (song|title) [$de.fhem.Device-MediaControls{Device}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MediaChannels ===&lt;br /&gt;
Intent to change radio-/tv channels, favorites, playlists, lightscenes, ...&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SWR3=favorite s_w_r_3&lt;br /&gt;
SWR1=favorite s_w_r_1&lt;br /&gt;
ARD=channel 204&lt;br /&gt;
Netflix=launchApp Netflix&lt;br /&gt;
Leselicht=set lightSceneWz scene Leselicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice on using the commands without a device name:&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
play CNN on the radio in my office&lt;br /&gt;
switch to HBO&lt;br /&gt;
change channel on radio to BBC news&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:MediaChannels]&lt;br /&gt;
\[(play|switch to|change to)] ($de.fhem.MediaChannels){Channel} [($de.fhem.Device){Device}] [($de.fhem.Room){Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Channel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColor ===&lt;br /&gt;
Intent to change light colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of the multi-line settings, instead of configuring this intent with the attribute rhasspyMapping, a separate user-attribute [[#rhasspyColors]] is used.&lt;br /&gt;
&lt;br /&gt;
The content of the rhasspyColors uses the following format:&lt;br /&gt;
&amp;lt;code&amp;gt;Colorname=cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Settings:&lt;br /&gt;
*&amp;lt;code&amp;gt;Colorname&amp;lt;/code&amp;gt; The name of the color you want to use in a voice-command&lt;br /&gt;
*&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; The FHEM-command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Mappings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
red=rgb FF0000&lt;br /&gt;
green=rgb 00FF00&lt;br /&gt;
blue=rgb 0000FF&lt;br /&gt;
white=ct 3000&lt;br /&gt;
warm white=ct 2700&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
change light to green&lt;br /&gt;
lightstrip blue&lt;br /&gt;
color the light in the sleeping room white&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[en.fhem:SetColor]&lt;br /&gt;
\[change|color] $de.fhem.Device{Device} [$de.fhem.Room{Room}] $de.fhem.Color{Color}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags:&lt;br /&gt;
*&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional tags&lt;br /&gt;
*&amp;lt;code&amp;gt;Room&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetColorGroup ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetScene ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetTime ===&lt;br /&gt;
Intent um die Uhrzeit zu erfragen.&lt;br /&gt;
&lt;br /&gt;
Es werden keine Konfigurationen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
wie spät ist es?&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetTime]&lt;br /&gt;
wie spät [ist es]&lt;br /&gt;
sag mir die uhrzeit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GetDate ===&lt;br /&gt;
Intent um das aktuelle Datum zu erfragen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine FHEM Einstellungen nötig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Satz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:GetDate]&lt;br /&gt;
welcher tag ist heute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetTimer ===&lt;br /&gt;
Intent to create a timer/countdown/alarm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This intent creates an AT-command in FHEM with the given time and - currently - speaks the sentences &amp;quot;timer expired&amp;quot; when it has expired.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Set timer in bedroom to five minutes&lt;br /&gt;
Set countdown in the kitchen to two hours&lt;br /&gt;
set timer to five and a half hours&lt;br /&gt;
set alarm to 5 o&#039; clock&lt;br /&gt;
set timer to 3 hours and 20 minutes&lt;br /&gt;
set timer to 1 hour, 30 minutes and 15 seconds&lt;br /&gt;
stop the timer in bedroom&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentence:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetTimer]&lt;br /&gt;
labels=(alarm|teetimer|countdown|timer)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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))]&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{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)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (hour)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in) ((the fourth){Min:15}|(half a){Min:30}|(three fourth){Min:45}) (minute)&lt;br /&gt;
\[&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}] (to|in|at) (1..24){Hourabs!int} [(1..60){Min!int}] o clock&lt;br /&gt;
&lt;br /&gt;
(cancel|remove|stop|delete){CancelTimer} [&amp;lt;labels&amp;gt;{Label}] [$de.fhem.Room{Room}]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to set a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;Hour&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Hourabs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Min&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;Sec&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Required tags to cancel a timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rhasspyTweaks for Timer:&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timerlimits|timerLimits]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;[[#attr-rhasspytweaks-timersounds|timerSounds]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
This intents creates a Reading &amp;lt;code&amp;gt;mute_siteId&amp;lt;/code&amp;gt; for every siteId it get&#039;s a voice-command from.&lt;br /&gt;
&lt;br /&gt;
No FHEM-settings needed&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
good night&lt;br /&gt;
be quiet&lt;br /&gt;
good morning&lt;br /&gt;
make noise&lt;br /&gt;
start listening&lt;br /&gt;
stop listening&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:SetMute]&lt;br /&gt;
(good night|be quiet){Value:on}&lt;br /&gt;
(good morning|make noise){Value:off}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Felder &amp;lt;code&amp;gt;{Value:on}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;{Value:off}&amp;lt;/code&amp;gt; sind verpflichtend und &#039;&#039;case sensitive&#039;&#039;, der Wert &#039;&#039;on&#039;&#039; bzw. &#039;&#039;off&#039;&#039; ist in Englisch anzugeben!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ConfirmAction ===&lt;br /&gt;
Dies ist - wie die drei folgenden Intents &#039;&#039;CancelAction&#039;&#039;, &#039;&#039;ChoiceRoom&#039;&#039; und &#039;&#039;ChoiceDevice&#039;&#039; auch - ein Intent, der im Rahmen von Dialogen benötigt wird. Siehe dazu auch [[RHASSPY/Vertiefung#Dialoge|Vertiefung - Dialoge]].&lt;br /&gt;
Rückgabe ist zwingend &amp;lt;code&amp;gt;{Mode}&amp;lt;/code&amp;gt; mit dem Wert &#039;&#039;OK&#039;&#039;, alles andere wird so behandelt, als wäre der Intent &#039;&#039;CancelAction&#039;&#039; ausgewählt worden.&lt;br /&gt;
&lt;br /&gt;
=== CancelAction ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dieser Intent muss nicht zwingend existieren, es kann auch ein unpassender Rückgabewert in &#039;&#039;ConfirmAction&#039;&#039; angegeben werden, um die Abbruch-Routinen für Dialoge zu starten.&lt;br /&gt;
&lt;br /&gt;
=== ChoiceRoom ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl eines Raums.&lt;br /&gt;
&lt;br /&gt;
=== ChoiceDevice ===&lt;br /&gt;
Siehe &#039;&#039;ConfirmAction&#039;&#039;. Dient im Rahmen von Dialogen der Auswahl eines Gerätes.&lt;br /&gt;
&lt;br /&gt;
=== ReSpeak ===&lt;br /&gt;
Wiederholt den letzten Satz, den Rhasspy gesprochen hat. Um genauer zu sein: Spricht den Inhalt des FHEM Readings &amp;lt;code&amp;gt;voiceResponse&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keine Einstellungen in FHEM benötigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beispiel-Sätze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example-Rhasspy-Sentences:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:ReSpeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
kannst du das [bitte] wiederholen&lt;br /&gt;
ich habe dich nicht verstanden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Intents erstellen ==&lt;br /&gt;
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.&lt;br /&gt;
=== Intents in 99_myUtils.pm ===&lt;br /&gt;
&lt;br /&gt;
Hier ein (veraltetes, siehe oben) Beispiel, mit dem die letzte &#039;&#039;voice response&#039;&#039; wiederholt werden kann.&lt;br /&gt;
&lt;br /&gt;
Ergänze deine 99_myUtils.pm mit folgender Funktion:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub Respeak(){&lt;br /&gt;
  #Credits to JensS&lt;br /&gt;
  my $name = &amp;quot;Rhasspy&amp;quot;; #Replace &amp;quot;Rhasspy&amp;quot; with the name of your RHASSPY-Device&lt;br /&gt;
  my $response = ReadingsVal($name,&amp;quot;voiceResponse&amp;quot;,&amp;quot;Ich kann mich leider nicht erinnern&amp;quot;);&lt;br /&gt;
  return $response;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Respeak=Respeak()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:Respeak]&lt;br /&gt;
was hast du gesagt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intents in eigenen Dateien ===&lt;br /&gt;
Beispiele: https://github.com/fhem/fhem-rhasspy/blob/main/FHEM/99_RHASSPY_Utils_Demo.pm&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Raumwechsel ====&lt;br /&gt;
Erforderlichen Code in das Modulverzeichnis holen und laden: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;{ Svn_GetFile(&#039;contrib/RHASSPY/99_RHASSPY_Utils_siteId2room.pm&#039;, &#039;FHEM/99_RHASSPY_Utils_siteId2room.pm&#039;,sub(){ RHASSPY_Utils_siteId2room_Initialize() }) }&amp;lt;/syntaxhighlight&amp;gt;Ergänze im Attribut &#039;&#039;rhasspyIntents&#039;&#039; folgende Zeile (je Intent muss eine eigene Zeile verwendet werden):&lt;br /&gt;
&amp;lt;syntaxhighlight  lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
siteId2room=RHASSPY::siteId2room::siteId2room(NAME,DATA)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ergänze einen neuen Intent in deinen &#039;&#039;sentence.ini&#039;&#039; an der Rhasspy base:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem:siteId2room]&lt;br /&gt;
( Ortswechsel  | begib dich ) ( ins | in den ) $de.fhem.Room{Room}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
===Custom Converter für reelle Zahlen===&lt;br /&gt;
{{Randnotiz|RNTyp=Fehl|RNText=Derzeit funktioniert der Konverter aufgrund eines Fehlers in Rhasspy nicht}}&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
So ein Konverter kann erstellt werden, in dem unter &amp;lt;code&amp;gt;&amp;lt;profile&amp;gt;/converters&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
Z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
touch .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
chmod +x .config/rhasspy/profile/en/converters/customFloat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Beispiel-Code kann danach in die Datei geschrieben werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
# von Rhasspy als JSON übergebene/n Wert/e einlesen&lt;br /&gt;
args = json.load(sys.stdin)&lt;br /&gt;
&lt;br /&gt;
# wenn im deserialisierten JSON nur ein Wert ist, wird der als Ergebnis genommen&lt;br /&gt;
# sind mehrere Werte vorhanden (z.B. 22,.,5), werden die zu einem einzelnen String zusammen gesetzt&lt;br /&gt;
if type(args) == int:&lt;br /&gt;
    num = args&lt;br /&gt;
else:&lt;br /&gt;
    num = &amp;quot;&amp;quot;.join(str(s).strip() for s in args)&lt;br /&gt;
&lt;br /&gt;
# Ergebnis wird an Rhasspy übergeben&lt;br /&gt;
print(num)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart von Rhasspy kann dieser Converter dann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[de.fhem.SetNumeric]&lt;br /&gt;
stelle die heizung auf (0..30 [komma:. 0..99]){Value!customFloat}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rhasspy speaks actual state of device after switching it===&lt;br /&gt;
JensS wrote a short script to let Rhasspy speak the actual state of a FHEM-device after switching it with a voice-command.&lt;br /&gt;
Add the following to your 99_myUtils.pm&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub ResponseOnOff($){&lt;br /&gt;
  my ($dev) = @_;&lt;br /&gt;
  my $room;&lt;br /&gt;
  my $state = lc(ReadingsVal($dev,&amp;quot;state&amp;quot;,&amp;quot;in unknown state&amp;quot;));&lt;br /&gt;
  my $name = (split(/,/,AttrVal($dev,&amp;quot;rhasspyName&amp;quot;,&amp;quot;error&amp;quot;)))[0];&lt;br /&gt;
  if (AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)){$room = &amp;quot; in &amp;quot;.(split(/,/,AttrVal($dev,&amp;quot;rhasspyRoom&amp;quot;,&amp;quot;&amp;quot;)))[0]};&lt;br /&gt;
  $state=~s/.*on/turned on/;&lt;br /&gt;
  $state=~s/.*off/turned off/;&lt;br /&gt;
  return &amp;quot;Ok - &amp;quot;.$name.$room.&amp;quot; is now &amp;quot;.$state&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and add a response to the SetOnOff-Mapping of a device&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
SetOnOff:cmdOn=on,cmdOff=off,response={ResponseOnOff($DEVICE)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/rhasspy/rhasspy Rhasspy auf Github]&lt;br /&gt;
* [https://rhasspy.readthedocs.io/en/latest/ offizielle Rhasspy Doku-Seite]&lt;br /&gt;
* [https://community.rhasspy.org/ Offizielles Rhasspy Forum]&lt;br /&gt;
* [https://github.com/fhem/fhem-rhasspy fhem-rhasspy Modul auf GitHub]&lt;br /&gt;
* [https://github.com/Romkabouter/ESP32-Rhasspy-Satellite ESP32-basierte Hardware als Satelliten]&lt;br /&gt;
* [https://github.com/razzo04/rhasspy-mobile-app App für Android-Satelliten]&lt;br /&gt;
* [https://www.youtube.com/watch?v=sWVl0ZoXZEo Video zu sentences.ini]&lt;br /&gt;
[[Kategorie:Sprachsteuerung]]&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:Rhasspy_fhem.png&amp;diff=37415</id>
		<title>Datei:Rhasspy fhem.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:Rhasspy_fhem.png&amp;diff=37415"/>
		<updated>2022-05-02T10:35:40Z</updated>

		<summary type="html">&lt;p&gt;Beta-User: Schematische Darstellung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
Schematische Darstellung&lt;/div&gt;</summary>
		<author><name>Beta-User</name></author>
	</entry>
</feed>