<?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=Stefan+Hvr</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=Stefan+Hvr"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Stefan_Hvr"/>
	<updated>2026-04-16T14:28:57Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=35078</id>
		<title>Sonos2mqtt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Sonos2mqtt&amp;diff=35078"/>
		<updated>2021-02-25T20:20:36Z</updated>

		<summary type="html">&lt;p&gt;Stefan Hvr: /* Tipps zur Verwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundeinrichtung ==&lt;br /&gt;
Die Grundeinrichtung ist bereits im Artikel [[MQTT2-Module - Praxisbeispiele#Sonos2Mqtt|MQTT2-Module - Praxisbeispiele]] beschrieben. Hier soll es um die praktische Verwendung und Erweiterung gehen. &lt;br /&gt;
&lt;br /&gt;
Für alle Erweiterungen wird versucht vorhandene Devices in FHEM zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Viele Dinge werden derzeit noch entwickelt und können frei gestaltet werden - der Vorteil von generischen FHEM Devices.&lt;br /&gt;
&lt;br /&gt;
== Tipps zur Verwendung ==&lt;br /&gt;
Die automatische Konfiguration setzt den alias entsprechend dem im Sonos vergeben Namen . Die langen MQTT2_RINCON_ Namen sind unhandlich und schlecht lesbar. Man kann Player mit einem devspec ansprechen, das simpelste ist:&lt;br /&gt;
:&amp;lt;code&amp;gt;set alias=Büro play&amp;lt;/code&amp;gt;&lt;br /&gt;
Oder alle Player&lt;br /&gt;
:&amp;lt;code&amp;gt;set model=sonos2mqtt_speaker leaveGroup&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ansicht der Player ==&lt;br /&gt;
Im Template wird nur ein simples [[devStateIcon]] ausgeliefert. Dort kann man sehr viel mehr reinpacken. Hier mal die aktuelle Arbeitsvariante zum nachrüsten in der [[Import von Code Snippets|Raw Definition]]:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr a:model=sonos2mqtt_speaker devStateIcon {\&lt;br /&gt;
my $wpix = &#039;250px&#039;;;\&lt;br /&gt;
my $groupname = ReadingsVal($name,&#039;groupName&#039;,&#039;0&#039;);;\&lt;br /&gt;
my $sgroupname = (split(&#039; &#039;,ReadingsVal($name,&#039;groupName&#039;,&#039;&#039;)))[0];;\&lt;br /&gt;
my $uuidtoname = (devspec2array(&#039;DEF=&#039;.ReadingsVal($name,&#039;coordinatorUuid&#039;,&#039;0&#039;)))[0];;\&lt;br /&gt;
my $vol = ReadingsVal($name,&#039;volume&#039;,&#039;&#039;);;\&lt;br /&gt;
my $img = ReadingsVal($name,&#039;currentTrack_AlbumArtUri&#039;,&#039;&#039;);;\&lt;br /&gt;
my $mystate = $name eq $uuidtoname \&lt;br /&gt;
  ? ReadingsVal($name,&#039;state&#039;,&#039;FEHLER&#039;) : ReadingsVal($uuidtoname,&#039;state&#039;,&#039;&#039;);;\&lt;br /&gt;
my $playpic = $mystate eq &#039;PLAYING&#039;\&lt;br /&gt;
  ? &#039;rc_PAUSE@red&#039;    : $mystate eq &#039;PAUSED_PLAYBACK&#039;\&lt;br /&gt;
  ? &#039;rc_PLAY@green&#039;   : $mystate eq &#039;STOPPED&#039;\&lt;br /&gt;
  ? &#039;rc_PLAY@green&#039;   : $mystate eq &#039;TRANSITIONING&#039;\&lt;br /&gt;
  ? &#039;rc_PLAY@blue&#039;    : $mystate eq &#039;set_next&#039;\&lt;br /&gt;
  ? &#039;rc_NEXT@blue&#039;    : $mystate eq &#039;set_previous&#039;\&lt;br /&gt;
  ? &#039;rc_PREVIOUS@blue&#039;: $mystate eq &#039;set_volumeUp&#039;\&lt;br /&gt;
  ? &#039;rc_VOLUP@blue&#039;   : $mystate eq &#039;set_volumeDown&#039;\&lt;br /&gt;
  ? &#039;rc_VOLDOWN@blue&#039; : $mystate eq &#039;set_mute&#039;\&lt;br /&gt;
  ? &#039;rc_MUTE@blue&#039;    : &#039;rc_PLAY@yellow&#039;;;\&lt;br /&gt;
my $mutecmd = ReadingsVal($name,&#039;mute&#039;,&#039;0&#039;) eq &#039;false&#039;?&#039;true&#039;:&#039;false&#039;;;\&lt;br /&gt;
my $mutepic = $mutecmd eq &#039;on&#039;?&#039;rc_MUTE&#039;:&#039;rc_VOLUP&#039;;;\&lt;br /&gt;
my $show = &#039;FEHLER&#039;;;\&lt;br /&gt;
my $currentTrack_Artist = ReadingsVal($name,&#039;currentTrack_Artist&#039;,&#039;FEHLER&#039;);;\&lt;br /&gt;
my $currentTrack_Title = ReadingsVal($name,&#039;currentTrack_Title&#039;,&#039;FEHLER&#039;);;\&lt;br /&gt;
if ($currentTrack_Title =~ &#039;x-sonosapi-stream:&#039;){$currentTrack_Title=&#039;&#039;};;\&lt;br /&gt;
my $currentTrack = $mystate eq &#039;TRANSITIONING&#039;\&lt;br /&gt;
  ? &#039;Puffern...&#039; : $currentTrack_Artist.&#039; - &#039;.$currentTrack_Title;;\&lt;br /&gt;
my $nextTrack_Artist = ReadingsVal($name,&#039;nextTrack_Artist&#039;,&#039;FEHLER&#039;);;\&lt;br /&gt;
my $nextTrack_Title = ReadingsVal($name,&#039;nextTrack_Title&#039;,&#039;FEHLER&#039;);;\&lt;br /&gt;
my $nextTrack = $nextTrack_Artist.&#039; - &#039;.$nextTrack_Title;;\&lt;br /&gt;
my $previouspic = &#039;rc_PREVIOUS&#039;;;\&lt;br /&gt;
my $nextpic = &#039;rc_NEXT&#039;;;\&lt;br /&gt;
my $voldownpic = &#039;rc_VOLDOWN&#039;;;\&lt;br /&gt;
my $voluppic = &#039;rc_VOLUP&#039;;;\&lt;br /&gt;
my $leavegrouppic = &#039;rc_LEFT&#039;;;\&lt;br /&gt;
my $showlg = ReadingsVal($name,&amp;quot;name&amp;quot;,&amp;quot;0&amp;quot;) ne $groupname ? &amp;quot;&amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name leaveGroup&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($leavegrouppic).&amp;quot;&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;;\&lt;br /&gt;
if (($mystate eq &#039;PLAYING&#039;)\&lt;br /&gt;
  || ($mystate eq &#039;TRANSITIONING&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_next&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_previous&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_volumeUp&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_volumeDown&#039; )\&lt;br /&gt;
  || ($mystate eq &#039;set_mute&#039; )) { \&lt;br /&gt;
    my $shownp = ReadingsVal($name,&#039;name&#039;,&#039;&#039;) eq $sgroupname \&lt;br /&gt;
    ? &amp;quot;&amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name previous&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($previouspic).&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
       &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name next&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($nextpic).&amp;quot;&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;;  \&lt;br /&gt;
    $show = &amp;quot;$showlg &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name toggle&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($playpic).&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
    &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name volumeDown&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($voldownpic).&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
    $shownp\&lt;br /&gt;
    &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name volumeUp&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($voluppic).&amp;quot;&amp;lt;/a&amp;gt;\&lt;br /&gt;
    &amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;&amp;amp;nbsp;;\&lt;br /&gt;
    &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name mute $mutecmd&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($mutepic).&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;quot;;;\&lt;br /&gt;
  \&lt;br /&gt;
    if (ReadingsVal($name,&#039;name&#039;,&#039;&#039;) eq $sgroupname) {\&lt;br /&gt;
      $show = ReadingsVal($name,&#039;currentTrack_TrackUri&#039;,&#039;&#039;) =~ &#039;spdif&#039;\&lt;br /&gt;
      ? &#039;TV&#039;: ReadingsVal($name,&#039;enqueuedMetadata_UpnpClass&#039;,&#039;FEHLER&#039;) ne &#039;object.item.audioItem.audioBroadcast&#039;\&lt;br /&gt;
      ? &amp;quot;$show&amp;lt;marquee style=&#039;width: $wpix&#039;&amp;gt;Aktueller Track: $currentTrack&amp;lt;br&amp;gt;Nächster Track: $nextTrack&amp;lt;/marquee&amp;gt;&amp;quot;\&lt;br /&gt;
      : &amp;quot;$show&amp;lt;marquee style=&#039;width: $wpix&#039;&amp;gt;Radio: $currentTrack&amp;lt;/marquee&amp;gt;&amp;quot;\&lt;br /&gt;
    }\&lt;br /&gt;
    elsif (ReadingsVal($name,&#039;name&#039;,&#039;&#039;) ne $groupname) {\&lt;br /&gt;
      $show = &amp;quot;$show Master: $sgroupname&amp;quot;}\&lt;br /&gt;
    }\&lt;br /&gt;
    else {\&lt;br /&gt;
      $show = $name eq $uuidtoname\&lt;br /&gt;
      ? &amp;quot;$showlg &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name toggle&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($playpic).&amp;quot;&amp;lt;/a&amp;gt;&amp;quot;\&lt;br /&gt;
      : &amp;quot;$showlg &amp;lt;a href=\&amp;quot;/fhem?cmd.dummy=set $name toggle&amp;amp;XHR=1\&amp;quot;&amp;gt;&amp;quot;.FW_makeImage($playpic).&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;Master: $sgroupname&amp;quot;\&lt;br /&gt;
    }\&lt;br /&gt;
  &amp;quot;&amp;lt;div&amp;gt;\&lt;br /&gt;
   &amp;lt;table&amp;gt;\&lt;br /&gt;
     &amp;lt;tr&amp;gt;\&lt;br /&gt;
       &amp;lt;td&amp;gt;&amp;lt;div style=&#039;display: inline-block;; margin-right: 5px;; border: 1px solid lightgray;;\&lt;br /&gt;
              height: 4.00em;; width: 4.00em;; background-image: url($img);; background-size: contain;;&#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;\&lt;br /&gt;
       &amp;lt;td&amp;gt;$show&amp;lt;/td&amp;gt;\&lt;br /&gt;
     &amp;lt;/tr&amp;gt;\&lt;br /&gt;
   &amp;lt;/table&amp;gt;\&lt;br /&gt;
   &amp;lt;/div&amp;gt;&amp;quot;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Befehle nachrüsten ==&lt;br /&gt;
Um Befehle nicht manuell in die setList / readingList Einträge jedes Players machen zu müssen, wird diese Routine verwendet. &lt;br /&gt;
&lt;br /&gt;
Der Code ist für die [[Raw definition]] gedacht. Die ersten drei Zeilen sind jeweils anzupassen! &lt;br /&gt;
&lt;br /&gt;
Hier im Beispiel wird der setter für den folgenden Speak Befehl eingefügt bzw. ersetzt. &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{my @devlist = devspec2array(&#039;MQTT2_RINCON_.*&#039;);;\&lt;br /&gt;
 my $attr = &#039;setList&#039;;;\&lt;br /&gt;
 my $item = q(  speak:textField { my $tts=&amp;quot;SonosTTS&amp;quot;;;my ($cmd,$vol,$text)=split(&#039; &#039;, $EVENT,3);;fhem(&amp;quot;set $tts tts $text;;sleep $tts:playing:.0 ;;set $NAME notify $vol [$tts:httpName]&amp;quot;)});;\&lt;br /&gt;
 my ($first,$sec)=split(&#039; &#039;,$item,2);;\&lt;br /&gt;
 $first=~s/^\s+//;;\&lt;br /&gt;
 foreach (@devlist) {\&lt;br /&gt;
   my @arr = grep {$_ !~ $first} split(&amp;quot;\n&amp;quot;,AttrVal($_,$attr,&#039;&#039;));;\&lt;br /&gt;
   push @arr,$item;;\&lt;br /&gt;
   my $val = join &amp;quot;\n&amp;quot;,@arr;;\&lt;br /&gt;
   $val =~ s/;;/;;;;/g;;\&lt;br /&gt;
   fhem(&amp;quot;attr $_ $attr $val&amp;quot;)}\&lt;br /&gt;
 return &amp;quot;$attr in &amp;quot;.scalar(@devlist).&amp;quot; Definitionen modifiziert&amp;quot;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vorhandenen Zeilen werden ersetzt. Identifiziert wird nur der erste Teil. &lt;br /&gt;
&lt;br /&gt;
== Sprachausgabe ==&lt;br /&gt;
Man hat zwei Möglichkeiten, dies umzusetzen: &lt;br /&gt;
# Text2Speech FHEM intern&lt;br /&gt;
# Mit dem sonos text to speech Server https://svrooij.io/sonos2mqtt/&lt;br /&gt;
&lt;br /&gt;
=== Text2Speech Variante einrichten ===&lt;br /&gt;
Zwei zusätzliche Geräte sind notwendig:&lt;br /&gt;
* [[Text2Speech]] im Servermodus, erzeugt mp3 Dateien im cache Verzeichnis und legt einen Link im Reading httpName ab.&lt;br /&gt;
* Ein HTTP Server stellt die Dateien im gleichen Verzeichnis bereit&lt;br /&gt;
&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Für die vollständige Funktion und Installation von Text2Speech ist die Commandref zu beachten! Für das unten im Beispiel verwendete Feature UseMP3Wrap muss das Tool mp3wrap installiert werden (z.B. &amp;lt;code&amp;gt;apt install mp3wrap&amp;lt;/code&amp;gt;). Dies ist bei längeren Texten und bei der Verwendung von eingebetteten festen Sounds existenziell!&lt;br /&gt;
&lt;br /&gt;
Für die Funktion ist wichtig, dass das Sonos System den Host im Link zur Datei richtig auflösen kann. Deshalb wird der Hostname und Port des Servers im Reading host des TTS Device als Name oder IP Adresse abgelegt! Dies kann entweder mit dem hier gezeigten Befehl oder vollständig manuell erfolgen. Für FHEM innerhalb Docker muss man die Adresse des Docker Host angeben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
defmod SonosTTS Text2Speech none&lt;br /&gt;
attr SonosTTS TTS_UseMP3Wrap 1&lt;br /&gt;
attr SonosTTS TTS_Language Deutsch&lt;br /&gt;
attr SonosTTS userReadings httpName:lastFilename.* {&#039;http://&#039;.ReadingsVal($name,&#039;host&#039;,&#039;set host:port first&#039;).&#039;/fhem/&#039;.ReadingsVal($name,&#039;lastFilename&#039;,&#039;&#039;)}&lt;br /&gt;
attr SonosTTS TTS_CacheFileDir cache&lt;br /&gt;
setreading SonosTTS host {(qx(hostname -s|tr -d &#039;\n&#039;).&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host {((split(&#039; &#039;, qx(hostname -I)))[0].&#039;:&#039;.InternalVal(&#039;WEB&#039;,&#039;PORT&#039;,&#039;8083&#039;))}&lt;br /&gt;
#setreading SonosTTS host &amp;lt;hostname&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Sprachausgabe Befehle im Player Device läuft in 3 Schritten:&lt;br /&gt;
# mit dem TTS Gerät wird die mp3 Datei erzeugt,&lt;br /&gt;
# mit dem sleep wird auf die Fertigstellung gewartet,&lt;br /&gt;
# die Datei wird mit &amp;lt;code&amp;gt;set Player notify volume uri&amp;lt;/code&amp;gt; abgespielt.&lt;br /&gt;
Durch den &amp;quot;sonos2mqtt notify&amp;quot; Befehl wird die laufende Umgebung wiederhergestellt.&lt;br /&gt;
* Wird der Sprachbefehl an den Gruppenmaster gesendet wird die mp3 Datei in der gesamten Gruppe gespielt. &lt;br /&gt;
* Wird der Sprachbefehl an ein Mitglied einer Gruppe gesendet (nicht den Master) wird die Gruppe aufgetrennt und später wieder hergestellt.&lt;br /&gt;
&#039;&#039;Im derzeitigen attrTemplate steht beim [[notify]] Befehl &amp;quot;timeout&amp;quot;:10 drin. Sollte die Sprachausgabe immer mal abbrechen, kann man diesen Wert erhöhen (100).&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
=== sayText Befehl ===&lt;br /&gt;
Dieser Befehl orientiert sich an den FHEM [[DevelopmentGuidelinesAV|DevelopmentGuidelines]] und sammelt &amp;quot;gleichzeitig&amp;quot; eintreffende Sprachnachrichten, damit nichts verloren geht. Informationen im Forum dazu in {{Link2Forum|Topic=111711|Message=1100112|LinkText=diesem Beitrag}}.&lt;br /&gt;
&lt;br /&gt;
Die Lautstärke wird separat in SonosTTS gesetzt: &amp;lt;code&amp;gt;setreading SonosTTS vol 15&amp;lt;/code&amp;gt;,  ebenso die Sprache (einmalig bei der Einrichtung oder bei Bedarf zwischendurch) &amp;lt;code&amp;gt;attr SonosTTS TTS_Language Deutsch&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Hinweis: Der Befehl &amp;lt;code&amp;gt;set SonosTTS volume xx&amp;lt;/code&amp;gt; hat im Servermodus des Devices keine Wirkung!&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Der Befehl selbst ist eine Erweiterung der setList im MQTT2 Player Device und sieht wie folgt aus. Man kann den Befehl einfach bei allen Playern mit dem obigen [[Sonos2mqtt#Befehle nachr.C3.BCsten|Codeschnipsel]] nachrüsten ( ; vorher verdoppeln). &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sayText:textField { my $tts=ReadingsVal(&#039;SonosBridge&#039;,&#039;tts&#039;,&#039;SonosTTS&#039;);my ($cmd,$text)=split(&#039; &#039;, $EVENT,2);fhem(&amp;quot;setreading $tts text &amp;quot;.ReadingsVal($tts,&#039;text&#039;,&#039; &#039;).&#039; &#039;.$text.&amp;quot;;sleep 0.4 tts;set $tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speak Befehl ===&lt;br /&gt;
Verwendet wird ein Befehl ähnlich wie in der Sonos Umgebung:&lt;br /&gt;
:&amp;lt;code&amp;gt;set Player speak &amp;lt;volume&amp;gt; text&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Erweiterung der setList im MQTT2 Player Device sieht wie folgt aus. Man kann den Befehl einfach bei allen Playern mit dem obigen [[Sonos2mqtt#Befehle nachr.C3.BCsten|Codeschnipsel]] nachrüsten.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
speak:textField { my $tts=&amp;quot;SonosTTS&amp;quot;;my ($cmd,$vol,$text)=split(&#039; &#039;, $EVENT,3);fhem(&amp;quot;set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Will man keine laufenden Sendung unterbrechen sondern einfach eine Ansage machen und danach etwas starten, kann man so vorgehen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set SonosTTS tts Hier steht die Ansage;sleep SonosTTS:playing:.0 ; set alias=PlayerAlias playUri [SonosTTS:httpName]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Spiele feste Sounds ====&lt;br /&gt;
Generell kann man feste mp3 Dateien (Klingeltöne, Klänge usw.) auch im cache Verzeichnis ablegen und direkt mit dem Link starten. &lt;br /&gt;
&lt;br /&gt;
Es gibt zahlreiche Soundquellen im Internet, ist der gewünschte Sound dabei, kann man ihn innerhalb FHEM herunterladen und an Ort und Stelle platzieren. (Beispiel ohne und mit Umbennung)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;wget -qP ./cache https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;quot;wget -qO ./cache/KlingelTon.mp3 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Vergewissern ob der gewünschte Sound auch da ist: {qx(ls -lha ./cache)}&lt;br /&gt;
&lt;br /&gt;
Mit set magic kann man dabei einfach Teile aus anderen Readings holen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro notify 25 {(&#039;http://[SonosTTS:host]/fhem/cache/KlingelTon.mp3&#039;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann auch den setter im Gerät erweitern:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
playSound:textField {my $tts=&amp;quot;SonosTTS&amp;quot;;my ($cmd,$vol,$file)=split(&#039; &#039;, $EVENT,3);$file=($file=~m/.*\.mp3$/)?&amp;quot;$file&amp;quot;:&amp;quot;$file.mp3&amp;quot;;fhem(&amp;quot;set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit sind dann dieser Syntax möglich:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon.mp3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder ohne Dateiendung (wird auf mp3 gesetzt)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Büro playSound 40 KlingelTon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SonosBridge aufrüsten ===&lt;br /&gt;
Einige zentrale Dinge sind im SonosBridge Device gut aufgehoben. Seit der Version 3.1.0-beta.1 ist es möglich, die Sonos Umgebung zu aktualisieren ohne sonos2mqtt neu starten zu müssen.&lt;br /&gt;
&lt;br /&gt;
Die setList stattet die Bridge mit der Möglichkeit aus, alle Player zu stoppen und die Umgebung neu einzulesen (das ist nützlich wenn man Player on/off betreibt).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
PauseAll:noArg sonos/cmd/pauseall&lt;br /&gt;
CheckSubscription:noArg sonos/cmd/check-subscriptions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Favoritenliste kann einmal zentral in der SonosBridge abgelegt werden. Dazu müssen wird dort die readingList ergänzen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Für eine einfache Abholung der aktuellen Favoriten kann der SonosBridge eine getList spendiert werden, man muss dazu einen Player eintragen (RINCON_).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Favorites:noArg Favorites sonos/RINCON_XXXXXXXXXXXXX/control {&amp;quot;command&amp;quot;: &amp;quot;adv-command&amp;quot;,&amp;quot;input&amp;quot;: {&amp;quot;cmd&amp;quot;: &amp;quot;GetFavorites&amp;quot;,&amp;quot;reply&amp;quot;: &amp;quot;Favorites&amp;quot;}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ToDo: Code straffen und setList mit einbauen.&lt;br /&gt;
&lt;br /&gt;
Wer das nicht per Hand machen will hier zwei Codeblöcke für die Raw Definition:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{my @devlist = devspec2array(&#039;model=sonos2mqtt_bridge&#039;);;\&lt;br /&gt;
 my $attr = &#039;readingList&#039;;;\&lt;br /&gt;
 my $item = q(  sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites);;\&lt;br /&gt;
 my ($first,$sec)=split(&#039; &#039;,$item,2);;\&lt;br /&gt;
 $first=~s/^\s+//;;\&lt;br /&gt;
 foreach (@devlist) {\&lt;br /&gt;
   my @arr = grep {$_ !~ $first} split(&amp;quot;\n&amp;quot;,AttrVal($_,$attr,&#039;&#039;));;\&lt;br /&gt;
   push @arr,$item;;\&lt;br /&gt;
   my $val = join &amp;quot;\n&amp;quot;,@arr;;\&lt;br /&gt;
   $val =~ s/;;/;;;;/g;;\&lt;br /&gt;
   fhem(&amp;quot;attr $_ $attr $val&amp;quot;)}\&lt;br /&gt;
 return &amp;quot;$attr in &amp;quot;.scalar(@devlist).&amp;quot; Definitionen modifiziert&amp;quot;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Achtung: dieser Code schreibt eine neue getList in die SonosBridge, zum Ergänzen müsste der Code analog der bisherigen Beispiele verändert werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{my @devlist2 = devspec2array(&#039;MQTT2_RINCON_.*&#039;);;\&lt;br /&gt;
 my @arr2;;\&lt;br /&gt;
 foreach (@devlist2) {push @arr2,InternalVal($_,&#039;DEF&#039;,&#039;&#039;)};;\&lt;br /&gt;
 my $item= q(Favorites:noArg Favorites sonos/).$arr2[int(rand(@arr2))].q(/control  {&amp;quot;command&amp;quot;: &amp;quot;adv-command&amp;quot;,&amp;quot;input&amp;quot;: {&amp;quot;cmd&amp;quot;: &amp;quot;GetFavorites&amp;quot;,&amp;quot;reply&amp;quot;: &amp;quot;Favorites&amp;quot;}});;\&lt;br /&gt;
 fhem(&amp;quot;attr model=sonos2mqtt_bridge getList $item&amp;quot;)\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Player mit Favoritenliste ausstatten ===&lt;br /&gt;
Wenn nicht schon geschehen muss man jetzt die Favoriten zum ersten Mal einlesen: get SonosBridge Favorites&lt;br /&gt;
&lt;br /&gt;
Nachdem die SonosBridge &amp;quot;aufgerüstet&amp;quot; ist kann man allen Playern die Favoritenliste zum Auswählen eintragen. Dieser Code ist etwas umfangreicher und wieder ein &amp;quot;Script&amp;quot; für die Raw Def.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{use JSON;;use HTML::Entities;;use Encode qw(encode decode);;\&lt;br /&gt;
 my $enc = &#039;UTF8&#039;;;\&lt;br /&gt;
 my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;\&lt;br /&gt;
 my $read = &#039;Favorites&#039;;;\&lt;br /&gt;
 my $decoded = decode_json(ReadingsVal($dev,$read,&#039;&#039;));;\&lt;br /&gt;
 my @arr  = @{$decoded-&amp;gt;{&#039;Result&#039;}};;\&lt;br /&gt;
 my @out;;\&lt;br /&gt;
 foreach (@arr) {\&lt;br /&gt;
   my $dec=encode($enc, decode_entities($_-&amp;gt;{&#039;Title&#039;}));;\&lt;br /&gt;
   $dec =~ s/\s/./g;;\&lt;br /&gt;
   push @out,$dec}\&lt;br /&gt;
 my $favliste= join &#039;,&#039;, sort @out;;\&lt;br /&gt;
 \&lt;br /&gt;
 my @devlist = devspec2array(&#039;MQTT2_RINCON_.*&#039;);;\&lt;br /&gt;
 my $attr = &#039;setList&#039;;;\&lt;br /&gt;
 my $item = &#039;  playFav:&#039;.$favliste.q( {use JSON;;use HTML::Entities;;use Encode qw(encode decode);;my $enc = &#039;UTF8&#039;;;my $uri=&#039;&#039;;;my $search=(split(&#039; &#039;, $EVENT,2))[1];;$search=~s/[\/()]/./g;;my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $read=&#039;Favorites&#039;;;my $decoded = decode_json(ReadingsVal($dev,$read,&#039;&#039;));;my @arr=@{$decoded-&amp;gt;{&#039;Result&#039;}};;foreach (@arr) {if (encode($enc, decode_entities($_-&amp;gt;{&#039;Title&#039;}))=~/$search/i){$uri = $_-&amp;gt;{&#039;TrackUri&#039;} }};;fhem(&amp;quot;set $NAME playUri $uri&amp;quot;) if ($uri ne &#039;&#039;)});;\&lt;br /&gt;
 my ($first,$sec)=split(&#039;:&#039;,$item,2);;\&lt;br /&gt;
  $first=~s/^\s+//;;\&lt;br /&gt;
 foreach (@devlist) {\&lt;br /&gt;
   my @arr = grep {$_ !~ $first} split(&amp;quot;\n&amp;quot;,AttrVal($_,$attr,&#039;&#039;));;\&lt;br /&gt;
   push @arr,$item;;\&lt;br /&gt;
   my $val = join &amp;quot;\n&amp;quot;,@arr;;\&lt;br /&gt;
   $val =~ s/;;/;;;;/g;;\&lt;br /&gt;
   fhem(&amp;quot;attr $_ $attr $val&amp;quot;)}\&lt;br /&gt;
 return &amp;quot;$attr in &amp;quot;.scalar(@devlist).&amp;quot; Definitionen modifiziert&amp;quot;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der erste Teil des Codes erzeugt aus den Favoriten ein Komma separierte, sortierte Liste der Titel und ersetzt die Leerzeichen durch Punkte. Damit eignet sich diese Liste für die Auswahlbox. Dies wird als Ergänzung der setList im zweiten Teil des Codes erzeugt und bei allen Playern eingetragen.&lt;br /&gt;
&lt;br /&gt;
Man kann den playFav Befehl auch im set Befehl mit einem Teil des Favoriten Namen verwenden. Enthält die Favoritenliste z.B. Radio Leipzig würde der auch mit diesem Befehl angesteuert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Bad playFav leipzig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Radioliste durchtasten ===&lt;br /&gt;
Will man eine Liste von bestimmten Radiostation mit einem Taster &amp;quot;durchtasten&amp;quot; kann man das wie folgt tun:&lt;br /&gt;
&lt;br /&gt;
Eigene Radio Liste in ein Reading schreiben (Die Namen müssen zumindest in Teilen mit den Favoriten Titeln übereinstimmen)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
setreading model=sonos2mqtt_bridge favRadios Deutschlandfunk Kultur,Radio Leipzig,Radio Station 3 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Befehl zum weiterschalten. Jedesmal wenn dieser Befehl ausgeführt wird, wird der nächste Favorit gestartet.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
set alias=Arbeitszimmer playFav {(my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;Each($dev,ReadingsVal($dev,&#039;favRadios&#039;,&#039;&#039;)))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man vor dem Radiostart noch die Ansage des Senders haben, geht das zwar auch mit dem speak Befehl, die direkte Ausgabe ohne Restore der Umgebung (sonos2mqtt notify) ist aber effektiver.&lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen wir die Events einschränken: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr model=sonos2mqtt_speaker event-on-change-reading .*&lt;br /&gt;
{my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];;my $r=Each($dev,ReadingsVal($dev,&#039;favRadios&#039;,&#039;&#039;));;my $play = (devspec2array(&#039;alias=Büro&#039;))[0];;my $tts=&amp;quot;SonosTTS&amp;quot;;;fhem(&amp;quot;set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $play playUri [$tts:httpName];;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED;;set $play playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Kurze Erklärung zum Code &lt;br /&gt;
* ermittelt den nächsten Radiosender in der Liste,&lt;br /&gt;
* erzeugt die Ansage &amp;quot;Es folgt SenderXY&amp;quot;,&lt;br /&gt;
* wenn die mp3 Datei fertig erzeugt ist wird sie mit dem Befehl playUri an den Player gesendet,&lt;br /&gt;
* es wird eine Eventfolge abgewartet -&amp;gt; play / PLAYING / STOPPED,&lt;br /&gt;
* danach wird der Radiosender gestartet.&lt;br /&gt;
Der Code ist so einfach und relativ &amp;quot;steif&amp;quot; für die Kommandozeile. Man kann das auch in einen Setter packen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
toggleRadio:noArg {my $dev = (devspec2array(&#039;model=sonos2mqtt_bridge&#039;))[0];my $r=Each($dev,ReadingsVal($dev,&#039;favRadios&#039;,&#039;&#039;));my $tts=&amp;quot;SonosTTS&amp;quot;;fhem(&amp;quot;set $tts tts Es folgt $r;sleep $tts:playing:.0;set $NAME playUri [$tts:httpName];sleep $NAME:play;sleep $NAME:PLAYING;sleep $NAME:STOPPED;set $NAME playFav $r&amp;quot;)}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dokumentationen und weitere Entwicklungen ==&lt;br /&gt;
ToDo&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MQTT]]&lt;/div&gt;</summary>
		<author><name>Stefan Hvr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Text2Speech&amp;diff=35077</id>
		<title>Text2Speech</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Text2Speech&amp;diff=35077"/>
		<updated>2021-02-25T19:31:40Z</updated>

		<summary type="html">&lt;p&gt;Stefan Hvr: /* Text2Speech Sprachengines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Sprachausgabe über FHEM&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModTechName=98_Text2Speech.pm&lt;br /&gt;
|ModOwner=tobiasfaust ({{Link2FU|118|Forum}} / [[Benutzer_Diskussion:Tobias.faust|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Text2Speech]] ermöglicht es, eine Sprachausgabe über FHEM zu realisieren. Das Modul ist Client-Server-fähig. Einzelne Sprachbausteine werden zwischengespeichert damit diese bei erneutem Gebrauch nicht noch einmal nachgeladen werden müssen um somit einen flüssigen Spachfluss zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Text2Speech Sprachengines==&lt;br /&gt;
Die Default Sprachengine ist Google mit deutscher, weiblicher Stimme.&lt;br /&gt;
&lt;br /&gt;
Die Sprachengines Amazon Polly, Google und VoiceRSS sind OnlineSysteme die eine Internetverbindung voraussetzen. Die Sprachengines ESpeak und SVOX-Pico sind lokal installierte Sprachengines die keine Internetverbindung benötigen.&lt;br /&gt;
&lt;br /&gt;
Als Empfehlung kann kann folgende Liste mit absteigender Sprachqualität eine Hilfestellung bieten:&lt;br /&gt;
* Amazon Polly&lt;br /&gt;
* Google&lt;br /&gt;
* VoiceRSS/ESpeak/SVOX-Pico&lt;br /&gt;
&lt;br /&gt;
Die Sprachengine &amp;quot;Amazon Polly&amp;quot; ist kostenpflichtig. In den ersten 12 Monaten sind 5Mio Zeichen kostenlos, danach kosten 1Mio Zeichen 4US$ (Stand Februar 2021): [https://aws.amazon.com/de/polly/pricing/ Amazon Polly Pricing]&lt;br /&gt;
&lt;br /&gt;
==Definition Lokale Architektur==&lt;br /&gt;
===Abhängigkeiten Installationspakete===&lt;br /&gt;
Egal welche Sprachengine verwendet werden soll müssen folgende Pakete installiert sein:&lt;br /&gt;
* IO::File&lt;br /&gt;
* Digest::MD5&lt;br /&gt;
* URI::Escape&lt;br /&gt;
* Text::Iconv&lt;br /&gt;
* Encode::Guess&lt;br /&gt;
* MP3::Info&lt;br /&gt;
* mp3wrap (Empfohlen, aber optional, wird über das Attribut TTS_UseMp3Wrap aktiviert)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libdigest-perl-md5-perl libany-uri-escape-perl libtext-iconv-perl libencode-perl libmp3-info-perl mp3wrap&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===zusätzliche Abhängigkeiten von Espeak===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt-get install lame espeak&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===zusätzliche Abhängigkeiten von SVOX-pico===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt-get install lame libttspico-utils&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für ARM/Raspbian sind die &amp;lt;code&amp;gt;libttspico-utils&amp;lt;/code&amp;gt; leider nicht verfügbar, deswegen müsste man diese selbst kompilieren oder das vorkompilierte Paket aus [http://www.robotnet.de/2014/03/20/sprich-freund-und-tritt-ein-sprachausgabe-fur-den-rasberry-pi/ dieser Anleitung] verwenden, folgend in aller Kürze:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libpopt-dev&lt;br /&gt;
cd /tmp&lt;br /&gt;
wget http://www.dr-bischoff.de/raspi/pico2wave.deb&lt;br /&gt;
sudo dpkg --install pico2wave.deb&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===zusätzliche Abhängigkeiten von Amazon Polly===&lt;br /&gt;
* Paws::Polly&lt;br /&gt;
* File::HomeDir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install libfile-homedir-perl&lt;br /&gt;
sudo cpan Paws&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zugangsdaten zum eigenen AWS Konto müssen unter ~/.aws/credentials liegen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[default]&lt;br /&gt;
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxx&lt;br /&gt;
aws_access_key_id = xxxxxxxxxxxxxxx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zugangsdaten erhält man in dem man im AWS Konto eine IAM Gruppe mit einem PollyRead Profile erstellt und diese Gruppe eine neuen User zuweist.&lt;br /&gt;
Nach Anlegen des Users erhält man einmalig(!) das Schlüsselpaar.&lt;br /&gt;
&lt;br /&gt;
==allgemeine Konfiguration==&lt;br /&gt;
Relevant für die korrekte SprachEngine sind die folgenden Attribute:&lt;br /&gt;
* TTS_Ressource&lt;br /&gt;
* TTS_Language &#039;&#039;&#039;oder&#039;&#039;&#039; TTS_Language_Custom&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;aplay -l&amp;lt;/code&amp;gt; kann man eine Liste der möglichen Audio Ausgabedevices erhalten. Von dem gewünschten Ausgabedevice ermittelt man nun die Kartennummer und das Subdevice. &lt;br /&gt;
&lt;br /&gt;
Neben dem Audio Equipment gibt es zwei Voraussetzungen im System: &lt;br /&gt;
* Der User fhem muss Berechtigung haben Sound auszugeben und &lt;br /&gt;
* es muss ein Player installiert sein. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo usermod -aG audio fhem&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nach dieser Änderung muss sich der Benutzer neu anmelden! Ein Neustart von FHEM oder dem System ist notwendig!&lt;br /&gt;
&lt;br /&gt;
Test2Speech wurde ursprünglich für mplayer entwickelt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt-get install mplayer&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Damit mplayer ohne sudo aufgerufen wird muss das Attribute &amp;lt;code&amp;gt;TTS_MplayerCall &amp;lt;/code&amp;gt; gesetzt werden. Wird das weggelassen muss [[FHEM_mit_sudo|fhem sudo Berechtigung]] bekommen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define MyTTS Text2Speech hw=0.0&lt;br /&gt;
attr MyTTS TTS_MplayerCall /usr/bin/mplayer&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Programm mplayer hat auf einigen Systemen sehr große Verzögerungen beim Start, als &#039;&#039;&#039;Alternative&#039;&#039;&#039; ist z.B. play verwendbar&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt-get install sox libsox-fmt-all&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Definition muss in der Bezeichnung das Audiogerätes und im Attribute &amp;lt;code&amp;gt;TTS_MplayerCall &amp;lt;/code&amp;gt; so aussehen (Mindestens Version 19378 2019-05-12 erforderlich).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define MyTTS Text2Speech hw:0,0&lt;br /&gt;
attr MyTTS TTS_MplayerCall AUDIODEV={device} /usr/bin/play -q -v $(({volume}*{volumeadjust}/10000)).$(({volume}*{volumeadjust}%10000)) {file}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei wiederholten Sprachbausteinen wird durch die Verwendung von MP3Wrap eine deutlich flüssigere Sprachausgabe erreicht. Für die Verwendung von Kombinationen aus fertigen mp3 Files und Texten in der Art &amp;quot;Text:bing.mp3:Text&amp;quot; ist dies zwingend notwendig. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt-get install mp3wrap&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Ergänzung die Definition ein Attribute &amp;lt;code&amp;gt;TTS_UseMP3Wrap&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;attr MyTTS TTS_UseMP3Wrap 1&lt;br /&gt;
attr MyTTS verbose 4&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein erster Test kann wie folgt durchgeführt werden (als Einzeiler, ohne Zeilenumbruch einzugeben):&lt;br /&gt;
:&amp;lt;code&amp;gt; set MyTTS tts Das ist ein Test. Jetzt prüfen wir, ob wir etwas aus dem angeschlossenen Lautsprecher hören. Beim ersten Mal haben wir allerdings noch Sprechpausen. Spätestens beim zweiten Durchlauf ist der Textfluss flüssiger.&amp;lt;/code&amp;gt;&lt;br /&gt;
Hört man etwas aus dem Lautsprecher, so führen wir das Kommando ein zweites Mal aus. Jetzt sollte es sich besser anhören. Bleiben die Lautsprecher stumm, so ist das FHEM-Log zu kontrollieren. Gegebenenfalls ist das [[verbose]]-Level auf 5 zu stellen.&lt;br /&gt;
&lt;br /&gt;
War der Test erfolgreich, kann das verbose-Attribut wieder gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
==Definition Client-Server Architektur==&lt;br /&gt;
Es gibt Installationen, bei denen der FHEM-Server z.B. im Keller steht, die Sprachausgabe soll aber räumlich entfernt stattfinden, z.B. im Wohnzimmer. Hierzu ist am Zielort eine FHEM-Instanz anzulegen, z.B. über einen [[Raspberry Pi]], IP: 192.168.178.10. &lt;br /&gt;
Auf dem FHEM-Server ist Text2Speech als Remote zu definieren:&lt;br /&gt;
 define MyTTS Text2Speech 192.168.178.10:7072 &amp;lt;Passwort&amp;gt;;&lt;br /&gt;
 attr Text2Speech room Text2Speech;&lt;br /&gt;
&lt;br /&gt;
Am Zielort ist Text2Speech auf dem Raspi wie folgt zu definieren:&lt;br /&gt;
 define MyTTS Text2Speech hw=0.0;&lt;br /&gt;
 attr MyTTS room Text2Speech;&lt;br /&gt;
 attr MyTTS TTS_UseMP3Wrap 1;&lt;br /&gt;
 attr MyTTS verbose 4;&lt;br /&gt;
Der Passwort Zugang ist entsprechend der {{Link2CmdRef|Anker=allowed}} zu definieren. &lt;br /&gt;
Bitte die Installation von Mplayer und Mp3Wrap nicht vergessen!&lt;br /&gt;
Danach der Test wie oben angegeben.&lt;br /&gt;
&lt;br /&gt;
==Sprachausgabe per Bluetooth-Lautsprecher unter Raspbian Jessie==&lt;br /&gt;
Für die Sprachausgabe über Bluetooth bieten sich verschiedene Lautsprecher an. Wichtig ist jedoch, dass diese entweder gar nicht in einen Standby Modus wechseln oder aber über Bluetooth aus dem Standby aufgeweckt werden können. Folgende Lautsprecher sollen laut Internetrecherche funktionieren:&lt;br /&gt;
&lt;br /&gt;
* Creative D80/D100/D200&lt;br /&gt;
* Sony Soundbar HT-XT3&lt;br /&gt;
* Panasonic SC-ALL6EG-W / SC-NE1&lt;br /&gt;
* Bose Soundtouch 10&lt;br /&gt;
* Bose Soundlink Mini II&lt;br /&gt;
* B&amp;amp;O Beoplay S3&lt;br /&gt;
* JBL Charge 2+/3&lt;br /&gt;
* LG Art 51&lt;br /&gt;
* UE Roll&lt;br /&gt;
* Energy PowerBar Elite&lt;br /&gt;
* Teufel Cinebar 11&lt;br /&gt;
&lt;br /&gt;
Die folgenden Schritte müssen nacheinander durchgeführt werden, um auf einem aktuellen Jessie System Audio Inhalte über Bluetooth zu streamen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; USB-Bluetooth-Stick verbinden&lt;br /&gt;
und per &#039;&#039;lsusb&#039;&#039; prüfen, ob der Stick erkannt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; System aktualisieren und notwendige Pakete installieren&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get upgrade&lt;br /&gt;
 sudo apt-get install alsa-utils bluez bluez-tools pulseaudio-module-bluetooth python-gobject python-gobject-2&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; Benutzer pi zur PulseAudio Gruppe hinzufügen&lt;br /&gt;
 sudo usermod -a -G lp pi&lt;br /&gt;
 sudo usermod -a -G pulse-access,audio root&lt;br /&gt;
 sudo adduser pi pulse-access&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; Datei daemon.conf von PulseAudio anpassen&lt;br /&gt;
 sudo nano /etc/pulse/daemon.conf&lt;br /&gt;
Nach folgender Zeile suchen&lt;br /&gt;
 ; resample-method = speex-float-1&lt;br /&gt;
und wie folgt erweitern&lt;br /&gt;
 ; resample-method = speex-float-1&lt;br /&gt;
 resample-method = trivial&lt;br /&gt;
und&lt;br /&gt;
 ; system-instance = no&lt;br /&gt;
 system-instance = yes&lt;br /&gt;
speichern und schliessen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; In PulseAudio müssen jetzt zusätzliche Module geladen werden&lt;br /&gt;
 sudo nano /etc/pulse/system.pa&lt;br /&gt;
am Ende der Datei folgendes hinzufügen&lt;br /&gt;
 .ifexists module-bluetooth-policy.so&lt;br /&gt;
 load-module module-bluetooth-policy&lt;br /&gt;
 .endif&lt;br /&gt;
 .ifexists module-bluetooth-discover.so&lt;br /&gt;
 load-module module-bluetooth-discover&lt;br /&gt;
 .endif&lt;br /&gt;
speichern und schliessen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.&#039;&#039;&#039; Jetzt müssen wir dafür sorgen, dass PulseAudio automatisch geladen wird&lt;br /&gt;
 sudo nano /etc/systemd/system/pulseaudio.service&lt;br /&gt;
und folgenden Inhalt einfügen&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=PulseAudio Sound System&lt;br /&gt;
 Before=sound.target&lt;br /&gt;
 [Service]&lt;br /&gt;
 BusName=org.pulseaudio.Server&lt;br /&gt;
 ExecStart=/usr/bin/pulseaudio&lt;br /&gt;
 Restart=always&lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
speichern und schliessen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.&#039;&#039;&#039; Danach müssen wir PulseAudio neu starten&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl enable pulseaudio.service&lt;br /&gt;
 sudo systemctl start pulseaudio.service&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.&#039;&#039;&#039; Prüfen ob PulseAudio läuft&lt;br /&gt;
 systemctl status pulseaudio&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9.&#039;&#039;&#039; Jetzt den Audio Output einstellen: X entweder mit 0 (auto), 1 (3,5mm Klinke) oder 2 (HDMI) ersetzen.&lt;br /&gt;
 sudo amixer cset numid=3 X&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.&#039;&#039;&#039; Die Lautstärke kann auf 100% gesetzt werden mit&lt;br /&gt;
 sudo amixer set Master 100%&lt;br /&gt;
 sudo pacmd set-sink-volume 0 65535&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.&#039;&#039;&#039; Soundausgabe z.B. über Kopfhörer prüfen&lt;br /&gt;
 paplay /usr/share/sounds/alsa/Front_Left.wav&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12.&#039;&#039;&#039; Jetzt können wir mit der Einrichtung von Bluetooth beginnen&lt;br /&gt;
 sudo nano /etc/bluetooth/audio.conf&lt;br /&gt;
und folgendes einfügen&lt;br /&gt;
 [General]&lt;br /&gt;
 Enable=Source,Sink,Headset,Gateway,Control,Media,Socket&lt;br /&gt;
 HFP=true&lt;br /&gt;
 Class=0x20041C&lt;br /&gt;
speichern und schliessen&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/bluetooth/main.conf&lt;br /&gt;
unter [General] folgendes einfügen&lt;br /&gt;
 Name = RaspStream&lt;br /&gt;
 Class = 0x20041C&lt;br /&gt;
speichern und schliessen&lt;br /&gt;
&lt;br /&gt;
 sudo hciconfig -a&lt;br /&gt;
eingeben und die MAC Adresse des Bluetooth Dongles aufschreiben&lt;br /&gt;
&lt;br /&gt;
Jetzt müssen die Bluetooth Settings angepasst werden (XX:XX:XX:XX:XX:XX steht für die MAC Adresse des Bluetooth Dongles)&lt;br /&gt;
 sudo nano /var/lib/bluetooth/XX:XX:XX:XX:XX:XX/settings&lt;br /&gt;
einngeben und folgendes einfügen &lt;br /&gt;
 [General]&lt;br /&gt;
 Discoverable=true&lt;br /&gt;
 Alias=RaspStream&lt;br /&gt;
 Class=0x20041C&lt;br /&gt;
speichern und schliessen&lt;br /&gt;
&lt;br /&gt;
Jetzt muss der Raspberry wieder neu gestartet werden&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.&#039;&#039;&#039; Jetzt können Bluetooth Dongle und Bluetooth Lautsprecher gepaired werden&lt;br /&gt;
 bluetoothctl&lt;br /&gt;
und folgende Befehle nacheinander eingeben&lt;br /&gt;
 agent on&lt;br /&gt;
 default-agent&lt;br /&gt;
 discoverable on&lt;br /&gt;
 scan on&lt;br /&gt;
&lt;br /&gt;
der Bluetooth Lautsprecher sollte jetzt irgendwann aufgelistet werden und kann dann gepaired werden mit&lt;br /&gt;
 pair XX:XX:XX:XX:XX:XX&lt;br /&gt;
 trust XX:XX:XX:XX:XX:XX&lt;br /&gt;
Bluetooth console verlassen mit&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
Damit sollte die Einrichtung abgeschlossen sein und wir können überprüfen, ob wir etwas über Bluetooth ausgeben können&lt;br /&gt;
 mplayer -ao pulse http://stream01.iloveradio.de/iloveradio1.mp3&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;14.&#039;&#039;&#039; Das Modul Text2Speech sollte dann mit &#039;default&#039; angelegt werden&lt;br /&gt;
 define TTS Text2Speech default&lt;br /&gt;
&lt;br /&gt;
==Sprachausgabe per Bluetooth-Lautsprecher==&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Dieser Abschnitt repräsentiert nicht den aktuellen Stand. Bezüglich Verbindung, Neustart alsa und dem Testbeispiel am Ende muss er überarbeitet werden}}&lt;br /&gt;
Es ist ebenfalls möglich die Sprachausgabe nicht über einen direkt per Kabel angeschlossenen Lautsprecher auszugeben, sondern per Bluetooth an einen oder mehrere Bluetooth-Lautsprecher. Der Test2Speech-Author verwendet einen CreativeD80.&lt;br /&gt;
Dabei ist auf dem Client mit der lokal eingerichteten Text2Speech-Instanz folgendes vorzunehmen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; USB-Bluetooth-Stick verbinden&lt;br /&gt;
per &#039;&#039;lsusb&#039;&#039; prüfen, ob der Stick erkannt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Bluetooth Bibliotheken installieren&lt;br /&gt;
 sudo apt-get install bluez bluez-alsa mplayer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; Bluetooth für eine AudioVerbindung konfigurieren&lt;br /&gt;
Dazu in &#039;&#039;/etc/bluetooth/audio.conf&#039;&#039; in der &#039;&#039;General section&#039;&#039; folgendes einfügen:&lt;br /&gt;
 Enable=Source,Sink,Headset,Gateway,Control,Socket,Media&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; den Rechner neu starten&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; Den Bluetooth-Lautsprecher lokalisieren&lt;br /&gt;
Den Lautsprecher in den Pairing-Modus versetzen. Erst Dadurch wird er im Scanning sichtbar&lt;br /&gt;
 hcitool scan&lt;br /&gt;
Folgendes Ergebnis sollte kommen:&lt;br /&gt;
 Scanning ...&lt;br /&gt;
    11:22:33:44:55:66   device 1&lt;br /&gt;
    12:34:56:78:90:12   device 2&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.&#039;&#039;&#039; eine RFComm Connection vorbereiten&lt;br /&gt;
Dazu &#039;&#039;/etc/bluetooth/rfcomm.conf&#039;&#039; editieren und folgendes eintragen (Mac-Adresse anpassen!)&lt;br /&gt;
 rfcomm0 {&lt;br /&gt;
   # Automatically bind the device at startup&lt;br /&gt;
   bind no;&lt;br /&gt;
   # Bluetooth address of the device&lt;br /&gt;
   device 11:22:33:44:55:66;&lt;br /&gt;
   # RFCOMM channel for the connection&lt;br /&gt;
   channel 3;&lt;br /&gt;
   # Description of the connection&lt;br /&gt;
   comment &amp;quot;This is Device 1&#039;s serial port.&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.&#039;&#039;&#039; rebooten&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.&#039;&#039;&#039; Pairing-Key vergeben&lt;br /&gt;
Die meisten Bluetoothgeräte verlangen einen Schlüssel während des Pairings. Der Creative-D80 erwartet den Schlüssel 0000&lt;br /&gt;
 bluetooth-agent 0000 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9.&#039;&#039;&#039; Das eigentliche Pairing&lt;br /&gt;
Den Lautsprecher in den Pairing-Modus versetzen. Danach:&lt;br /&gt;
 sudo rfcomm connect rfcomm0&lt;br /&gt;
Jetzt sollte keine Fehlermeldung mehr kommen....&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.&#039;&#039;&#039; Alsa konfigurieren&lt;br /&gt;
Der Bluetooth-Lautsprecher muss nun noch als Alsa-Audiodevice bekannt gemacht werden. Dazu muss &#039;&#039;/etc/asound.conf&#039;&#039; erstellt werden. MAC anpassen!&lt;br /&gt;
 pcm.bluetooth {&lt;br /&gt;
   type bluetooth&lt;br /&gt;
   device 11:22:33:44:55:66&lt;br /&gt;
   profile &amp;quot;auto&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Danach Alsa restarten:&lt;br /&gt;
{{Randnotiz|RNTyp=Fehl|RNText=Aktuell bei wheezy /etc/init.d/alsa-utils restart}}&lt;br /&gt;
 /etc/init.d/alsasound restart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.&#039;&#039;&#039; Testen der Verbindung&lt;br /&gt;
{{Randnotiz|RNTyp=Fehl|RNText=Dieses Beispiel geht allein wegen der ständigen Änderung bei Google nicht. Auch stimmt das Ausgabe Gerät nicht. Man könnte so testen :&amp;lt;code&amp;gt;mplayer -ao alsa:device=bluetooth http://1live-diggi.akacast.akamaistream.net/7/965/119435/v1/gnl.akacast.akamaistream.net/1live-diggi&amp;lt;/code&amp;gt;}}&lt;br /&gt;
:&amp;lt;code&amp;gt;mplayer -ao alsa:device=hw=0.0 -nolirc -noconsolecontrols -http-header-fields &amp;quot;User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m&amp;quot; &amp;quot;http://translate.google.com/translate_tts?tl=de&amp;amp;q=Das ist ein Test.&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problembehandlung ==&lt;br /&gt;
&lt;br /&gt;
=== Beim abspielen via Bluetooth &amp;quot;stottert&amp;quot; die Wiedergabe ===&lt;br /&gt;
Das Problem tritt im Zusammenhang mit der verwendeten Abspielsoftware ab. Aus nicht nachvollziehbaren Gründen harmoniert die Kombination Bluetooth und Mplayer nicht immer perfekt. Lösung hierfür ist, anstelle mit Mplayer mit VLC zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
Hierfür legt man ein Skript z.B. mit dem Namen /opt/bin/vlc-wrapper.sh an mit folgendem Inhalt:&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cvlc -A alsa --alsa-audio-device bluealsa --quiet --no-interact --play-and-exit $1&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der Teil &amp;lt;pre&amp;gt;-A alsa --alsa-audio-device bluealsa&amp;lt;/pre&amp;gt; kann ggf. weggelassen werden, wenn die Ausgabe nicht gezielt auf einem bestimmten Audiogerät erfolgen soll.&lt;br /&gt;
Anschließend muss die Ausgabe von Text2Speech noch auf das Skript umgeleitet werden mit folgendem Befehl in FHEM:&amp;lt;pre&amp;gt;attr myTTS TTS_MplayerCall /opt/bin/vlc-wrapper.sh&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MickyMaus-artiger Sound ===&lt;br /&gt;
Das Problem tritt auf, wenn man per mp3wrap mehrere mp3 Files zusammenzieht die eine unterschiedliche Auflösung haben.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Vorstellung und Diskussion des Moduls im {{Link2Forum|Topic=18481|LinkText=FHEM Forum}}&lt;br /&gt;
* [[Wetter_vorlesen_lassen|Code Snippets: Wetter vorlesen lassen]]&lt;br /&gt;
* [https://aubreykloppers.wordpress.com/2015/06/25/bluetooth-speaker-raspberry-pi-the-ultimate-guide/ weitere Guideline für Bluetooth per Rasperry Pi]&lt;br /&gt;
* [https://www.alefo.de/bluetooth-lautsprecher-und-adapter-f63/liste-kompatibler-bt-lautsprecher-fuer-amazon-dot-t907.html Liste von Bluetooth Lautsprechern]&lt;br /&gt;
* [http://www.forum-raspberrypi.de/Thread-tutorial-bluetooth-audio-streaming-mit-a2dp-raspbian-jessie Bluetooth einrichten mit Raspbian Jessie]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Akustische Ausgabe]]&lt;/div&gt;</summary>
		<author><name>Stefan Hvr</name></author>
	</entry>
</feed>