Module – Entertainment

Allgemein

Die Entertainment Steuerung kann dazu benutzt werden eine bestehende Entertainment Anlage (TV, Radio, Video) vollkommen in IPS zu integrieren!

Mein Ziel war es, eine Steuerung für meine (!) vorhandenen HiFi und andere Entertainment Geräte zu schreiben, die eine Einfache Anpassung an eine geänderte Verkabelung erlaubt (z.B. nicht 10 Scripts anpassen müssen, nur weil man einen neuen Verstärker oder Fernseher ins System nimmt). Weiteres Ziel war eine Entertainment Steuerung zu schreiben, die auch von anderen Leuten verwendet werden kann und die man modular an die persönlichen Bedürfnisse anpassen kann. Das wiederum gibt mir die Hoffnung, das der eine oder andere eine Erweiterung der Steuerung schreibt, die wiederum ich modular einbinden kann…

Herzstück des ganzen ist wohl die Datei Entertainment_Configuration.ips.php, hier kann man die Konfiguration der Steuerung nach den eigenen Bedürfnissen anpassen. Ich habe die Konfguration eingeteilt in:

  • Geräte: Hier kann man alle physikalischen Geräte definieren inklusive Codes zur Steuerung (IR oder auch TCPIP)
  • Räume: Definition der Räume (Wohnzimmer, Küche, Bad, …). Über die Definition der Sourcen werden dann die jeweiligen Geräte eingeblendet.
  • Sourcen: Dient zur Definition der Verkabelung, hier kann man verschiedene Sourcen definieren für die man jeweils Input, Switch und Output definieren kann.
  • Kommunikation: Hier definiert man die Art der Kommunikation (welcher Script wird zum Senden und Empfangen von externen Signalen (Infrarot, TCPIP, …) verwendet. Zusätzlich kann man für jedes Interface alle benötigten Konfigurations-Parameter hier ablegen (IPAdresse, ID Register Variable, ID Module).

Einige Worte noch zur prinzipiellen Arbeitsweise: Für die Räume und Geräte kann man verschiedene Controls definieren, für Räume noch zusätzlich den ControlType Source bzw. RoomPower, für Devices gibts noch speziell den ControlType „DevicePower“. Über eine Source-Auswahl kann man Steuren welche Input/Output Geräte gerade aktiv sind (z.B. Source1 definiert sich mit Input=VideoRecorder, Switch=Verstärker, Output=TV).

Wird nun ein Raum eingeschaltet ermittelt die Steuerung über die aktuelle Source Konfiguration eine Geräte Liste und schaltet alle benötigten Geräte ein. Zusätzlich kann man auch noch angeben, das Z.B bei einem Gerät auf einen bestimmten Eingang geschaltet werden soll. Wechselt man nun die Quele (Source) werden die neuen Geräte eingeschaltet und die unbenutzten Geräte werden abgeschalten. (:-))

Umgekehrt funktioniert das auch: Ist ein Raum gerade abgeschaltet und man schaltet den Fernseher z.B über die normale Fernbedienung ein, registriert die Steuerung dies und schaltet automatisch die anderen Verbraucher in diesem Raum ein. Mir war an dieser Stelle wichtig, dass man die einzelnen Schaltbefehle zentral an einer Stelle definieren kann und dass die Steuerung selbstständig überprüft, ob das empfange Signal einem Control/Device zugeordnet werden kann.

Supported Controls

  • RoomPower: Dient zum Ein/Ausschalten eines kompletten Raumes
  • Source: Dient zur umschalten der verschiedenen Sourcen (TV, Radio, …)
  • DevicePower: Zum Ein/Ausschalten von Geräten
  • Mute: ermöglicht Stumm schalten von Geräten, wir für einen Raum die Muting Taste im Webfront gedrückt, so ermittelt die Steuerung über die aktuelle Source-Konfiguration welche der aktuell aktiven Geräte ein Muting supported und schaltet das Gerät in den Muting Mode.
  • Volume: Lautstärkeregelung mittels eines “Sliders”, Max/Min Value kann über die Konfiguration eingestellt werden. Man kann in der Konfiguration auch ein Limit angeben, auf diesen Wert ist dann die Eingabe über das Webfront limitiert (nicht so witzig wenn man spät abends versehentlich mal an 95% Marke seines durchaus „potenten“ Verstärkers tippt …).
  • RemoteControl Source: Dieser ControlType ermöglicht die Einblendung von diversen Fernbedienungen. Die Steuerung sucht sich über die aktuell aktive Source die passende Fernbedienung und blendet sie für den Raum ein. Zusätzlich kann noch ein FernbedienungsType definiert werden, über diesen ist es möglich zwischen verschiedenen Versionen der Fernbedienung für das aktuelle Geräte umzuschalten (Programmwahl, Programmierung, Guide, …).
  • RemoteControl Volume:Anstelle eines Sliders für die Lautstärkeregelung kann auch eine Fernbedienung benutzt werden, da die Anbindung eines Sliders normalerweise eine bidirekionale Kommuikation erfordert.
  • iRemoteControl Source: Hier kann man spezielle RemoteControls für mobile Engeräte definieren. Es gibt für das iFront einen eigenen „Einsprungspunkt“, für diesen ist dann die SourceControl auf diese Controls verlinkt.
  • iRemoteControl Volume: Selbiges für Volume Controls. Sollte kein passendes iControl gefunden warden, versucht die Steuerung ein normales VolumeControl zu finden.
  • Programm: Mit der Programm Umschaltung ist es möglich zwischen verschiedenene TV und Radio Programmen umzuschalten und das aktuelle Programm im Webfront anzuzeigen. Die Steuerung kann natürlich keine Wunder bewirken, wenn man den diesen ControlType für zB. Ferseher verwendet und dann das Programm über ein internes TV Menu wechselt oder die Programmtasten in einem Menue anderweitig verwendet kann die Steuerung sehr schnell aus Sync kommen. Ich verwende die Programm Steuerung zur Zeit nur für Tuner und Geräte, die ich fast ausschließlich über das Webfront steuere…

Weiterführende Links

Diskussions Thread

IPSLibrary Main Thread

IPSLibrary Diskussions Thread

Download und Installation

Die Entertainmentsteuerung ist mittlerweile auch komplett in die IPSLibrary integriert und kann von dort geladen werden:

Die Installation gliedert sich wie für alle IPSLibrary Module in 3 Teile:

  • Download
  • Konfiguration
  • Installation

Download und Installation können entweder manuell mit dem IPSModuleManager gemacht werden oder man verwendet das IPSModuleManagerGUI Modul.

  • Anpassen/Einfügen der Konfiguration in Entertainment_Configuration.ips.php. Definition der Kommunikation Interfaces (inklusive ModuleIds, IP-Addressen, VariablenIDs), Geräte, Räume und Sourcen
  • Falls nötig, kann man auch eigene Interface Scripts schreiben und diese durch die Konfigurations-Datei einbinden.
  • Eigene RemoteControls definieren oder einfach einige aus dem Pool der bestehenden verwenden.
  • Ausführen des Scripts Entertainment_Installation.ips.php (vorzugsweise im Root, das Script erstellt einen Order Entertainment und verschiebt sich dann selbst in den Ordner) – das Script erzeugt aus der Configuration alle Variablen (Geräte und Räume) und das Webfront Interface. Sollte die Konfiguration noch nicht den eigenen Vorstellungen ensprechen kann man Teile davon oder alles (nicht die Scripts) jederzeit wieder löschen. Bei der nächsten Installation werden fehlende Teile wieder angelegt. Nachträgliches umbennen von Geräten und Controls wird durch das Setup zur Zeit noch nicht supported, falls nötig – einfach die alten Devices löschen.
  • WebFront – das komplette WebFront Interface wird ebenfalls autom. erstellt

Was muss sonst noch manuell gemacht werden: Die Konfiguration der diversen Interfaces muss noch manuell gemacht werden. Wird aber bei den meisten ohnehin bereits Vorhanden sein (Einrichten von Module für WinLIRC/IRTrans, Module for Socket-Kommunikation …). Genauere Beschreibung der vorhandenen Interfaces befindet sich in einem der Post weiter unten.

Konfiguration

Achtung!

Dieser Abschnitt ist lange nicht vollständig und muss ggf. überarbeitet werden.

Konfiguration

Die Konfiguration erfolg in der Datei Entertainment_Configuration. Zuerst ist die ID des WebFront Configurator’s einzutragen

define ("c_ID_WebfrontConfiguration", 19332 /*[WebFront Configurator]*/ );

Weiterhin ist die Datei in 4 große „Abschnitte“ aufgeteilt:

  • function get_CommunicationConfiguration()
  • function get_RoomConfiguration()
  • function get_DeviceConfiguration()
  • function get_SourceConfiguration()

CommunicationConfiguration

In diesem Abschnitt werden Kommunikationskonfigurationen abgelegt. Die Eigenschaften sind interfacespezifisch und beim entsprechenden Interface dokumentiert.

RoomConfiguration

In diesem Abschnitt werden die Räume konfiguriert. ToDo!

DeviceConfiguration

Für Geräte können verschiedene Eigenschaften definiert werden. Für die Befehle (c_Property_Comm*) muss i.d.R. folgendes konfiguriert werden:

c_Property_CommPowerOn  => array(c_Comm_Onkyo /*name der Kommunikationskonfiguration*/, 'PWR' /*Eigenschaft*/, '01' /*Wert*/),

c_Control_RoomPower

c_Control_DevicePower

Beispiel:

c_Control_DevicePower  => array(
    c_Property_Name     => 'Power',
    c_Property_CommPowerOn  => array(c_Comm_Onkyo, 'PWR', '01'),
    c_Property_CommPowerOff  => array(c_Comm_Onkyo, 'PWR', '00'),
    c_Property_ConnectSocket => c_Comm_Onkyo,
    c_Property_CommPowerOn2  => array(c_Comm_Onkyo, 'PWR', '01'),
    c_Property_CommPowerOff2 => array(c_Comm_Onkyo, 'PWR', '00'),
   ),

c_Control_Source

c_Control_Muting

c_Control_Volume

Beispiel:

c_Control_Volume => array(
    c_Property_Name     => 'Volume',
    c_Property_MinValue        => 0,
    c_Property_MaxValue        => 100,
    c_Property_Limit         => 30,      /*Maximalwert, der über WebFront gesetzt werden kann*/
    c_Property_CommVol   => array(c_Comm_Onkyo, 'MVL', c_Template_Value),
   ),

c_Control_Mode

c_Control_Program

SourceConfiguration

ToDo!

Interfaces

Die Interfaces werden dazu verwendet mit der Entertainment Steuerung zu kommunizieren. Alle Schnittstellen (WinLIRC, Sockets, WebFront) laufen über diese Interfaces. Das hat den Vorteil, dass man bei Änderungen an der Steuerung alle Zugriffe/Funktionsaufrufe relative leicht findet…

Die Kommunikation erfolgt großteils über die Prozeduren Entertainment_SendData und Entertainment_ReceiveData, die die Parameter als Array übergeben bzw. zurückgeben. Der erste Parameter ist immer der Interface-Name, die restlichen sind Kommunikations Parameter – siehe auch meine Example Konfiguration.

Zur Zeit stehen folgende Interfaces zur Verfügung:

  • Entertainment_Interface
  • Entertainment_InterfaceWinLIRC
  • Entertainment_InterfaceOnkyo
  • Entertainment_NetPlayer

Entertainment_Interface

Dieses Script haben alle Variablen (für die eine Möglichkeit zur Änderung im Webfront vorgesehen ist) als ActionScript definiert. Zusätzlich kann dieses Script auch für RegisterVariablen (zb: Socket Kommunikation) und Variablen Events (z.B. WInLIRC) verwendet werden. In diesem Fall sucht sich das Script über die Konfiguration die eigentliche Verarbeitungs Prozedure heraus und leitet die Daten an diese weiter.

Entertainment_InterfaceWinLIRC

Wird verwendet, um mit allen Fernbedienungen zu kommunizieren (inklusive derer, die im Webfront eingebettet sind). Wird durch das Interface ein Remote Signal empfangen, dann wird es als erstes an das Entertainment-System weitergeleitet. Meldet das zurück, dass das Signal NICHT verarbeitet werden konnte (weil unbekanntes Signal), wird es gegebenenfalls an den WinLIRC-Server zwecks weiterer Verteilung zurückgereicht (ich habe mein IR-Trans Service so eingestellt, dass Signale NICHT autom. über alle angeschlossenen Slaves verteilt wird). Zusätzlich kann man bei diesem Interface noch angeben, ob Signale von bestimmten Ferbedienungen als „Action“ oder „Info“ behandelt werden sollen. Info bedeutet, dass die Fernbedienung direkt auf das Gerät gerichtet ist und durch WinLIRC/IrTrans nicht weitergeleitet werden muss (z.B. mein Fernseher empfängt die Signale der Fernbedieung direkt, IPS ist in diesem Fall nur Zuhörer, siehe auch Beispiel-Konfiguration).

Anmerkung: Wenn das Gerät direkten Empfang durch die zugehörige Fernbedieung hat (also nicht in einem Schrank oder dergleichen versteckt ist) kann es zu Synchronisations-Problemen kommen, da zB der Fernseher das Signal noch verwerten kann aber IRTrans nicht mehr (wenn eventuell die Fernbedieung nicht direkt auf die Empfänger gerichtet ist oder sehr viel Sonneneinstrahlung ist).

Weiters habe ich dem WinLIRC noch eine Einfache Möglichkeit zur Übersetzung von IR Signalen verpasst. So ist es zum einen möglich fremde Fernbedienungen an die eigenen Geräte anzulernern (habe es so z.B. eingerichtet, dass eine alte unbenutze Fernbedienung als Steuerung der Zone 2 meines Onkyo Receivers dient. Weiters ist des dadurch möglich ausgehede Signale auf mehrere andere Signale umzuwandeln: z.B das für WinLIRC unbekannte Signal „P1“ wird auf Button „0“ + Button „1“ + Button „OK“ übersetzt.

Entertainment_InterfaceOnkyo

Dieses Interface realisiert die Kommunikation der Steuerung mit meinen Onkyo Receiver über TCPIP. Analog kann auch ein Interface zu einem Pioneer oder anderer realisiert werden. Enthält letztendlich nur die Hersteller spezifischen Feinheiten der Steuerung (Build/Extract der Message Header bzw. Commandos). Auch hier habe ich versucht so viel wie möglich allgemein zu halten, um eine Wiederverwendbarkeit zu erhöhen (Proceduren zum überprüfen und herstellen einer Socket Verbindung sind bereits vorhanden und können reused werden …).
Konfiguration Register Variable und TCPIP-Socket

Für das InterfaceOnkyo über TCP/IP müssen noch folgende Schritte durchgeführt werden:

  • Register Variable erstellen z.B. TX-NR509)
  • Register Variable öffnen und bei Übergeordnete Instanz einen neue anlegen (Weißes Blatt klicken)
  • Client Socket auswählen und zur Bearbeitung öffnen
  • Bei ‚Host‘ des Client Socket die IP des Onkyo Receivers eintrage
  • Als Port den Wert 60128

Die ID’s der Register Variable und des Socket Modules müssen in der Konfiguration eingetragen werden:

c_Comm_Onkyo => array (
c_Property_Script              => 'Entertainment_InterfaceOnkyo.ips.php',
   c_Property_FunctionSend     => 'Onkyo_SendData',
   c_Property_FunctionRegister => 'Onkyo_ReceiveData_Register',
   c_Property_RegisterId       => 45887 /*ID der Register Variable*/,
   c_Property_ModuleId         => 54396 /*ID des Socket Modules*/,
   c_Property_IPAddress        => '192.168.10.200',
   c_Property_Timeout          => 30,
  ),

Der Onkyo Receiver meldet auch Schaltvorgänge oder z.B. Änderungen der Lautstärke über den Socket. Wenn man z.B. die Änderung der Lautstärke am Gerät auch in IP-Symcon sehen möchte, so muss noch folgende Schritte durchführen:

  • Register Variable per Doppelklick öffnen
  • Zielskript auswählen (…\Pfad\zu\Entertainemnt_Interface)
  • mit OK bestätigen

Zum Test einfach mal das WebFront öffnen, und an der Lautstärke drehen. Es sollte sich mit leichter Verzögerung der Wert für die Lautstärke ändern.

Entertainment_NetPlayer

Dieses Interface bindet meinen NetPlayer ein, mit dem man Music Files bzw. Webradios abspielen kann. Die Anbindung des Players an die Entertainment Steuerung erfolgt wieder über diese Interface, zusätzlich hat der Player noch jede Menge eigener Variablen, die unabhängig von der Entertainment Steuerung sind und vom Player direkt angesprochen werden. Die Installation des Players wird ebenfalls durch das Konfigurationsfile getriggert. Es ist möglich für jedes Device noch ein zusätzliches Installation Script zu definieren, dass dann bei der Installation in Entertainment_Installation.ips.php autom. Ausgeführt wird (siehe auch Beispiel Konfiguration wieter unten).

WebFront/iPhone Fernbedienungen

Die RemoteControls werden dazu verwendet, um seine Geräte für das Webfront steueren zu können. Zur Zeit wir als Interface nur WinLIRC unterstützt, Erweiterungen sind aber kein Problem.

Zur Zeit stehen folgende RemoteControls zur Verfügung:

  • Panasonic VCR (Type Simple, Guide und Watch)
  • Panasonic Bluray
  • Onkyo Tuner
  • Yamaha Tuner
  • Yamaha Volume
  • Philips TV Programm (Type Simple und Advanced)
  • Philips TV Volume
  • NetPlayer (Player, CD Auswahl und Webradio)

Beispiel Konfiguration

Habe auch meine eigene Konfguration beigelegt, die man ausprobieren kann, ich habe zur Zeit folgende Verkabelung in Verwendung:

  • Wohnzimmer: Yamaha Receiver, Philips TV,Panasonic VideoRecorder, Tuner(Yamaha), NetPlayer
  • Wellnessbereich: Onkyo Surround Receiver 807 (Main Zone), Projector, Panasonic BluRay, Topfield Kabelreceiver, Panasonic VideoRecorder (den verwende ich mit dem Wohnzimmer gemeinsam), Tuner(Onkyo), NetPlayer
  • Sauna: Onkyo Receiver (Zone 2), Tuner(Onkyo), NetPlayer

In der Konfigurations Datei sind die IDs der Geräte nicht gesetzt, dadurch funktioniert die Steuerung (fast) zur Gänze, es erfolgt aber keine Kommunikation mit den eigentlichen Geräten (WinLIRC, Onkyo Socket …). Die Warnungen, die im Log ausgegeben werden kann man ignorieren – die verschwinden, sobald man im Konfigurationsfile Ids für Module angibt bzw. IP_Adressen angibt (eventuell könnte man hier in Zukunft noch die IP-Adressen aus den Modulen autom auslesen).

Es gibt auch ein File Entertainment_Custom.ips.php, dieses File bietet einem die Möglichkeit die Steuerung an die Feinheiten der eigenen Geräte anzupassen. Es beinhaltet view Call Back Methoden (Before- und AfterReceive bzw. auch Before- und AfterSend, in den Before Prozeduren ist es möglich das Verarbeiten/Senden durch einen Boolean Rückgabewert noch zu unterbinden). Ich habe hier meinen Yamaha Receiver etwas „aufgepeppt“, da mein Receiver z.B. keine Muting Funktion unterstützt, ich diese aber im Webfront zur Verfügung haben wollte, schalte ich im Falle eines Mutings Befehls meinen Receiver auf den Phone Eingang und danach wieder zurück auf die ursprüngliche Source. Weiters habe ich auf diese Weise noch die die Stationstasten für meinen Yamaha realisiert, da er nur über die Tuner Tasten Preset Last/Next verfügt.

Habe mir auch noch einen kleinen NetPlayer gebastelt, der es mir erlaubt meine Musiksammlung abzuspielen. Um diesen nützen zu können, muß man in der Konfigurationsdatei das Directory entsprechend setzen in dem die Musik zu finden ist. Die Directory Namen müssen allerdings einem bestimmten Format entsprechen: „Interpret [Album]“. Zusätzlich bietet Netplayer auch noch die Möglich Webradios abzuspielen, eine entsprechende Auswahl kann man bequem im File „NetPlayer_RadioControl.php“ eintragen.

Screenshots WebFront

Entertainment_WebFrontOverview

Entertainment_WebFrontRoomOff

Entertainment_WebFrontRoomOn

Screenshots iPhone

Entertainment_MobileOverview1 Entertainment_MobileOverview2 Entertainment_MobileRoom Entertainment_MobileSound Entertainment_MobileSource