Entertainment Steuerung

so, is Zeit, mein Winter-Projektchen möchte vorstellig werden …

bastle schon seit längerer Zeit an einer Entertainment Steuerung. Nun habe ich einmal eine Version, die bereits einige Features erfüllt und auch einigermassen stabil läuft (zur Zeit ist eigentlich nur mehr etwas Finetuning an der Konfiguration angesagt). Das schöne für Euch - ich habe es geschafft, dass man die Steuerung zentral konfigurieren kann und an seine Geräte bzw. Verwendete Verkabelung anpassen kann.

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:

[ul]
[li]Geräte: Hier kann man alle physikalischen Geräte definieren inklusive Codes zur Steuerung (IR oder auch TCPIP)
[/li][li]Räume: Definition der Räume (Wohnzimmer, Küche, Bad, …). Über die Definition der Sourcen werden dann die jeweiligen Geräte eingeblendet.
[/li][li]Sourcen: Dient zur Definition der Verkabelung, hier kann man verschiedene Sourcen definieren für die man jeweils Input, Switch und Output definieren kann.
[/li][li]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).
[/li][/ul]

Die Konfiguration ist zugebebenermassen noch immer recht anspruchsvoll, sollte aber von einem Senior IPS‘ler durchaus zu verstehen sein (werde auch noch die einzelnen Controls detailierter beschreiben – ich warte hier mal ab, wie groß überhaupt das Interesse an diesem Ding ist).

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 eingeschalten ermitteln die Steuerung über die aktuelle Source Konfiguration die 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 Source werden die neuen Geräte eingeschalten 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 das und schaltet autom. den 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.

ich supporte zur Zeit folgende Controls:

[ul]
[li]RoomPower: Dient zum Ein/Ausschalten eines kompletten Raumes
[/li][li]Source: Dient zur umschalten der verschiedenen Sourcen (TV, Radio, …)
[/li][li]DevicePower: Zum Ein/Ausschalten von Geräten
[/li][li]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.
[/li][li]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 …).
[/li][li]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, …).
[/li][li]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.
[/li][li]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.
[/li][li]iRemoteControl Volume: Selbiges für Volume Controls. Sollte kein passendes iControl gefunden warden, versucht die Steuerung ein normales VolumeControl zu finden.
[/li][li]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…
[/li][/ul]

So bin schon gespannt, ob der eine oder andere mit dem Ganzen etwas anfängt oder sogar noch weitere Verbesserungen an den RemoteControls vornimmt …

Lg
Andreas

[Update 2011-06-17] - Anpassungen an v2.4
[Update 2012-02-10] Integration in die IPSLibrary

siehe wike: …/wiki/Entertainment_Steuerung

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:

[ul]
[li]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.[/li][li]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).[/li]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.

[li]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 …).[/li]
[li]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).[/li][/ul]

WebFront 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:

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

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

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

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.

Falls jemand noch Verbesserungs Vorschläge hat, sind diese natürlich jederzeit herzlich willkommen (speziell das ganze HTML,CSS und Javascript „Zeug’s“ ist noch nicht wirklich mein Gebiet und bietet entsprechendes Verbesserungspotential…).

Installation wie im Prinzip bereits oben beschrieben:

[ul]
[li]Installation IPSLogger
[/li][li]Scripte kopieren
[/li][li]Um den NetPlayer nuten
[/li][li]Ausführen des Scripts Entertainment_Installation.ips.php
[/li][li]Webfront einrichten – etwas mühselig – aber vielleicht beglückt uns ja unser IPS Team noch irgendwann mit einer Möglichkeit …
[/li][/ul]

… noch ein paar iPhone Screenshots …

und damit das Ganze komplett ist, habe ich auch noch mein UnitTest Scriptchen beigelegt, mit dem kann ich bei Änderung überprüfen, ob zumindest die Grundfunktionen der Steuerung noch funktionieren.

Wird natürlich zum Betrieb der Steuerung nicht benötigt, habs nur beigelegt um Euch etwas Anregung zu geben.

Sollte jemand einen Bug finden, wäre es natürlich toll, wenn er versucht anhand meiner Konfiguration (oder anhand einer Erweiterung) den Fehler nachzustellen …

Entertainment_Unittest.zip (1.95 KB)

Noch ein Wort zu meinen geplanten Erweiterungen:

[ul]
[li]Implementierung von SendDelays nach PowerOn der Geräte, bzw. Zwischen einzelnen Befehlen. Werde noch einen Mechanismus implementieren, dass nach einem PowerOn bzw. Off zu schnell weitere Befehle an ein Gerät gesendet werden (da jedes Gerät eine unterschiedliche Zeit braucht um weitere Befehle nach einem PowerOn verarbeiten zu können möchte ich das Device spezifisch definieren können. Auch die minimal Zeit zwischen 2 Befehlen möchte ich definieren können…). [/li][li]Ich möchte in Zukunft noch geschaltet Steckdosen supporten (d.h. wenn ein IR Power On empfangen wird, zuerst Stromversorgung einschalten, definierte Zeit warten und danach PowerOn des Gerätes. Umgekehrt dann natürlich auch, wenn alle Verbraucher der Steckdose abgeschaltet sind kann auch die Stromversorgung wieder abgeschaltet werden…). [/li][li]Einbindung von Controls zur Steuerung von Beleuchtungen. Auswahl diverser Lichtszenarien direkt über die Entertainment Steuerung (genauere Details habe ich mir noch nicht überlegt, werde die Anbindung aber wieder so flexibel wie möglich machen um diverseste System einbinden zu können – ich selber werde mich wohl in Kürze an die Homematic wagen).[/li][/ul]

Auf einen bestimmten Zeitpunkt möchte ich mich aber nocht nicht festlegen…

Von mir erstmal ein Fettes RESPEKT!!!

Sieht sehr schick aus, auch wenn ich das nicht mit meiner Apple TV Infrastruktur verwenden kann - einfach lecker :).

Mach weiter so ;).

Klasse auch wie du direkt alles auf Weiterverwendbarkeit anderer User auslegst und welche Mühe du dir machst, das alles zu veröffentliche und Dokumentieren.

Hallo Brownson,

da kann ich mich Peter nur anschließen.

Meinen Respekt für die Skripte und die Dokumentation.

Danke für die Blumen,
war ein hartes Stück Arbeit und hat letztendlich doch etwas mehr Zeit in Anspruch genommen als ich dachte. Aber das hat sich für mich in jedem Fall ausgezahlt, da die Steuerung jetzt sehr zuverlässig funktioniert und sich auch sehr leicht warten lässt.

Was die Dokumentation betrifft, so hab ich die schon immer wieder in der Implementierungsphase nebenher geschrieben, teilweise auch schon im vorhinein, als ich noch am überlegen war, was das Ding überhaupt können soll.

Wenn man mal weiß wie, dann sind auch die Installationsprozeduren kein Problem mehr und machen nur mehr minimal mehr Arbeit (schließlich muß man seine Entwicklung und Konfiguration ja auch vom eigenen Testsystem auf das Produktionssystem bringen. Denn wenn man ständig am lebenden Objekt enwickelt, bekommt man auch gleich mal Probleme mit der besseren Hälfte - aber wem erzähle ich das, denke ich jetzt mal …).

lg
Andreas

Das ist doch mal was das man brauchen kann…

supper doku und script funktioniert soweit auch…

Frage dazu kann man dort dann auch das WEBIF für Enigma2 / Dreamboxen
integrieren?

Webinterface Befehle

ich bin da leider derzeit der PHP noob

Gruß
Michael

Hallo Michael,

sollte eigentlich kein grosses Problem sein, schau Dir einfach mal die vorhanden Threads über die Dreambox (z.B. HIER) an und verfrachte den Code in ein eigenes Interface (modifizier einfach mal mein Onkyo Interface Script).

In der Konfiguration gibst Du dann die Befehle an, wie z.B


c_Property_CommPowerOff		=> array(c_Comm_Onkyo, 'shutdown'),

und im Interface sendest Du diese dann:


function Onkyo_SendData ($Parameters)	{
  $command     = $Parameters[0];
  $CommConfig  = get_CommunicationConfiguration();
  $IPAddress   = $CommConfig[$CommInterface][c_Property_IPAddress];
  IPSLogger_Com(__file__, 'Send Message to Dreambox: Command='.$command);
  $xmlResult = new SimpleXMLElement(file_get_contents("http://$IPAddress/cgi-bin/admin?command=$command"));
}

damit sollte sich die Dreambox dann zumindest einmal ausschalten lassen (konnte es aber natürlich nicht testen …)

lg
Andreas

Sieht klasse aus!
Wie sind denn die Iphone Screens mit den ganzen verschiedenen Fernsehkanälen gemacht. Im Webfront oder direkt in HTML?

Würde das für mein Iphone gern nachstricken, aber eben wesentlich einfacher.

Gruss

gros_ibou

Hallo gros_ibou,

die Fernbedienungen sind mit Html bzw. Javascript gemacht, wenn Du einfach nur eine iPhone Fernbedienung machen willst, dann sieht Dir folgende Files an:

[ul]
[li]iRemote.css - enthält die StyleSheets für die iPhone Bedienungen
[/li][li]iRemote_PanasonicBD.php - ist zum Beispiel die eigentliche Fernbedienung für meinen Bluray Player. Einfach die attribute „rc_name“ und „rc_button“ an die eigene Fernbedienung anpassen, die Namen müssen natürlich mit denen in IRTrans zusammenpassen.
[/li][li]RemoteSender.php - wird von der Fernbedienung inkludiert und implementiert das Sender der Befehle mittles jQuery - hier brauchst Du nichts ändern.
[/li][li]RemoteReceiver.php - hier werden die Signale empfangen, hier brauchst Du eigentlich nur den Aufruf der Prozedur „WinLIRC_ReceiveData_Webfront“ durch einen direkten Aufruf von IRTrans ersetzen.
[/li][li]jquery.min.js - wird für die Kommunikation benötigt.
[/li][/ul]

viel Spass
Andreas

Hallo Andreas,

danke für die Info. Ich glaube ich werd mich da jetzt mal reinklemmen. Hab so Zeug noch nie gemacht, aber wird schon werden…
Kannst Du mir noch sagen, in welches Directory die ganzen Files müssen.

Und gibt es nochwas besonderes an das ich denken muss?

Danke!

gros_ibou

die Files liegen in „webfront/user/Entertainment/“, kannst sie auch wo anders hinlegen, dann mußt Du die Pfade in Remote_Sender.php anpassen.

Hab mich mit dem ganzen JavaScript Zeugs am Anfang auch ziemlich schwer getan - FireBug, ein Plugin für den FF zum debuggen von JavaScript kann Dir bei Problem etwas helfen.

Ansonsten versuchs einfach mal …

Wirklich ein super Projekt!
Hab leider derzeit noch nicht viel was ich einbinden könnte aber das kommt schon noch.
Ein Squeezebox-Modul wäre doch z.B. klasse! :wink:

Finde auf jeden Fall auch die Anordnung in deinem Webfront sehr geil!
Schau mir gerade anhand der Steuerung an wir man verschiedene Sachen nebeneinander im Webfront darstellen kann. Hätte ich schon ab und an brauchen können…

LG
Nicolai

Das würde mir auch sehr gut gefallen :D.

Mal sehen, hatte auch schon überlegt, ob ich mir so ein Teil nicht zulegen sollte. Bin aber derzeit noch mit Homematic, Wetterstation Kamera usw. beschäftigt…
lg
Andreas