<?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=Unimatrix27</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=Unimatrix27"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Unimatrix27"/>
	<updated>2026-04-11T12:27:36Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer_Diskussion:Drhirn&amp;diff=19183</id>
		<title>Benutzer Diskussion:Drhirn</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer_Diskussion:Drhirn&amp;diff=19183"/>
		<updated>2017-01-29T12:25:14Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: Neuer Abschnitt /* OpenMultiroom */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Willkommen! ==&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;6&amp;quot; style=&amp;quot;line-height: 20px; background: #E0E0E0; border: 2px solid #1874CD;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#1874CD;&amp;quot; |&amp;lt;big&amp;gt;&amp;lt;span style=&amp;quot;color: #FAFAFA&amp;quot;&amp;gt;&#039;&#039;&#039;Hallo Drhirn,&#039;&#039;&#039; willkommen im FHEM Wiki!&amp;lt;/span&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; | Danke für dein Interesse an unserem Projekt, ich freue mich schon auf deine weiteren Beiträge. Die folgenden Seiten sollten dir die ersten Schritte erleichtern, bitte nimm dir daher etwas Zeit, sie zu lesen.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;FHEM-spezifische Informationen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; | &amp;amp;nbsp;&lt;br /&gt;
| width=&amp;quot;38%&amp;quot; | &#039;&#039;&#039;[[Systemübersicht]]&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;FHEM Systemübersicht&#039;&#039;&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; | &amp;amp;nbsp;&lt;br /&gt;
| width=&amp;quot;38%&amp;quot; | &#039;&#039;&#039;[[FHEMWiki:Über FHEMWiki]]&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;Informationen über dieses Wiki&#039;&#039;&lt;br /&gt;
&amp;lt;!-- Abschnitt auf Kommentar gesetzt&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{Todo|FHEM-spezifische Anleitungen und Regeln.}}&lt;br /&gt;
&lt;br /&gt;
---- &lt;br /&gt;
 Ende von &#039;Abschnitt auf Kommentar gesetzt&#039; --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; | &lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;Generelle Informationen über (Media)Wikis&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; | [[Datei:Crystal Clear app kedit.svg|rechts|30px|link=Hilfe:Bearbeiten]]&lt;br /&gt;
| width=&amp;quot;38%&amp;quot; | &#039;&#039;&#039;[[Hilfe:Bearbeiten]]&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;Zugang zu allen wichtigen Informationen.&#039;&#039;&lt;br /&gt;
| width=&amp;quot;8%&amp;quot; | [[Datei:X-office-presentation.svg|rechts|30px|link=Wikipedia:Tutorial]]&lt;br /&gt;
| width=&amp;quot;38%&amp;quot; | &amp;lt;!-- &#039;&#039;&#039;[[Wikipedia:Tutorial]]&#039;&#039;&#039;--&amp;gt;&#039;&#039;&#039;[http://de.wikipedia.org/wiki/Wikipedia:Tutorial Wikipedia:Tutorial]&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;Schritt-für-Schritt-Anleitung für Einsteiger.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [[Datei:Applications-system.svg|rechts|30px|link=Wikipedia:Grundprinzipien]]&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;!--[[Wikipedia:Grundprinzipien]]--&amp;gt;[http://de.wikipedia.org/wiki/Wikipedia:Grundprinzipien Wikipedia:Grundprinzipien]&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;Die grundlegende Philosophie unseres Projekts.&#039;&#039;&lt;br /&gt;
| [[Datei:MentorenProgrammLogo-7.svg|rechts|60px|link=Wikipedia:Mentorenprogramm]]&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;!--[[Wikipedia:Mentorenprogramm]]--&amp;gt;[http://de.wikipedia.org/wiki/Wikipedia:Mentorenprogramm Wikipedia:Mentorenprogramm]&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;Persönliche Einführung in die Beteiligung bei Wikipedia.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; |&lt;br /&gt;
----&lt;br /&gt;
Bitte beachte, &amp;lt;!--[[Wikipedia:Was Wikipedia nicht ist|was Wikipedia nicht ist]]--&amp;gt;[http://de.wikipedia.org/wiki/Wikipedia:Was_Wikipedia_nicht_ist was Wikipedia nicht ist], und &amp;quot;unterschreibe&amp;quot; deine Diskussionsbeiträge durch Eingabe von &amp;lt;code&amp;gt;--&amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; oder durch Drücken der Schaltfläche [[Datei:button_sig.png|Signaturknopf|20px|link=Hilfe:Signatur]] über dem Bearbeitungsfeld. Artikel werden jedoch nicht unterschrieben, und wofür die Zusammenfassungszeile da ist, erfährst du unter &amp;lt;!--[[wikipedia:Hilfe:Zusammenfassung und Quellen|Hilfe:Zusammenfassung und Quellen]]--&amp;gt;[http://de.wikipedia.org/wiki/Hilfe:Zusammenfassung_und_Quellen Zusammenfassung und Quellen]. &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:Nuvola apps ksirc.png|25px|link=Benutzer Diskussion:Ph1959de]] &amp;amp;nbsp;&amp;amp;nbsp; &#039;&#039;&#039;Hast du Fragen an mich?&#039;&#039;&#039; Schreib mir auf [[Benutzer Diskussion:Ph1959de|&amp;lt;u&amp;gt;meiner&amp;lt;/u&amp;gt; Diskussionsseite]]! Viele Grüße, [[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 21:08, 21. Sep. 2015 (CEST)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wiki-Artikel und commandref ==&lt;br /&gt;
&lt;br /&gt;
Hallo!&lt;br /&gt;
&lt;br /&gt;
Im Artikel [[Jabber]] hast Du die deutsche commandref 1:1 in einen Wiki-Artikel überführt. Das ist mMn nicht der Sinn des Wikis. Das Wiki soll die commandref ergänzen und weitergehend erläutern, aber nicht kopieren. Solche Dopplungen machen die Pflege arbeitsaufwendig: bspw. müsste jede Änderung in der commandref übernommen werden (wer macht das?) und der Mehrwert zur ist nicht vorhanden. Genau aus diesem Grund gibt es auch die Infobox-Modul, die auf den passenden commandref-Abschnitt verweist. Eine Übernahme ist somit nicht notwendig. Es wäre schön, wenn Du Dir dazu noch einmal Gedanken machen könntest. Vielen Dank.&lt;br /&gt;
&lt;br /&gt;
Auch wenn jetzt nur die Kritik geschrieben steht, ist das Wichtigste: Danke für Deine fleißige Mitarbeit. :-)&lt;br /&gt;
&lt;br /&gt;
Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 14:08, 11. Jan. 2017 (CET)&lt;br /&gt;
&lt;br /&gt;
:Ja, du hast vollkommen Recht. Hab auch schon fast vermutet, dass da Kritik kommt. Ich lebe in der Hoffnung, dass da noch Inhalte hinzugefügt werden. Aber eigentlich ist das Ganze nur entstanden, weil ich eine Seite &amp;quot;wikifizieren&amp;quot; wollte (wie ihr das so schön nennt :) ). Zu Jabber gab&#039;s noch nichts und eine leere Seite zu erstellen war mir dann auch zu frech.&lt;br /&gt;
:Ich geh aber in jedem Fall noch mal in mich.&lt;br /&gt;
:Super wäre natürlich eine Lösung, wie man die Inhalte der CommandRef automatisch ins Wiki übernehmen könnte. Da ist mir aber noch nichts schlaues dazu eingefallen. Und irgendwie gehe ich davon aus, dass das auch gar nicht erwünscht ist ;) --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 13:22, 12. Jan. 2017 (CET)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
::Klar könnten wir die commandref automatisch übernehmen. Ich sehe darin aber keine Notwendigkeit und keinen Nutzen, da man die mit einem Klick in einem separaten Fenster als HTML öffnen kann. Das halte ich für mindestens genauso komfortabel wie ein separate Wiki-Seite. Wenn man es übernehmen würde, dann müsste die Übernahme täglich aktualisiert werden; man müsste verhindern, dass jeder Wiki-Schreiber an der commandref-Wiki-Seite etwas ändern kann,usw. Das würde viel Pflege- und Arbeitsaufwand für eine Übernahme-Schnittstelle bedeuten, die eigentlich nichts zusätzliches bringt.&lt;br /&gt;
::Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 10:15, 17. Jan. 2017 (CET)Christian&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:::Man müsste die übernommenen CR-Artikel irgendwie sperren können. MediaWiki sieht das allerdings leider nicht vor.&lt;br /&gt;
:::Ich persönlich habe leichte Bedienungsprobleme mit der CommandRef. Mich macht z.B. die laaange Ladezeit fertig. Und ich ordne gerne Fenster nebeneinander an. Wenn man also die CR im &amp;quot;Vollbild&amp;quot; liest und dann das Browser-Fenster auf die Hälfte des Bildschirms verkleinert, scrollt die CR irgendwo hin und man kann den Anker erst recht wieder suchen. Finde ich einfach unpraktisch. Eine kurze Seite pro Modul z.B. im Wiki wäre einfacher.&lt;br /&gt;
:::Gruß, --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 10:24, 17. Jan. 2017 (CET)&lt;br /&gt;
&lt;br /&gt;
== Änderungen in (Kategorisierung) von Vorlagen ==&lt;br /&gt;
&lt;br /&gt;
Hallo Drhirn,&lt;br /&gt;
&lt;br /&gt;
ich habe gerade zwei von Dir gemachte Änderungen an Vorlagen rückgängig gemacht. Zur Erläuterung: alle FHEM-Wiki spezifischen Vorlagen sind entsprechend den Beispielen in https://de.wikipedia.org/wiki/Kategorie:Vorlage: einsortiert. Solange es damit keine Probleme gibt oder trifitige Gründe, das anders zu machen, möchte ich Dich bitten, das so zu belassen, ansonsten Änderungen bitte vorher im Rahmen einer Diskussion zu klären. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 12:13, 16. Jan. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:Hi,&lt;br /&gt;
:Grund 1: Der Doppelpunkt am Schluss (&amp;quot;Kategorie:Vorlage:&amp;quot;) gehört da eigentlich nicht hin (aus technischer Sicht). Wenn ihr da aber einen Grund dafür habt, entschuldige ich mich für&#039;s vorschnelle Editieren.&lt;br /&gt;
:Grund 2: Vorlagen in eine Kategorie &amp;quot;Vorlagen&amp;quot; einzuordnen ist zwar manchmal praktisch, aber eigentlich nicht notwendig. Wenn man schnell alle Vorlagen angezeigt bekommen möchte, geht das einfacher über &amp;quot;Alle Seiten -&amp;gt; Namensraum &#039;Vorlage&#039;&amp;quot;.&lt;br /&gt;
:Gruß&lt;br /&gt;
:--[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 12:42, 16. Jan. 2017 (CET)&lt;br /&gt;
&lt;br /&gt;
== Kategorie für Serversoftware ==&lt;br /&gt;
&lt;br /&gt;
Hallo Stefan!&lt;br /&gt;
&lt;br /&gt;
Du hattest hier: https://forum.fhem.de/index.php/topic,64682.msg559529.html#msg559529 bezüglich neuer Kategorie angefragt. Mir ist nicht klar, wo Du diese Kategorie einordnen willst. Solche Artikel würden aktuell bspw. in HowTos passen. Da es sich nicht um FHEM-spezifische Artikel handelt, möchte ich die auch nicht in den Vordergrund des FHEM Wikis durch spezielle Kategorien schieben. Diese Artikel drohen regelmäßig schnell zu veralten, da die Zielgruppe und damit auch potentielle Mitschreiber normalerweise relativ klein ist. Das bedeutet nicht, dass diese Artikel nicht geschrieben werden sollen/dürfen, sondern ich möchte nur die Probleme in langfristiger Sicht aufzeigen. &lt;br /&gt;
&lt;br /&gt;
Das deckt sich ein wenig mit dem von Dir bemängelten Linux Init-Artikel. Der Artikel ist nur indirekt FHEM-bezogen und es kümmert sich keiner so richtig darum. Ich mag da nicht einsteigen, da es mich nicht betrifft und interessiert. Finde so etwas kann man besser als Hinweis auf ein externes Linux-Wiki verlinken. Dort gibt es kompetente Wiki-Schreiber, die einen solchen Artikel pflegen.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich bin ich der Meinung, dass wir mit der vorhandenen Kategorisierung klar kommen sollten, um es nicht zu komplex zu gestalten.&lt;br /&gt;
&lt;br /&gt;
Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 10:02, 17. Jan. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:Ok, gute Argumente.&lt;br /&gt;
:Eventuell die HowTos untergliedern?&lt;br /&gt;
:LG, --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 10:24, 17. Jan. 2017 (CET)&lt;br /&gt;
&lt;br /&gt;
== OpenMultiroom ==&lt;br /&gt;
&lt;br /&gt;
Sorry, das war ein Versehen, ich habe deine Änderungen wieder eingebaut, danke dafür. Hatte die Datei noch im Offline-Editor offen und habe etwas vorschnell gespeichert.&lt;/div&gt;</summary>
		<author><name>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19182</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19182"/>
		<updated>2017-01-29T12:23:23Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: Änderungen von Drhirn wieder rein (by SublimeText.Mediawiker) (by SublimeText.Mediawiker)&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=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends [https://forum.fhem.de/index.php/topic,18517.msg MPD] und [https://forum.fhem.de/index.php/topic,62389.0.html 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 Forum / auf dem 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 [https://forum.fhem.de/index.php/topic,62389.0.html 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;source 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;/source&amp;gt;&lt;br /&gt;
Weiterhin ist der Befehl&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;sudo systemctl enable pulseaudio&amp;lt;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=ABFALL&amp;diff=19181</id>
		<title>ABFALL</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=ABFALL&amp;diff=19181"/>
		<updated>2017-01-29T12:18:02Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: Zweites Beispiel für Tablet UI eingefügt (by SublimeText.Mediawiker) (by SublimeText.Mediawiker)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Filtern von (Abfall-)Terminen aus einem Calendar.&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModFTopic=48237&lt;br /&gt;
|ModForumArea=Codeschnipsel&lt;br /&gt;
|ModTechName=57_ABFALL.pm&lt;br /&gt;
|ModOwner=Constantin / {{Link2FU|14026|uniqueck}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[ABFALL]] ist ein (inoffizielles, nicht Bestandteil der Distribution) Hilfsmodul, das bestimmte Termine aus einem bestehenden Kalender des Moduls [[Calendar]] in Readings übernimmt. &lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Es muss ein Calendar-Objekt definiert sein. Der dabei benutzte Name muss in der Definition des ABFALL-Objekts spezifiziert werden.&lt;br /&gt;
Es können auch mehrere Calendar Objekte übergeben werden.&lt;br /&gt;
&lt;br /&gt;
Sonderzeichen aus dem Namen der Termine, werden entfernt um die Namen der generierten Readings FHEM tauglich zu machen, für die Werte der Readings bleiben diese allerdings erhalten.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Mit folgendem Befehl kann das Modul direkt in den Standard FHEM Update Prozess eingeklinkt werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;update add https://raw.githubusercontent.com/uniqueck/fhem-abfall/master/controls_fhemabfall.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
Um es nur zu installieren, kann auch einfach nur das Command&lt;br /&gt;
:&amp;lt;code&amp;gt;update all https://raw.githubusercontent.com/uniqueck/fhem-abfall/master/controls_fhemabfall.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsstrang ===&lt;br /&gt;
:&amp;lt;code&amp;gt;update add https://raw.githubusercontent.com/uniqueck/fhem-abfall/develop/controls_fhemabfall.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
bzw.&lt;br /&gt;
:&amp;lt;code&amp;gt;update all https://raw.githubusercontent.com/uniqueck/fhem-abfall/develop/controls_fhemabfall.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Define ===&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;Name&amp;gt; ABFALL &amp;lt;calendarname&amp;gt;,&amp;lt;calendarname2&amp;gt;,...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erläuterung der Parameter im &#039;&#039;&#039;define&#039;&#039;&#039;:&lt;br /&gt;
;&amp;lt;calendarname&amp;gt;&lt;br /&gt;
:Name des &#039;&#039;&#039;Calendar&#039;&#039;&#039; Kalenders &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;define myAbfall ABFALL AbfallGoogleCalender&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Werte aktualisieren ===&lt;br /&gt;
Die Werte aktualisieren sich abhängig vom [[notify]] der entsprechenden Calendar Instanz, welche im define angegeben wurde(n).&lt;br /&gt;
&lt;br /&gt;
=== Weitere Attribute ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Attribut&lt;br /&gt;
!Werteliste&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Default Wert&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |calendarname_praefix&lt;br /&gt;
|0 und 1&lt;br /&gt;
|soll der Kalendername als praefix dem Reading vorangestellt werden, sollte bei nur einem Kalender auf 0 gesetzt werden&lt;br /&gt;
|1 - praefix wird vorangestellt&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |abfall_clear_reading_regex&lt;br /&gt;
|&lt;br /&gt;
|regex zum Entfernen von Anteilen aus dem Termin, dieser wird vor dem Entfernen von Sonderzeichen aus den Namen der Termine angewandt.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |disable&lt;br /&gt;
|0 und 1&lt;br /&gt;
|deaktiviert das Modul&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |weekday_mapping&lt;br /&gt;
|&lt;br /&gt;
|Mapping, wie die Readings der Tage angezeigt werden sollen, zum Beispiel So Mo Di Mi Do Fr Sa&lt;br /&gt;
|Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |delimiter_text_reading&lt;br /&gt;
|&lt;br /&gt;
|Wenn zwei Abholungen an ein und demselben Tag existieren, wird dieses Trennzeichen genutzt, um die beiden (oder mehrere) Werte zu einem Text zu verbinden. Nur relevant für die Readings next_text und now_text&lt;br /&gt;
|und&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |delimiter_reading&lt;br /&gt;
|&lt;br /&gt;
|wie attribute delimiter_text_reading, allerdings nur für die readings next und now&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |filter&lt;br /&gt;
|&lt;br /&gt;
|regex zum Filtern der Namen der Termine aus den Kalendern, so dass nur solche genutzt werden, welche diesem Filter entsprechen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiel(e) ==&lt;br /&gt;
=== Einbindung ins Tablet UI ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;div data-device=&amp;quot;myABFALL&amp;quot; data-type=&amp;quot;symbol&amp;quot; class=&amp;quot;bigger warn wider&amp;quot; &lt;br /&gt;
          data-get=&amp;quot;next&amp;quot; data-get-warn=&amp;quot;.*(\d+).*&amp;quot; &lt;br /&gt;
          data-get-on=&#039;[&amp;quot;Restmuell_.*&amp;quot;,&amp;quot;Wertstoff_.*&amp;quot;]&#039;&lt;br /&gt;
          data-on-colors=&#039;[&amp;quot;#000&amp;quot;,&amp;quot;#6EB54C&amp;quot;]&#039; &lt;br /&gt;
          data-icons=&#039;[&amp;quot;fa-trash-o&amp;quot;,&amp;quot;fa-trash-o&amp;quot;]&#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einbindung ins Tablet UI, erweitert ===&lt;br /&gt;
Fallen die Leerungen zweier verschiedener Tonnen nicht auf den selben Tag, reicht es normalerweise, nur ein Symbol auf der Oberfläche zu platzieren und dieses dann dynamisch zu befüllen. In folgendem Beispiel werden folgende Anforderungen umgesetzt:&lt;br /&gt;
* Anzeige unterschiedlicher Symbole bzw. Farben für Papiertonne, Restmülltonne, Biotonne und gelbe Säcke&lt;br /&gt;
* Anzeige der verbleibenden Tage bis zur Leerung als &amp;quot;Warn&amp;quot;-Marker in Rot, aber nur, wenn die Leerung innerhalb der nächsten 2 Tage ist&lt;br /&gt;
* Blinken des Symbols, wenn die nächste Leerung morgen ansteht&lt;br /&gt;
* Rotation des Symbols, wenn die nächste Leerung noch am selben Tag ansteht. Nach einer bestimmten Uhrzeit (z.B. 9 Uhr morgens) soll dann auf die nächste Tonne geschaltet werden&lt;br /&gt;
* Anzeige des Datums bzw. von &amp;quot;heute&amp;quot; oder &amp;quot;morgen&amp;quot; unter dem Symbol als Label&lt;br /&gt;
&lt;br /&gt;
Zur Datumsanzeige wird eine kleine Hilfsfunktion in die 99_myUtils eingebaut. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub datumHeuteMorgen($){&lt;br /&gt;
		my $compareDate = shift;&lt;br /&gt;
		my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);&lt;br /&gt;
		$year += 1900; $mon += 1; &lt;br /&gt;
		my $heute = sprintf(&#039;%02d.%02d.%04d&#039;, $mday, $mon, $year);&lt;br /&gt;
		($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time+86400);&lt;br /&gt;
		$year += 1900; $mon += 1;&lt;br /&gt;
		my $morgen = sprintf(&#039;%02d.%02d.%04d&#039;, $mday, $mon, $year);&lt;br /&gt;
		return &amp;quot;heute&amp;quot; if $compareDate eq $heute;&lt;br /&gt;
		return &amp;quot;morgen&amp;quot; if $compareDate eq $morgen;&lt;br /&gt;
		return $compareDate;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Diese Funktion wird in den userReadings des Abfall-Moduls verwendet. Das Abfallmodul erzeugt eine Gruppe von Readings mit dem Namen now_*, wenn die Leerung am selben Tag ansteht, bzw. genau dann, wenn der Termin im zu Grunde liegenden Kalender gerade aktiv ist. In diesem Beispiel liegt dem Kalender-Modul ein Google-Kalender zu Grunde, bei dem die Termine immer von 0 Uhr bis 9 Uhr morgens eingetragen sind. Dadurch wird erreicht, dass die Anzeige nach 9 Uhr weiterspringt, weil dann die now-Readings verschwinden.&lt;br /&gt;
&lt;br /&gt;
Folgende userReadings werden zum Abfallmodul hinzugefügt, welches in diesem Beispiel &amp;quot;abf.abfall&amp;quot; genannt ist:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
attr abf.abfall userReadings ftui_datum {ReadingsVal(&amp;quot;abf.abfall&amp;quot;,&amp;quot;now_text&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;&amp;quot; ? datumHeuteMorgen(ReadingsVal(&amp;quot;abf.abfall&amp;quot;,&amp;quot;next_datum&amp;quot;,&amp;quot;&amp;quot;)) : &amp;quot;heute&amp;quot;;},ftui_next {ReadingsVal(&amp;quot;abf.abfall&amp;quot;,&amp;quot;now_text&amp;quot;,&amp;quot;&amp;quot;) eq &amp;quot;&amp;quot; ? ReadingsVal(&amp;quot;abf.abfall&amp;quot;,&amp;quot;next&amp;quot;,&amp;quot;&amp;quot;) : ReadingsVal(&amp;quot;abf.abfall&amp;quot;,&amp;quot;now&amp;quot;,&amp;quot;&amp;quot;).&amp;quot;_0&amp;quot;;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Reading &amp;quot;ftui_next&amp;quot; bildet die Grundlage für das Symbol in TabletUI, das Reading &amp;quot;ftui_datum&amp;quot; wird für das Label genutzt. &lt;br /&gt;
&lt;br /&gt;
Somit lässt sich ganze in FTUI wie folgt darstellen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div data-device=&amp;quot;abf.abfall&amp;quot; &lt;br /&gt;
                     data-type=&amp;quot;symbol&amp;quot;&lt;br /&gt;
                     data-get=&amp;quot;ftui_next&amp;quot;&lt;br /&gt;
                     data-get-on=&#039;[&amp;quot;Biotonne_0$&amp;quot;,&amp;quot;Biotonne_1$&amp;quot;,&amp;quot;Biotonne_.*&amp;quot;,&amp;quot;GelberSack_0$&amp;quot;,&amp;quot;GelberSack_1$&amp;quot;,&amp;quot;GelberSack_.*&amp;quot;,&amp;quot;Papiertonne_0$&amp;quot;,&amp;quot;Papiertonne_1$&amp;quot;,&amp;quot;Papiertonne_.*&amp;quot;,&amp;quot;Restmuelltonne_0$&amp;quot;,&amp;quot;Restmuelltonne_1$&amp;quot;,&amp;quot;Restmuelltonne_.*&amp;quot;]&#039;&lt;br /&gt;
                     data-get-warn=&amp;quot;.*([0|1|2]).*&amp;quot;&lt;br /&gt;
                     data-on-colors=&#039;[&amp;quot;#8B4513&amp;quot;,&amp;quot;#8B4513&amp;quot;,&amp;quot;#8B4513&amp;quot;,&amp;quot;#f4e946&amp;quot;,&amp;quot;#f4e946&amp;quot;,&amp;quot;#f4e946&amp;quot;,&amp;quot;#2d9e1c&amp;quot;,&amp;quot;#2d9e1c&amp;quot;,&amp;quot;#2d9e1c&amp;quot;,&amp;quot;#696969&amp;quot;,&amp;quot;#696969&amp;quot;,&amp;quot;#696969&amp;quot;]&#039;&lt;br /&gt;
                     class=&amp;quot;large warn&amp;quot;&lt;br /&gt;
                     data-icons=&#039;[&amp;quot;fa-trash-o fa-spin&amp;quot;,&amp;quot;fa-trash-o blink&amp;quot;,&amp;quot;fa-trash-o&amp;quot;,&amp;quot;fs-bag fa-spin&amp;quot;,&amp;quot;fs-bag blink&amp;quot;,&amp;quot;fs-bag&amp;quot;,&amp;quot;fs-dustbin fa-spin&amp;quot;,&amp;quot;fs-dustbin blink&amp;quot;,&amp;quot;fs-dustbin&amp;quot;,&amp;quot;fa-trash fa-spin&amp;quot;,&amp;quot;fa-trash blink&amp;quot;,&amp;quot;fa-trash&amp;quot;]&#039;&lt;br /&gt;
                     /&amp;gt;&lt;br /&gt;
                &amp;lt;div data-device=&amp;quot;abf.abfall&amp;quot; data-get=&amp;quot;ftui_datum&amp;quot; data-type=&amp;quot;label&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Für Jede Tonne werden hier drei Zustände unterschieden und einzeln in &amp;quot;data-get-on&amp;quot;, &amp;quot;data-on-colors&amp;quot; und &amp;quot;data-icons&amp;quot; zugeordnet. Daher haben diese Listen jeweils 12 Einträge. &lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigung ===&lt;br /&gt;
==== DOIF ====&lt;br /&gt;
&amp;lt;pre&amp;gt;[Abfall:next_tage] == 1) ( set fhemBot message Morgen wird [Abfall:next_text] abgeholt)&lt;br /&gt;
[Abfall:now_text] ne &amp;quot;&amp;quot;) ( set fhemBot message Heute wird [Abfall:now_text] abgeholt)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Pushbullet Beispiel ======&lt;br /&gt;
&lt;br /&gt;
Die morgigen Leerungen per Push mittels Pushbullet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define dAbfallmorgen doif ([Abfall:next_tage] == 1) ( msg |Morgen wird [Abfall:next_text] abgeholt)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die heutigen Leerungen per Push mittels Pushbullet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define dAbfallheute doif ([Abfall:now_text] ne &amp;quot;&amp;quot;) ( msg |Heute wird [Abfall:now_text] abgeholt)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
* Forenthema {{Link2Forum|Topic=50177|LinkText=Abfall Visualisierung mit Bilderrahmen}}&lt;/div&gt;</summary>
		<author><name>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19083</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19083"/>
		<updated>2017-01-26T21:12:43Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: Hinzugefügt: Ducking-Funktion von Pulseaudio (by SublimeText.Mediawiker) (by SublimeText.Mediawiker)&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=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends [https://forum.fhem.de/index.php/topic,18517.msg MPD] und [https://forum.fhem.de/index.php/topic,62389.0.html Snapcast] sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Wiki-Artikel und auch das beschriebene Modul sind noch in der Implemntierung und noch nicht 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 [https://forum.fhem.de/index.php/topic,18517.msg MPD]-Modul sowie des Multiroom-System [https://forum.fhem.de/index.php/topic,62389.0.html 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 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 eine 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;source 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;/source&amp;gt;&lt;br /&gt;
Weiterhin ist der Befehl&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;sudo systemctl enable pulseaudio&amp;lt;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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;source 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;/source&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>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19073</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19073"/>
		<updated>2017-01-26T13:29:46Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: some error corrections before publishing to FHEM forum (by SublimeText.Mediawiker) (by SublimeText.Mediawiker)&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=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends [https://forum.fhem.de/index.php/topic,18517.msg MPD] und [https://forum.fhem.de/index.php/topic,62389.0.html Snapcast] sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Wiki-Artikel und auch das beschriebene Modul sind noch in der Implemntierung und noch nicht 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 [https://forum.fhem.de/index.php/topic,18517.msg MPD]-Modul sowie des Multiroom-System [https://forum.fhem.de/index.php/topic,62389.0.html 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 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 eine 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;source 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;/source&amp;gt;&lt;br /&gt;
Weiterhin ist der Befehl&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;sudo systemctl enable pulseaudio&amp;lt;/source&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;source 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;
&amp;lt;/source&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 letzten Zeilen werden noch 3 weitere 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.&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;source 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;/source&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;source 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;/source&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;source 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&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;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Audioteil wird der entsprechende Sink aus der Pulseaudiokonfiguration genommen. 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;source 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;/source&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;source 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;/source&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;source 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;
&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_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_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_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_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_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_UseMP3Wrap    true&lt;br /&gt;
&amp;lt;/source&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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source 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;/source&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;source 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;/source&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>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19047</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19047"/>
		<updated>2017-01-25T19:28:52Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: Fehler beseitigt (by SublimeText.Mediawiker) (by SublimeText.Mediawiker)&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=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends [https://forum.fhem.de/index.php/topic,18517.msg MPD] und [https://forum.fhem.de/index.php/topic,62389.0.html Snapcast] sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Wiki-Artikel und auch das beschriebene Modul sind noch in der Implemntierung und noch nicht 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 [https://forum.fhem.de/index.php/topic,18517.msg MPD]-Modul sowie des Multiroom-System [https://forum.fhem.de/index.php/topic,62389.0.html 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 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 eine 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;source 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;/source&amp;gt;&lt;br /&gt;
Weiterhin ist der Befehl&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;sudo systemctl enable pulseaudio&amp;lt;/source&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;source 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;
&amp;lt;/source&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 letzten Zeilen werden noch 3 weitere Sinks als Combine-Sinks erstellt. Diese erzeugen keine neuen FIFOs, sondern machen 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.&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;source 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;/source&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;source 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;/source&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;source 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&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;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Audioteil wird der entsprechende Sink aus der Pulseaudiokonfiguration genommen. 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;source 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;/source&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;source 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;/source&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;source 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;
&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_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_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_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_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_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_UseMP3Wrap    true&lt;br /&gt;
&amp;lt;/source&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 machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source 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;/source&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;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          mac.kind1              MultiroomAudioController&lt;br /&gt;
  attr          mac.kind1              mr                scc.kind1&lt;br /&gt;
  attr          mac.kind1              soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          mac.kind1              playlistPattern   kind1&lt;br /&gt;
  attr          mac.kind1              ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          mac.kind1              defaultTts        tts.kind1&lt;br /&gt;
  attr          mac.kind1              defaultStream     kind1&lt;br /&gt;
  attr          mac.kind1              defaultSound      mpd.kind1&lt;br /&gt;
&lt;br /&gt;
define          mac.kind2             MultiroomAudioController&lt;br /&gt;
  attr          mac.kind2             mr                scc.kind2&lt;br /&gt;
  attr          mac.kind2             soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          mac.kind2             playlistPattern   kind2&lt;br /&gt;
  attr          mac.kind2             ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          mac.kind2             defaultTts        tts.kind2&lt;br /&gt;
  attr          mac.kind2             defaultStream     kind2&lt;br /&gt;
  attr          mac.kind2             defaultSound      mpd.kind2&lt;br /&gt;
&lt;br /&gt;
define          mac.kueche            MultiroomAudioController&lt;br /&gt;
  attr          mac.kueche            mr                scc.kueche&lt;br /&gt;
  attr          mac.kueche            soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          mac.kueche            playlistPattern   wohn&lt;br /&gt;
  attr          mac.kueche            ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          mac.kueche            defaultTts        tts.kueche&lt;br /&gt;
  attr          mac.kueche            defaultStream     kueche&lt;br /&gt;
  attr          mac.kueche            defaultSound      mpd.kueche&lt;br /&gt;
&lt;br /&gt;
define          mac.wohn              MultiroomAudioController&lt;br /&gt;
  attr          mac.wohn              mr                scc.wohn&lt;br /&gt;
  attr          mac.wohn              soundMapping      kind1:mpd.kind1,kind2:mpd.kind2,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          mac.wohn              playlistPattern   wohn&lt;br /&gt;
  attr          mac.wohn              ttsMapping        kind1:tts.kind1,kind2:tts.kind2,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          mac.wohn              defaultTts        tts.wohn&lt;br /&gt;
  attr          mac.wohn              defaultStream     wohn&lt;br /&gt;
  attr          mac.wohn              defaultSound      mpd.wohn&lt;br /&gt;
&amp;lt;/source&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>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19046</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19046"/>
		<updated>2017-01-25T19:27:35Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: Konfiguration vervollstaendigt (by SublimeText.Mediawiker) (by SublimeText.Mediawiker)&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=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends [https://forum.fhem.de/index.php/topic,18517.msg MPD] und [https://forum.fhem.de/index.php/topic,62389.0.html Snapcast] sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Wiki-Artikel und auch das beschriebene Modul sind noch in der Implemntierung und noch nicht 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 [https://forum.fhem.de/index.php/topic,18517.msg MPD]-Modul sowie des Multiroom-System [https://forum.fhem.de/index.php/topic,62389.0.html 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 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 eine 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;source 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;/source&amp;gt;&lt;br /&gt;
Weiterhin ist der Befehl&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;sudo systemctl enable pulseaudio&amp;lt;/source&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;source 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;
&amp;lt;/source&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 letzten Zeilen werden noch 3 weitere Sinks als Combine-Sinks erstellt. Diese erzeugen keine neuen FIFOs, sondern machen 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.&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;source 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;/source&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;source 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;/source&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;source 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&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;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Audioteil wird der entsprechende Sink aus der Pulseaudiokonfiguration genommen. 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;source 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;/source&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;source 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;/source&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;source 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;
&lt;br /&gt;
define          tts.nele              Text2Speech       pulsenele&lt;br /&gt;
  attr          tts.wohn              TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.nele              TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.merle             Text2Speech       pulsemerle&lt;br /&gt;
  attr          tts.wohn              TTS_FileTemplateDir /data/misc/announcements/&lt;br /&gt;
  attr          tts.merle             TTS_UseMP3Wrap    true&lt;br /&gt;
&lt;br /&gt;
define          tts.kueche            Text2Speech       pulsekueche&lt;br /&gt;
  attr          tts.wohn              TTS_FileTemplateDir /data/misc/announcements/&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.wohn              TTS_FileTemplateDir /data/misc/announcements/&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.wohn              TTS_FileTemplateDir /data/misc/announcements/&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_UseMP3Wrap    true&lt;br /&gt;
&amp;lt;/source&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 machen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          mpd.nele              MPD               192.168.2.2 6600&lt;br /&gt;
  attr          mpd.nele              player            mopidy&lt;br /&gt;
  attr          mpd.nele              bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.nele              autoBookmark      1&lt;br /&gt;
&lt;br /&gt;
define          mpd.merle             MPD               192.168.2.2 6702&lt;br /&gt;
  attr          mpd.merle             player            mopidy&lt;br /&gt;
  attr          mpd.merle             bookmarkDir       mpdstates&lt;br /&gt;
  attr          mpd.merle             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;/source&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;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define          mac.nele              MultiroomAudioController&lt;br /&gt;
  attr          mac.nele              mr                scc.nele&lt;br /&gt;
  attr          mac.nele              soundMapping      nele:mpd.nele,merle:mpd.merle,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          mac.nele              playlistPattern   nele&lt;br /&gt;
  attr          mac.nele              ttsMapping        nele:tts.nele,merle:tts.merle,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          mac.nele              defaultTts        tts.nele&lt;br /&gt;
  attr          mac.nele              defaultStream     nele&lt;br /&gt;
  attr          mac.nele              defaultSound      mpd.nele&lt;br /&gt;
&lt;br /&gt;
define          mac.merle             MultiroomAudioController&lt;br /&gt;
  attr          mac.merle             mr                scc.merle&lt;br /&gt;
  attr          mac.merle             soundMapping      nele:mpd.nele,merle:mpd.merle,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          mac.merle             playlistPattern   merle&lt;br /&gt;
  attr          mac.merle             ttsMapping        nele:tts.nele,merle:tts.merle,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          mac.merle             defaultTts        tts.merle&lt;br /&gt;
  attr          mac.merle             defaultStream     merle&lt;br /&gt;
  attr          mac.merle             defaultSound      mpd.merle&lt;br /&gt;
&lt;br /&gt;
define          mac.kueche            MultiroomAudioController&lt;br /&gt;
  attr          mac.kueche            mr                scc.kueche&lt;br /&gt;
  attr          mac.kueche            soundMapping      nele:mpd.nele,merle:mpd.merle,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          mac.kueche            playlistPattern   wohn&lt;br /&gt;
  attr          mac.kueche            ttsMapping        nele:tts.nele,merle:tts.merle,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          mac.kueche            defaultTts        tts.kueche&lt;br /&gt;
  attr          mac.kueche            defaultStream     kueche&lt;br /&gt;
  attr          mac.kueche            defaultSound      mpd.kueche&lt;br /&gt;
&lt;br /&gt;
define          mac.wohn              MultiroomAudioController&lt;br /&gt;
  attr          mac.wohn              mr                scc.wohn&lt;br /&gt;
  attr          mac.wohn              soundMapping      nele:mpd.nele,merle:mpd.merle,kueche:mpd.kueche,wohn:mpd.wohn&lt;br /&gt;
  attr          mac.wohn              playlistPattern   wohn&lt;br /&gt;
  attr          mac.wohn              ttsMapping        nele:tts.nele,merle:tts.merle,kueche:tts.kueche,wohn:tts.wohn&lt;br /&gt;
  attr          mac.wohn              defaultTts        tts.wohn&lt;br /&gt;
  attr          mac.wohn              defaultStream     wohn&lt;br /&gt;
  attr          mac.wohn              defaultSound      mpd.wohn&lt;br /&gt;
&amp;lt;/source&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>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19036</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19036"/>
		<updated>2017-01-25T16:22:38Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: Snapcast und Mopdy hinzugefügt&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=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends [https://forum.fhem.de/index.php/topic,18517.msg MPD] und [https://forum.fhem.de/index.php/topic,62389.0.html Snapcast] sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Wiki-Artikel und auch das beschriebene Modul sind noch in der Implemntierung und noch nicht 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 [https://forum.fhem.de/index.php/topic,18517.msg MPD]-Modul sowie des Multiroom-System [https://forum.fhem.de/index.php/topic,62389.0.html 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 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 eine 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 &amp;lt;em&amp;gt;/etc/systemd/system/pulseaudio.server&amp;lt;/em&amp;gt; erreicht:&lt;br /&gt;
&amp;lt;source 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;/source&amp;gt;&lt;br /&gt;
Weiterhin ist der Befehl&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;sudo systemctl enable pulseaudio&amp;lt;/source&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  &amp;lt;em&amp;gt;/etc/pulse/system.pa&amp;lt;/em&amp;gt; die benötigten Module eingetragen&lt;br /&gt;
&amp;lt;source 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;
&amp;lt;/source&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 letzten Zeilen werden noch 3 weitere Sinks als Combine-Sinks erstellt. Diese erzeugen keine neuen FIFOs, sondern machen 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.&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 &amp;lt;em&amp;gt;/etc/default/snapserver&amp;lt;/em&amp;gt;&lt;br /&gt;
&amp;lt;source 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;/source&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 &amp;lt;em&amp;gt;/etc/default/snapclient&amp;lt;/em&amp;gt; dann so aus:&lt;br /&gt;
&amp;lt;source 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;/source&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 &amp;lt;em&amp;gt;/etc/mopidy/mopidy.cfg&amp;lt;/em&amp;gt;. 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 &amp;lt;em&amp;gt;/etc/mopidy/kind1.conf&amp;lt;/em&amp;gt; bis &amp;lt;em&amp;gt;/etc/mopidy/kueche.conf&amp;lt;/em&amp;gt; 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;source 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&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;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Audioteil wird der entsprechende Sink aus der Pulseaudiokonfiguration genommen. 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 &amp;lt;em&amp;gt;/etc/mopidy/logging_kind2.conf&amp;lt;/em&amp;gt;. 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 &amp;lt;em&amp;gt;/etc/systemd/system/mopidy.cfg&amp;lt;/em&amp;gt; z.B. in &amp;lt;em&amp;gt;/etc/systemd/system/mopidy_kind1.cfg&amp;lt;/em&amp;gt; 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;source 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;/source&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;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19034</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19034"/>
		<updated>2017-01-25T14:10:41Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: /* Aufbau anhand einer vollständigen Beispielkonfiguration */&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=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends [https://forum.fhem.de/index.php/topic,18517.msg MPD] und [https://forum.fhem.de/index.php/topic,62389.0.html Snapcast] sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Wiki-Artikel und auch das beschriebene Modul sind noch in der Implemntierung und noch nicht 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 [https://forum.fhem.de/index.php/topic,18517.msg MPD]-Modul sowie des Multiroom-System [https://forum.fhem.de/index.php/topic,62389.0.html 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 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 eine 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 &amp;lt;em&amp;gt;/etc/systemd/system/pulseaudio.server&amp;lt;/em&amp;gt; erreicht:&lt;br /&gt;
&amp;lt;source 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;/source&amp;gt;&lt;br /&gt;
Weiterhin ist der Befehl&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;sudo systemctl enable pulseaudio&amp;lt;/source&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  &amp;lt;em&amp;gt;/etc/pulse/system.pa&amp;lt;/em&amp;gt; die benötigten Module eingetragen&lt;br /&gt;
&amp;lt;source 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;
&amp;lt;/source&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 letzten Zeilen werden noch 3 weitere Sinks als Combine-Sinks erstellt. Diese erzeugen keine neuen FIFOs, sondern machen 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19032</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=19032"/>
		<updated>2017-01-25T13:02:03Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: Weiterentwicklung des Artikels&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=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends [https://forum.fhem.de/index.php/topic,18517.msg MPD] und [https://forum.fhem.de/index.php/topic,62389.0.html Snapcast] sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Wiki-Artikel und auch das beschriebene Modul sind noch in der Implemntierung und noch nicht 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 [https://forum.fhem.de/index.php/topic,18517.msg MPD]-Modul sowie des Multiroom-System [https://forum.fhem.de/index.php/topic,62389.0.html 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 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 eine 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. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:OpenMultiroomOverview.png&amp;diff=18765</id>
		<title>Datei:OpenMultiroomOverview.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:OpenMultiroomOverview.png&amp;diff=18765"/>
		<updated>2017-01-24T06:21:31Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: Unimatrix27 lud eine neue Version von Datei:OpenMultiroomOverview.png hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Überblick des Zusammenspiels der Komponenten beim OpenMultiroom System, hier mit den Backends MPD und Snapcast&lt;/div&gt;</summary>
		<author><name>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=18759</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=18759"/>
		<updated>2017-01-23T21:10:27Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: &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=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends [https://forum.fhem.de/index.php/topic,18517.msg MPD] und [https://forum.fhem.de/index.php/topic,62389.0.html Snapcast] sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Wiki-Artikel und auch das beschriebene Modul sind noch in der Implemntierung und noch nicht 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;
* Integrierte Steuerung des Musikplayers über das [https://forum.fhem.de/index.php/topic,18517.msg MPD]-Modul sowie des Multiroom-System [https://forum.fhem.de/index.php/topic,62389.0.html 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 [https://forum.fhem.de/index.php/topic,18517.msg 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;
== Verwendete Software und Module ==&lt;br /&gt;
Work in Progress&lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=18758</id>
		<title>OpenMultiroom</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=OpenMultiroom&amp;diff=18758"/>
		<updated>2017-01-23T21:09:22Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: Erstversion&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=unimatrix&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:OpenMultiroomOverview.png|mini|400px|Schaubild des Zusammenspiels der einzelnen Komponenten eines Multiroomsystems mit den Backends [https://forum.fhem.de/index.php/topic,18517.msg MPD] und [https://forum.fhem.de/index.php/topic,62389.0.html Snapcast] sowie der Nutzung von Text2Speech]]&lt;br /&gt;
&amp;lt;/div&amp;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;
* Integrierte Steuerung des Musikplayers über das [https://forum.fhem.de/index.php/topic,18517.msg MPD]-Modul sowie des Multiroom-System [https://forum.fhem.de/index.php/topic,62389.0.html 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 [https://forum.fhem.de/index.php/topic,18517.msg 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 [https://forum.fhem.de/index.php/topic,18517.msg 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;
== Verwendete Software und Module ==&lt;br /&gt;
Work in Progress&lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:HOWTOS]]&lt;br /&gt;
[[Category:Unterhaltungselektronik]]&lt;/div&gt;</summary>
		<author><name>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:OpenMultiroomOverview.png&amp;diff=18757</id>
		<title>Datei:OpenMultiroomOverview.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:OpenMultiroomOverview.png&amp;diff=18757"/>
		<updated>2017-01-23T20:33:33Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: Überblick des Zusammenspiels der Komponenten beim OpenMultiroom System, hier mit den Backends MPD und Snapcast&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Überblick des Zusammenspiels der Komponenten beim OpenMultiroom System, hier mit den Backends MPD und Snapcast&lt;/div&gt;</summary>
		<author><name>Unimatrix27</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-MOD-RPI-PCB_HomeMatic_Funkmodul_f%C3%BCr_Raspberry_Pi&amp;diff=17781</id>
		<title>HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-MOD-RPI-PCB_HomeMatic_Funkmodul_f%C3%BCr_Raspberry_Pi&amp;diff=17781"/>
		<updated>2016-12-13T18:07:24Z</updated>

		<summary type="html">&lt;p&gt;Unimatrix27: Alternative Möglichkeit zum Flashen hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=HM-MOD-RPI-PCB.jpg&lt;br /&gt;
|Bildbeschreibung=HomeMatic Funkmodul für Raspberry Pi &lt;br /&gt;
|HWProtocol=HomeMatic&lt;br /&gt;
|HWType=Gateway&lt;br /&gt;
|HWCategory=HomeMatic&lt;br /&gt;
|HWComm=868,3/869,525 MHz&lt;br /&gt;
|HWChannels=n/a&lt;br /&gt;
|HWVoltage=1,8–3,6 V&amp;amp;nbsp;DC&lt;br /&gt;
|HWPowerConsumption=50 mA max.&lt;br /&gt;
|HWPoweredBy=RasPi&lt;br /&gt;
|HWSize=19x41x14mm&lt;br /&gt;
|HWDeviceFHEM=[[HMUARTLGW]]&lt;br /&gt;
|HWManufacturer=ELV / eQ-3 &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das [[HM-MOD-RPI-PCB HomeMatic Funkmodul für Raspberry Pi]] ist eine Zusatzplatine, die auf die GPIO-Schnittstelle des [[Raspberry Pi]] aufgesteckt werden und damit als [[Interface]] zu [[HomeMatic]] Geräten dienen kann.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
(Noch zu ergänzen)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Juni 2016: Beginn der Entwicklung eines FHEM-Moduls (HMUARTLGW) für dieses Interface, beschrieben im Forum unter dem Titel {{Link2Forum|Topic=54511|LinkText=Modul für HomeMatic UART-Modul (RPi) und HomeMatic LAN Gateway}}. Dieses Modul unterstützt gleichzeitig auch das &amp;quot;neue&amp;quot; [[HM-LGW-O-TW-W-EU Funk-LAN Gateway|Funk-LAN Gateway HM-LGW-O-TW-W-EU]].&lt;br /&gt;
&lt;br /&gt;
Juli 2016: [[HMUARTLGW]] wird über FHEM [[update]] verteilt, damit ist dieses Funkmodul offiziell unterstützt.&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung serielle Schnittstelle unter Jessie===&lt;br /&gt;
Diese Beschreibung gilt für Jessie Version 27.05.2016.&lt;br /&gt;
Die Grundlagen findet man hier: [[Raspberry Pi 3: GPIO-Port Module und Bluetooth]]&lt;br /&gt;
&lt;br /&gt;
Die Datei /boot/config.txt um diese Zeile ergänzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;enable_uart=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim PI 3 zusätzlich diese Zeilen ergänzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;dtoverlay=pi3-miniuart-bt&lt;br /&gt;
core_freq=250&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei /boot/cmdline.txt diesen Eintrag löschen:&lt;br /&gt;
&amp;lt;pre&amp;gt;console=serial0,115200 &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Den Dienst serial-getty deaktivieren&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;systemctl disable serial-getty@ttyAMA0.service&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei PI 3 den hciuart Service modifizieren: In der Datei /lib/systemd/system/hciuart.service zweimal ttyAMA0 gegen ttyS0 austauschen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sed -i s/ttyAMA0/ttyS0/ /lib/systemd/system/hciuart.service&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Benutzer fhem muss Mitglied in der Gruppe dialout sein!&lt;br /&gt;
Beim PI 3 kann man wegen Timingproblemen den Start von FHEM etwas verzögern. Dazu die /etc/init.d/fhem um sleep 10 am Anfang ergänzen.&lt;br /&gt;
&lt;br /&gt;
Das System unbedingt neu starten!&lt;br /&gt;
&lt;br /&gt;
=== Vorbereitung serielle Schnittstelle unter Wheezy===&lt;br /&gt;
Diese Beschreibung gilt für Wheezy Version Stand 26.07.2016.&lt;br /&gt;
&lt;br /&gt;
Die Datei /boot/config.txt um diese Zeile ergänzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;enable_uart=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei /boot/cmdline.txt diesen Eintrag löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;console=ttyAMA0,115200&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei sollte dann den folgenden Inhalt aufweisen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Dienst serial-getty deaktivieren&lt;br /&gt;
&lt;br /&gt;
in der Datei /etc/inittab wie folgt die Zeile (ziemlich am Ende) mit einer # auskommentieren&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mit folgendem Befehlen überprüfen, dass kein getty auf der Schnittstelle läuft&lt;br /&gt;
&amp;lt;pre&amp;gt;ps -A |grep getty&lt;br /&gt;
cat /etc/inittab&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Randnotiz|RNText=Tipp: Sollte der HM-MOD-RPI-PCB nach der Einrichtung immer wieder den Status zwischen init und disconnect wechseln, alle aufgeführten Punkte erneut kontrollieren! reboot nicht vergessen! In ganz hartnäckigen Fällen von der Stromversorgung trennen!}}&lt;br /&gt;
&lt;br /&gt;
Der Benutzer fhem muss Mitglied in der Gruppe dialout sein! Bitte prüfen:&lt;br /&gt;
&amp;lt;pre&amp;gt;groups fhem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das System unbedingt neu starten!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Kontrolle ===&lt;br /&gt;
Berechtigungen der Schnittstelle kontrollieren&lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /dev/ttyAMA0&amp;lt;/pre&amp;gt; liefert die Ausgabe unter Jessie&lt;br /&gt;
&amp;lt;pre&amp;gt;crw-rw---- 1 root dialout 204, 64 Jul 27 23:39 /dev/ttyAMA0&amp;lt;/pre&amp;gt;&lt;br /&gt;
bzw. unter wheezy&lt;br /&gt;
&amp;lt;pre&amp;gt;crw-rw---T 1 root dialout 204, 64 Aug  9 18:07 /dev/ttyAMA0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definition in FHEM===&lt;br /&gt;
&amp;lt;pre&amp;gt;define myHmUART HMUARTLGW /dev/ttyAMA0&lt;br /&gt;
attr myHmUART hmId xxxxxx&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verwendung AES in FHEM===&lt;br /&gt;
Das Modul beherrscht AES.&lt;br /&gt;
Für weitere Informationen gibt es einen separaten Wiki Eintrag [[AES Encryption]]&lt;br /&gt;
&lt;br /&gt;
=== Logbeispiel ===&lt;br /&gt;
Typischerweise meldet sich das Modul beim Start so:&lt;br /&gt;
   2016.10.06 17:11:16 3: Opening myHmUART device /dev/ttyAMA0&lt;br /&gt;
   2016.10.06 17:11:16 3: Setting myHmUART serial parameters to 115200,8,N,1&lt;br /&gt;
   2016.10.06 17:11:16 3: myHmUART device opened&lt;br /&gt;
   2016.10.06 17:11:17 3: HMUARTLGW myHmUART currently running Co_CPU_BL&lt;br /&gt;
   2016.10.06 17:11:17 3: HMUARTLGW myHmUART currently running Co_CPU_App&lt;br /&gt;
&lt;br /&gt;
=== Firmware Update HM-MOD-RPI-PCB ===&lt;br /&gt;
&lt;br /&gt;
1. Firmware herunterladen&lt;br /&gt;
 wget https://raw.githubusercontent.com/eq-3/occu/28045df83480122f90ab92f7c6e625f9bf3b61aa/firmware/HM-MOD-UART/coprocessor_update.eq3&lt;br /&gt;
2. Flashen der neuen Firmware aus Fhem&lt;br /&gt;
 fhem&amp;gt; set myHmUART updateCoPro /path/to/coprocessor_update.eq3&lt;br /&gt;
&lt;br /&gt;
=== Alternative Methode zum Firmware Update ohne FHEM ===&lt;br /&gt;
&lt;br /&gt;
Sollte das Update über FHEM nicht funktionieren oder FHEM nicht verfügbar sein, kann die Firmware auch wie folgt eingespielt werden (Quelle: [http://heinz-otto.blogspot.com/2016/07/raspberry-pi-homematic-modul.html Ottos Technik Blog])&lt;br /&gt;
&lt;br /&gt;
  sudo su&lt;br /&gt;
  apt-get update &amp;amp;&amp;amp; apt-get -y install libusb-1.0-0-dev build-essential git&lt;br /&gt;
  systemctl stop fhem&lt;br /&gt;
  git clone git://git.zerfleddert.de/hmcfgusb&lt;br /&gt;
  cd hmcfgusb/&lt;br /&gt;
  make&lt;br /&gt;
  # Firmware runterladen&lt;br /&gt;
  wget https://raw.githubusercontent.com/eq-3/occu/ee68faf77e42ed5e3641790b43a710a3301cea7e/firmware/HM-MOD-UART/coprocessor_update.eq3&lt;br /&gt;
  # eigentliches flashen:&lt;br /&gt;
  ./flash-hmmoduart -U /dev/ttyAMA0 coprocessor_update.eq3&lt;br /&gt;
&lt;br /&gt;
== Remoteanbindung - Pi + RPI Modul = LAN Modul ==&lt;br /&gt;
&#039;&#039;Noch in Bearbeitung&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es ist nicht dazu gedacht zwei FHEM Instanzen zu koppeln, sondern das RPI Modul über socat auf dem entfernten Raspi verfügbar zu machen. &lt;br /&gt;
auf dem Pi wo das Modul angeschlossen ist: &lt;br /&gt;
Kein FHEM Zugriff!&lt;br /&gt;
Kein define HmUART_EG HMUARTLGW /dev/ttyAMA0&lt;br /&gt;
Kein define RM_HmUART_EG HMUARTLGW uart://192.168.17.185:2000&lt;br /&gt;
&lt;br /&gt;
Installation auf Remote Instanz&lt;br /&gt;
&lt;br /&gt;
   sudo apt-get install socat&lt;br /&gt;
&lt;br /&gt;
Auf diesem Pi, also wo das Modul steckt:&lt;br /&gt;
&lt;br /&gt;
   sudo socat TCP4-LISTEN:2000,fork,reuseaddr /dev/ttyAMA0,raw,echo=0,b115200&lt;br /&gt;
&lt;br /&gt;
In welcher Datei lege ich diesen Befehl am besten ab damit dieser bei einem Neustart ausgeführt wird.&lt;br /&gt;
Würde die rc.local ohne sudo dafür verwenden.&lt;br /&gt;
&lt;br /&gt;
Auf dem Modul wo FHEM läuft und das Modul Remote angeschlossen werden soll:&lt;br /&gt;
&lt;br /&gt;
   define RM_HmUART_EG HMUARTLGW uart://192.168.17.185:2000&lt;br /&gt;
&lt;br /&gt;
Es handelt sich nicht um sharing der seriellen Schnittstelle und damit &amp;quot;verfügbar machen&amp;quot; des Moduls all over the World!&lt;br /&gt;
Es handelt sich um ein exklusives &amp;quot;Kabel&amp;quot; von Pi zu Pi zur Schnittstelle zum RPI Modul.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PI1:              FHEM -&amp;gt; uart://IP:Port -&amp;gt; Netzwerk -&amp;gt; &lt;br /&gt;
Remote PI2: Netzwerk -&amp;gt; socat listener -&amp;gt; socat serial -&amp;gt; RPI Modul auf PI2&lt;br /&gt;
&lt;br /&gt;
RPI Modul auf PI2 -&amp;gt; serial -&amp;gt; socat -&amp;gt; Netzwerk -&amp;gt; uart://IP:Port -&amp;gt;  FHEM auf PI1&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
Sollten beim Flashen der Firmware hartnäckige Probleme auftreten (kein Erfolg aber auch gar keine Fehlermeldungen) ist das Modul vom Strom zu trennen, ein Neustart des Pi reicht nicht!&lt;br /&gt;
&lt;br /&gt;
Ein {{Link2Forum|Topic=41203|Message=340320|LinkText=Beitrag}} aus dem genannten Forenthread: &#039;&#039;Das Ding ist anscheinend wirklich einfach das Funkmodul aus der CCU2 (wird zumindest in der eQ-3 SW als CCU2 angesprochen) und spricht ein für Fhem vollkommen neues Protokoll.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=41203|LinkText=Forenthread}} mit Nachfrage zur Unterstützung dieses Geräts in FHEM&lt;br /&gt;
* {{Link2Forum|Topic=54511|LinkText=Modul für HomeMatic UART-Modul (RPi) und HomeMatic LAN Gateway}}&lt;br /&gt;
* [http://www.elv.de/homematic-funkmodul-fuer-raspberry-pi-bausatz.html Produktseite] bei ELV&lt;br /&gt;
* {{DocLink|elv|/Assets/Produkte/10/1040/104029/Downloads/104029_lan_gateway_um.pdf Bedienungsanleitung}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Raspberry Pi]]&lt;/div&gt;</summary>
		<author><name>Unimatrix27</name></author>
	</entry>
</feed>