Eine Abhandlung über den Wahnsinn der Netzwerksteuerung

Heimkino-Automatisierung im Großformat

Ich gehöre zu den Leuten, die sich etwas in den Kopf setzen und das dann durchziehen müssen. Seit ich das Heimkino zu meinen Hobbies zähle — das sind nun bald 20 Jahre — hege ich den Wunsch nach einer vollständigen Heimkino-Automatisierung, also dem automatischen Ablauf einer Filmvorführung. Jeder Filmvorführung. Es trägt einfach erheblich zur Kino-Atmosphäre bei, kein DVD-Menü zu sehen und nicht fünf Knöpfe drücken zu müssen um den Film zu starten.

Einstellungen für Lautstärke und Sound-Decoder am AV-ReceiverDie inzwischen in den meisten Geräten verfügbaren Netzwerkschnittstellen bieten diese Möglichkeit zum ersten Mal tatsächlich. Ich habe zuvor einige Versuche mit individuell konfigurierbaren Universalfernbedienungen unternommen — zuerst mit einer Philips Pronto, später mit einer Logitech Harmony. Das Ergebnis war immer das selbe: Zwar lassen sich mit Makros gewisse Ereignisse automatisieren — in erster Linie das Einschalten der Geräte, der Filmstart und das Ende — aber trotzdem muss immer noch der richtige Knopf zum richtigen Zeitpunkt gedrückt werden. Auf Besonderheiten einzelner Filme kann man damit nicht eingehen, zum Beispiel auf Filme, die eine Pause erzwingen, weil sie auf zwei Discs verteilt sind. Wenn Publikum zu Besuch ist und man eine saubere Vorführung haben möchte, ist das schon etwas unentspannt.

Wie cool wäre es denn, einfach gar nichts mehr machen zu müssen? Zugegeben, den Film einzulegen, sich durch das Menü zu quälen und den Film bei 00:00:00 zu pausieren wird als Vorbereitung nicht ausbleiben. Zumindest nicht, solange man Filme in hoher Qualität von der Original-Scheibe sehen will. Alles weitere kann aber vollständig automatisiert ablaufen. Wie ich dieses Ziel erreicht habe, will ich hier beschreiben.

Warum so kompliziert?

Unter Netzwerksteuerung versteht man schlicht und einfach das Bedienen der Heimkinogeräte — also Receiver, Player, Projektor, Licht und eventuell ein paar andere — über ein Netzwerkkabel oder WLAN. Alle Geräte hängen im heimischen Netzwerk. Die Möglichkeit der Netzwerksteuerung haben die Hersteller geschaffen, um Apps entwickeln zu können, mit denen die Geräte komfortabel vom Smartphone oder Tablet aus bedient werden können. Dem gegenüber steht die klassische Infrarot-Fernbedienung, die beim Gerät mitgeliefert wird. Anstatt 5 Fernbedienungen auf dem Tisch zu verteilen, legt man sich meist eine Universalfernbedienung zu, die alle in sich vereint, aber letztendlich nach dem selben Prinzip arbeitet.

Wenn es das alles schon gibt, warum betreibe ich den Aufwand, eine eigene Steuerung zu entwickeln? Um die volle Kontrolle zu haben. Die braucht man nämlich für die totale Heimkino-Automatisierung.

Zunächst einmal ist meine Steuerung im Vergleich zu den Hersteller-Apps das, was die Universalfernbedienung zu den Original-Fernbedienungen ist. Es ist eine Universalfernbedienung auf App-Basis, sozusagen eine Universal-App.

Das Gehirn der Heimkino-Automatisierung: Die Ausgabe des Servers während dem Betrieb – hier wird gerade Musik von Kodi abgespielt.
Ausgabe des Servers im Betrieb: hier wird gerade Musik von Kodi abgespielt.

Dadurch, dass ich alles selbst entwickle, habe ich die volle Kontrolle darüber, was in der App zu sehen ist, wie Buttons angeordnet sind und wie die einzelnen Elemente funktionieren. Der eigentliche Zauber passiert aber im Hintergrund. Ein kleiner (wirklich kleiner) Server, der auf einem NAS oder Raspberry Pi laufen kann, überwacht permanent den Zustand aller Geräte, und was diese gerade machen. So kann der Server bei bestimmten Ereignissen eingreifen und selbstständig agieren.

Ganz nebenbei ist der Server für die Auslieferung der App zuständig. Weil diese eine ganz normale Anwendung auf Basis von Webtechnologien ist, kann sie auf jedem beliebigen Gerät ohne vorherige Installation verwendet werden, egal ob Android, iPhone oder Windows — Smartphone, Tablet oder Desktop. Jedes Gerät, das einen Browser hat, kann die App ausführen. Einzige Voraussetzung: Es muss im heimischen Netzwerk angemeldet sein.

In den folgenden Abschnitten gebe ich Euch ein paar Beispiele, wofür ich die volle Kontrolle über alle Geräte benötige. Vieles dürfte dann klarer werden.

Events

Auf einer Universalfernbedienung hat man üblicherweise zwei Tasten, um beispielsweise die Lautstärke zu regeln. Vielleicht gibt es auch noch Buttons auf dem Touch Screen. Was aber fehlt, ist die Anzeige der aktuellen Lautstärke. Eine normale Fernbedienung kann die Lautstärke des Gerätes nicht kennen, weil es über Infrarot keinen Rückkanal gibt. Die Apps hingegen zeigen die Lautstärke an, weil sie sie über die Netzwerkschnittstelle abfragen können.

Das ermöglicht eine ganz andere Art von Benutzeroberfläche. Ein Blick auf das Display am Gerät ist kaum noch nötig. Nicht nur die Lautstärke lässt sich abfragen, sondern auch alle anderen Einstellungen:

  • Eingangswahl
  • Soundprogramm
  • Decoder
  • Informationen zur aktuell gespielten Quelle
  • Gerätekonfiguration
Wie eine ganz normale App: Verknüpfung zur Heimkino-Steuerung auf dem Startbildschirm
Wie eine ganz normale App: Verknüpfung zur Heimkino-Steuerung auf dem Startbildschirm

Wenn MP3-Dateien abgespielt werden, kann man sich sogar das Cover herunterladen. Was will man mehr? Ach ja richtig: Woher soll die App wissen, wann sich diese Informationen ändern, damit sie sie aktualisieren kann?

Die Lösung sind Events. Die meisten Geräte bieten die Möglichkeit, Ereignisse in einen Kanal im Netzwerk zu senden. Die App kann an diesem Kanal mithören und wird so über die Ereignisse informiert. Der Weg ist bedingt durch die zugrunde liegende Technologie ein etwas anderer, als die reine Steuerung. Wie John Hammond sagte: „Das ist etwas komplizierter, als das Küchenlicht einzuschalten.“

Aber auch wenn ein Gerät nicht in der Lage ist, Events zu senden oder man es (aufgrund der mangelnden Dokumentation) nicht schafft, mit diesen umzugehen, kann man sich relativ einfach behelfen. So frage ich manche Informationen zum Beispiel alle paar Sekunden vom Gerät ab und prüfe selbst, ob sich bestimmte Werte geändert haben. Das Ergebnis ist das selbe, nur mit bis zu drei Sekunden Verzögerung. Darauf kommt es aber meistens nicht an.

Eine Ansicht der App in einem gewöhnlichen Desktop-Browser
Eine Ansicht der App in einem gewöhnlichen Desktop-Browser

Mit Automatisierung hat das bisher noch nicht viel zu tun. Ich nutze Events aber nicht nur, um den aktuellen Status aller Geräte in der App anzeigen zu können. Eines der wichtigsten Ereignisse ist es, wenn das aktuelle Abspielgerät (Blu-ray-Player oder Kodi) den laufenden Titel wechselt. Das tritt immer dann auf, wenn

  • ein Film beginnt oder endet
  • das laufende Musikstück wechselt
  • oder auch der Vorspann einer DVD oder Blu-ray durchläuft: Trailer, FSK- und Copyright-Hinweis, Menüs — das sind alles einzelne kurze Filme, technisch gesehen.

Das ist mein Ansatzpunkt für die Heimkino-Automatisierung. Eine Filmvorführung kann automatisiert werden, sobald ich als Entwickler die Information zur Verfügung gestellt bekomme, ob gerade etwas abgespielt wird, was da gerade läuft und wie fortgeschritten die Wiedergabe ist. Alles weitere ist Fleißarbeit und etwas Kreativität.

Mehr dazu unten zum Thema Autopilot. Aber zuerst starten wir mal einen Film.

Start-Timer

Eine ganz wesentliche Sache, die für echte Kino-Atmosphäre sorgt, ist es, nicht zu wissen, wann der Film los geht. Das beinhaltet auch, nichts machen zu müssen, um den Film zu starten.

Filmstart über Timer oder Button sowie Anpassung von Optionen während dem Filmverlauf
Filmstart über Timer oder Button sowie Anpassung von Optionen während dem Filmverlauf

Mit den meisten handelsüblichen Universalfernbedienungen kann man den Filmstart auf einen einzigen Tastendruck reduzieren, indem man ein Makro anlegt. Das Makro führt alle notwendigen Aktionen der Reihe nach aus: Musik stoppen, Eingang wählen, Licht aus, Lautstärke anpassen, Film ab.

Die etwas besseren Modelle bieten Timer als Möglichkeit, Funktionen zeitverzögert auszuführen. Es wird also beispielsweise 30 Sekunden gewartet und dann das Makro ausgeführt. Wenn es diese Funktion nicht gibt, fügt man einfach eine entsprechende Verzögerung fest am Anfang in das Makros ein.

Der Nachteil daran: Es besteht meistens keine Möglichkeit, den Timer für jede Vorstellung zu variieren. Einmal will ich vielleicht 5 Minuten warten, weil ich noch Popcorn machen und was zu trinken organisieren will (und als Brillenträger kommt man auch nicht drum herum, nochmal die Brille zu putzen). Ein anderes mal will ich nicht lange warten oder direkt ohne Verzögerung beginnen.

In die App habe ich hierfür einen Filmstart-Timer eingebaut, der all das löst und noch mehr bietet:

  • Im Countdown-Modus wird eine beliebige Zeit sekundengenau eingestellt. Sobald die Zeit abgelaufen ist, startet der Film. Der Timer steht standardmäßig auf 2 Minuten.
  • Alternativ kann ich den Film zu einer bestimmten Uhrzeit starten lassen. Das ist dann noch ein wenig mehr wie Kino, und wahrscheinlich sogar pünktlicher. Der Standardwert wird ausgehend von der aktuellen Uhrzeit berechnet und auf volle 5 Minuten aufgerundet.
  • Will ich sofort starten, habe ich immer noch den Start-Button.

Nun kann ich also gemütlich den Timer stellen und die App dann beiseite legen. Der Film startet vollkommen automatisch zur voreingestellten Zeit.

Autopilot

Ganz anders sieht es aus, wenn der Film endet. Das ist deutlich schwieriger, als einen Timer zu programmieren. Bisher habe ich einfach die richtige Taste im richtigen Moment gedrückt. Wie eingangs erwähnt ist das ausgesprochen unentspannt. Man sitzt halt mit dem Finger über dem Makro da und wartet den richtigen Moment ab. Dabei könnte man längst die Chipstüte aufräumen oder die Gläser einsammeln.

Filmende mit Lichtsteuerung und manueller Abschaltung – die Basis der Heimkino-Automatisierung
Filmende mit Lichtsteuerung und manueller Abschaltung

Erschwerend kommt hinzu, dass das Licht wieder an gehen muss, und zwar nicht erst zum Ende des Abspanns, denn man will ja nicht die ganze Zeit im Dunklen sitzen. Gäste können den Abspann nutzen, um sich schon mal vor der Toilette anzustellen, denn ich erwarte von niemandem, dass er sich das ansieht — auch wenn ich den Abspann gerne nutze, um den Film nochmal Revue passieren zu lassen (oder wieder wach zu werden). Jedenfalls brauchen sie dazu Licht.

Das lässt sich nicht über einen einfachen Timer regeln. Zum einen kann es vorkommen, dass ich den Film kurz unterbrechen muss, was jeden fest eingestellten Timer sofort aus der Fassung bringen würde. Zum anderen muss das Licht je nach Film zu einem anderen Zeitpunkt eingeschaltet werden, denn nicht jeder Abspann ist in langweiligem Weiß auf Schwarz gehalten. Ich schalte das Licht in zwei Stufen ein: zuerst gedimmt, dann kurze Zeit später voll. Und es gilt zu berücksichtigen, dass viele Filme eine Post Credit Scene haben, für die das Hauptlicht nochmal heruntergefahren wird, damit man auf der Leinwand was erkennt.

So viel zu den Anforderungen. Hierfür war eine sehr ausgefeilte Lösung erforderlich. Überlegen wir aber erstmal, welche Möglichkeiten wir haben.

Lösungsansätze

Das Ende des Films zu erkennen ist nicht weiter schwer. Alles was man wissen muss, ist die Gesamtspielzeit und die Zeit, die schon verstrichen ist. Beides liefert uns der Blu-ray Player oder Kodi, wenn wir sie nett fragen.

Da man den Film zwischendurch pausieren oder Stellen überspringen kann, wird die aktuelle Spielzeit einfach alle paar Sekunden abgefragt. Alle anstehenden Ereignisse werden dabei aktualisiert. Das funktioniert für das Filmende, aber auch für jedes beliebige andere Ereignis mitten im Film. Ein Problem weniger.

Doch wie findet man heraus, wann der Abspann beginnt und das Licht eingeschaltet werden muss?

Erweiterte 3D- und Bildeinstellungen für den Projektor
Erweiterte 3D- und Bildeinstellungen für den Projektor

Ein Ansatz wäre, das letzte Kapitel der Disc abzupassen und dabei das Licht einzuschalten — vielleicht mit ein paar Sekunden Verzögerung. Das habe ich verworfen, weil es viel zu unzuverlässig wäre. Es gibt keine Garantie, dass das letzte Kapitel wirklich der Abspann ist. Wenn der Film eine Post Credit Scene hat, ist der Abspann meistens das vorletzte Kapitel. Viele alte Filme haben keinen nennenswerten Abspann, auf den man sich berufen könnte. Zu guter Letzt gibt es Discs ohne Abspann, zum Beispiel die erste Scheibe eines zweigeteilten Films.

Eine andere Idee, die mir in den Sinn kam: das Bildmaterial auswerten und auf abspann-typische Inhalte prüfen. Nein, vergessen wir das schnell wieder. Das HDMI-Signal kann man wegen des Kopierschutzes nicht abgreifen, weshalb man auf eine auf die Leinwand gerichtete Webcam oder eine ähnlich schlechte Lösung zurückgreifen müsste. In jedem Fall wäre zusätzliche Hardware erforderlich. Der Aufwand, die Bildinhalte zu analysieren wäre immens, ganz zu schweigen von den Datenmengen. Und mal ehrlich, wie abgefahren wäre das denn bitte?

Zuletzt bliebe schließlich noch das Problem, dass es immer Filme mit Ausnahmen gibt, und zwar viele davon. Ein Abspann, der keinen schwarzen Hintergrund hat oder geschnittene Szenen zeigt, fiele einfach durchs Raster. Dunkle Stellen im Film würden wiederum unerwünschte Ergebnisse liefern.

Es musste eine andere Lösung her, die zudem flexibler ist, individuell auf einen Film angepasst werden kann und kein Fehlerpotenzial in sich birgt.

Noch eine Filmdatenbank

Daher entschied ich mich schließlich für eine Datenbank-Lösung. Damit kann zu jedem Film eine individuelle Konfiguration gespeichert werden. Als hätte man als Heimkino-Betreiber nicht schon genug Filmdatenbanken, in denen man seine Schätze verwaltet. Gerade deshalb musste diese Datenbank auch befüllt werden können, ohne viel Aufwand damit zu haben. Es sollte praktisch alles nebenbei von alleine gehen.

Zunächst habe ich, um die Dinge einfach zu halten, einen Ansatz auf Basis von Textdateien gewählt, genauer gesagt im JSON-Format. In einer Node.js-Umgebung ist das ja naheliegend. Noch näherliegender wäre es gewesen, eine dokumentenbasierte Datenbank wie MongoDB einzusetzen. Aber ich sehe große Vorteile darin, alle Daten im Klartext vorliegen zu haben und unabhängig von der App Änderungen daran vornehmen zu können.

// 023349-BD-1-1.json

{
   "id": [
      "023349",
      "BD",
      1,
      1
   ],
   "info": {
      "title": "Inglourious Basterds",
      "version": "",
      "year": 2009
   },
   "markers": [
      {
         "time": 9055000,
         "action": "light-phase1"
      },
      {
         "time": 9091000,
         "action": "light-phase2"
      }
   ],
   "settings": {
      "terminate": "shutdown",
      "volumeAdjustment": -1,
      "dialogLevel": 0,
      "lfeLevel": 0
   }
}

Dieses Beispiel zeigt die Konfiguration für den Film Inglourious Basterds. Im einzelnen bedeuten die Angaben folgendes:

  • Die ID des Films identifiziert diesen eindeutig — unabhängig von Angaben durch den Benutzer. Sie besteht aus
    • der Spielzeit des Films im Format HHMMSS
    • dem Typ der Disc (BD, DVD, o. ä.) oder FILE, wenn es sich zum Beispiel um eine Datei von USB handelt
    • dem Kapitel des Films auf der Disc oder der Dateiendung bei einer Videodatei (MKV, MP4 o. ä.)
    • einer fortlaufenden Nummer, falls alle vorherigen Angaben nicht eindeutig genug waren.

    Alle diese Angaben können automatisiert vom BD-Player oder Kodi ausgelesen werden. Sobald der Film wieder eingelegt wird, erkennt das System ihn anhand seiner Spielzeit wieder. Da verschiedene Filme die selbe Spielzeit haben können, dient das Kapitel und die Art der Disc als zusätzliche Unterscheidungskriterium. Zur Not greift die Nummerierung, was in seltenen Fällen dazu führt, dass man als Benutzer eine Auswahl treffen muss.

  • Weiter geht es mit einigen Informationen zum Film, die in der App angezeigt werden können. Dazu gehören:
    • Titel
    • Version (Kinofassung, Director’s Cut, etc.)
    • Jahr

    Die Angaben dienen später als Kontrolle, dass der richtige Film geladen wurde.

  • Als nächstes folgt der Hauptteil, eine Sammlung von Markierungen. Diese können einerseits dazu dienen, wie der Name schon sagt, eine bestimmte stelle im Film zu markieren. Ein Lesezeichen sozusagen. Gleichzeitig haben sie in der Regel aber eine Funktion:
    • Die Position der Markierung wird in Form der vergangenen Spielzeit angegeben (in Millisekunden seit dem Beginn).
    • Die Aktion gibt an, welches Ereignis bei erreichen der Markierung ausgeführt werden soll. Typische Ereignisse sind:
      • Licht Phase 1 (gedimmt an, zu Beginn des Abspanns)
      • Licht Phase 2 (voll an, kurze Zeit später)
      • Post Credit Scene (Lichter aus, die die Leinwand direkt anstrahlen)
      • Ende Post Credit Scene (alle Lichter wieder voll an)

      Jedes beliebige andere Ereignis ist denkbar, wird in der Praxis bisher aber kaum benötigt.

  • Zuletzt gibt es einen Abschnitt mit allgemeinen Einstellungen zum Film. Dieser enthält Anpassungen der üblichen Einstellungen des AV-Receivers und globale Vorgaben.
    • terminate gibt an, was passieren soll, wenn der Film abgelaufen ist (d. h. wenn die volle Spielzeit erreicht ist). Mögliche Werte sind
      • shutdown: Projektor abschalten und zurück zur Pausenmusik
      • break: zurück zur Pausenmusik, aber Projektor laufen lassen (Bild nur schwarz machen)
      • off: nichts machen
    • volumeAdjustment definiert die Abweichung von der üblichen Lautstärke. Meine Standardlautstärke steht zum Beispiel bei -27.0 dB. Ist ein Film zu laut abgemischt, kann hier beispielsweise -2.0 hinterlegt werden. Dann wird dieser Film immer mit -29.0 dB wiedergegeben. Die Angabe ist relativ. Würde ich als neue Standardlautstärke -24.0 dB definieren, weil ich in Zukunft immer lauter hören will, würde dieser Film immer mit -26.0 dB wiedergegeben. (Tatsächlich verwende ich drei Standardlautstärken — leise, normal und laut — für die ich mich vor Filmbeginn abhängig von Tageszeit und Anwesenheit von Mitbewohnern entscheide.)
    • dialogLevel speichert eine Einstellung, die Yamaha-Receiver ermöglichen. Bei Filmen mit zu leise abgemischten Dialogen (bestes Beispiel: Interstellar) kann so die Dialog-Lautstärke auf ein verständliches Maß angehoben werden.
    • lfeLevel speichert die Anpassung der Subwoofer-Lautstärke. Bei Filmen mit zu viel oder zu wenig Bass kann dieser so angepasst werden, damit es nicht zu einem unerwünschten Besuch der Nachbarn kommt.

Ein Großteil der zu erfassenden Daten wird automatisch ermittelt. Die ID unterliegt ohnehin den Befugnissen des Autopiloten und kann nicht geändert werden. Die Filminformationen werden wenn möglich automatisch ausgelesen (aus dem Dateinamen oder der Kodi-Datenbank, sofern entsprechendes Material vorliegt) oder können zur Laufzeit des Films direkt in der App eingegeben werden (bei Discs im Allgemeinen erforderlich). Die Markierungen und ihre zugehörigen Aktionen werden automatisch erfasst, wenn ich die entsprechenden Aktionen manuell ausführe. Das System merkt sich sozusagen, was ich gedrückt habe, und wann ich es gedrückt habe. Die allgemeinen Einstellungen werden bei Bedarf über die App am Gerät gesetzt und dann automatisch für die Datenbank ausgelesen.

Kontrolle der Beleuchtung per Funk über den jbmedia Light-Manager: ein absolutes Muss für die Heimkino-Automatisierung
Kontrolle der Beleuchtung per Funk über den jbmedia Light-Manager

Der komplexe und wichtige Teil sind eigentlich die Markierungen, zu welchen Zeitpunkten die Aktionen „Licht an“ ausgeführt werden müssen. Wie jetzt zu erkennen sein dürfte, sieht mein Einsatz dieser Datenbank vor, dass alle notwendigen Informationen automatisch erfasst werden, wenn der Film zum ersten Mal läuft. Sobald ich ihn nochmal anschaue, können die Informationen vom System verwendet werden, um meine Handlungen zu kopieren.

Und schon haben wir eine vollständige Heimkino-Automatisierung. Der Filmstart erfolgt kurzfristig geplant oder nach Belieben auf Kommando. Das Licht geht je nach Film individuell im richtigen Moment an und bei Post Credit Scenes nochmal kurz aus. Sobald der Film abgelaufen ist, schaltet das System ohne weiteres Zutun wieder zur Pausenmusik um. Was will man mehr?

Da ich Filme, die ich kaufe, sowieso mehrmals anschaue — und beim ersten Mal meistens alleine — durchläuft jeder Film erstmal das „Einmessen“, also das Ermitteln der Zeitpunkte für die Lichtschaltung. Sobald es dann eine Vorführung mit Gästen gibt, ist schon alles bereit für den vollständig automatisierten Ablauf, den ich besonders in dieser Situation haben möchte. Die App teilt mir zudem mit, ob es schon einen Datensatz für den aktuellen Film gibt — ich weiß also immer, ob das Licht von selbst an gehen wird, oder ob ich noch aktiv werden muss.

Wapp

Die bis hierhin beschriebene Funktionalität der App war mit Abstand der aufwändigste Teil. Man erkennt daran glaube ich ganz gut, dass ein kommerzielles Produkt so etwas nicht leisten kann. Obwohl der Kern der Sache unabhängig von der eingesetzten Hardware arbeitet, ist doch alles sehr stark auf mein Kino und meine Gewohnheiten einer Filmvorführung zugeschnitten.

Der letzte Anwendungsfall, den ich hier vorstellen möchte, wirkt dagegen wie eine Kleinigkeit. Das ist es im Grunde auch. Trotzdem ist das für mich so nützlich und gleichzeitig so ein witziger, spontaner Einfall, dass ich es Euch nicht vorenthalten möchte.

Die Wife-App

Die WAPP: Filminformationen abfragen und Nachrichten direkt ins Bild senden
Filminformationen abfragen und Nachrichten senden

Unter dem inoffiziellen Namen Wife-App, kurz WAPP, habe ich eine zweite App aufgesetzt. Technisch gesehen ist es eine abgespeckte Kopie mit deutlich weniger Buttons und ohne konkrete Steuermöglichkeit. Sie läuft parallel auf dem selben Server (es ist einfach nur eine andere HTML-Datei).

Wie der Name vermuten lässt, ist diese App für meine bessere Hälfte gedacht. Sie sitzt zwar auch regelmäßig mit im Kino, ihr Filmgeschmack ist aber deutlich kritischer als meiner, so dass ich viele Filme auch alleine anschaue, während sie sich von den Serien im TV-Programm berieseln lässt.

Die Wapp bietet ein paar wenige aber sehr nützliche Funktionen für sie. Keine davon greift direkt in die Steuerung ein — obwohl das natürlich ohne weiteres möglich wäre.

Abfrage der Restlaufzeit

Mit einem Button kann abgefragt werden, wie lange der Film im Kino noch läuft bzw. zu welcher Uhrzeit er beendet sein wird. Das erspart mir vor dem Film die Frage „Wie lange guckst du?“, die ich sowieso nicht beantworten kann, weil ich meistens spontan entscheide, was in den Player kommt, oder ich die Spielzeit nicht genau kenne.

Die Zeit wird bei jeder Abfrage neu ausgelesen. Sollte ich eine Pause einlegen müssen, wird sie danach entsprechend anders berechnet.

Nachrichten

Auch wenn ich das Smartphone zwangsläufig zur Bedienung der App dabei habe, schaue ich während dem Film normalerweise nicht drauf. Eingehende Nachrichten sind mir ziemlich egal, zumindest so lange der Film spannend ist. Für gewisse Nachrichten bin ich trotzdem erreichbar — einfach aus Fairness der Familie gegenüber, wenn ich mich schon fast jeden Abend im Keller verkrieche:

  • Wenn meine bessere Hälfte sich entschließt, nicht auf das Ende des Films zu warten,
  • wenn unsere Tochter eine unruhige Nacht hat,
  • oder einfach nur, wenn der Bass überdurchschnittlich im Wohnzimmer zu spüren ist,
Eine Nachricht direkt auf der Leinwand – gesendet aus der WAPP
Eine Nachricht direkt auf der Leinwand – gesendet aus der WAPP

ermöglicht es die Wapp, mir eine Nachricht direkt ins Bild zu schicken. Der Projektor bietet die Funktion, Textmeldungen auszugeben. Die sind zwar an Schönheit und Vielseitigkeit leicht zu überbieten, erfüllen aber ihren Zweck. Natürlich sind auch eigene Texte möglich. So kann ich nichts verpassen, es sei denn, der Film ist so langweilig, dass ich einschlafe.

Die Einsatzmöglichkeiten der Nachrichten und der Wapp im Allgemeinen sind äußerst vielseitig. Angedacht ist auch schon, Nachrichten schreiben zu können, die erst kurz vor Ende des Abspanns erscheinen, und so nicht den Film stören. Das wäre eine nette Kombination von zwei der oben genannten Techniken. Das eröffnet Möglichkeiten wie „Schatzi, bringst du mir nachher ein Bier aus dem Keller mit?“, auch wenn das in der Form wohl nicht vorkommen wird. Ihr wisst was ich meine.

Ausblick: Das nächste Level der Heimkino-Automatisierung

Dieser Artikel ist so umfangreich geworden, dass sich ein Ausblick lohnt. Wie geht es weiter, was kommt als nächstes? Ich entwickle seit mehr als einem Jahr an dieser App herum. Alles was sie können sollte, kann sie inzwischen — zumindest in Ansätzen.

Navigation in Kodi, in Anlehnung an die offizielle App Kore
Navigation in Kodi, in Anlehnung an die offizielle App Kore

Manches ist noch ein wenig unschön gelöst und soll überarbeitet werden. Ich will nicht sagen, dass die App in einem Beta-Stadium oder nur ein Prototyp ist — dazu setze ich sie schon viel zu lange erfolgreich ein. Sie ist immerhin so fortgeschrittenen, dass ich kürzlich meine Logitech Harmony 900 verkauft habe, weil sie einfach nur noch gelangweilt in der Ecke lag.

Die Benutzerführung möchte ich bald noch stark verbessern. Im Moment scrollt man noch ziemlich viel hoch und runter, besonders bei der Vorbereitung für einen Film. Hier dachte ich eher daran, jeweils nur die Bedienelemente einzublenden, die in der aktuellen Situation erforderlich sind. Das läuft im Moment alles noch ein wenig zu sehr ineinander. Die Apps der Gerätehersteller tun sich da auch recht schwer: man ist oft mehr mit Wischen beschäftigt, bis man die eigentliche Funktion ausführen kann. Das ist auch einer der größten Nachteile gegenüber einer Fernbedienung mit richtigen Tasten.

Einige Änderungen werden sich hinsichtlich der Pausenmusik ergeben. Ich möchte die in Zukunft über Kodi abspielen, weil die USB-Wiedergabe am Yamaha-Receiver nicht ganz optimal ist. Zudem eröffnet mir das die Möglichkeit, den Status des gespielten Titels abzufragen. Damit wird eine neue Option für den automatische Filmstart möglich: wenn das aktuelle Lied zuende ist.

Der Ablauf des Kinoprogramms soll auch wesentlich flexibler werden. Ich möchte Trailer und ein wenig Spaß-Werbung vor dem Film mit Kodi wiedergeben, anschließend aber einen Film vom Blu-ray-Player abspielen lassen. Es dürfte interessant werden, nach Ablauf einer Kodi-Playlist noch den Eingang zu wechseln und dann ein anderes Gerät anzusteuern. Die Schwierigkeit liegt nicht in der Ansteuerung der verschiedenen Geräte, sondern in der Logik des Ablaufs. Das ganze soll ja möglichst flexibel sein und in verschiedenen Kombinationen arbeiten.


Die Möglichkeit zur Kontrolle einer PlayStation: Weil diese keine Schnittstelle bietet, wird die HDMI-Steuerung über den Receiver verwendet.
Die Möglichkeit zur Kontrolle einer PlayStation: Weil diese keine Schnittstelle bietet, wird die HDMI-Steuerung über den Receiver verwendet.

Eine ganze Menge Zeug also, nur um mal eben sein Heimkino komplett zu automatisieren. Aber ich kann für mich sagen, dass sich die Arbeit gelohnt hat.

Schade ist natürlich, dass das alles sehr individuell auf meine Geräte zugeschnitten ist. Zwar ließen sich einzelne Komponenten relativ leicht austauschen, wenn sie per Netzwerk gesteuert werden können, aber auch der ganze Ablauf des Kinoprogramms ist sehr stark auf meine Vorlieben optimiert. Da spielt unter anderem auch die Verkabelung der Geräte und ihre Konfiguration eine große Rolle. Nicht zuletzt verhalten sich unterschiedliche Geräte anders, wenn man bestimmte Funktionen aufruft, was sich mindestens in den Wartezeiten zwischen den Befehlen niederschlägt.

Ich arbeite aber weiter daran, das alles zu verallgemeinern und in möglichst wiederverwendbaren Paketen abzulegen. Vielleicht wird es so tatsächlich einmal möglich, das alles für Hobby-Programmierer zum Download anzubieten. (Bis dahin: Fragen kostet nichts.)

Ich hoffe, dieser etwas umfangreichere Einblick war interessant für Euch und hilft dem einen oder anderen weiter, eine ähnliche Steuerung zu verwirklichen. Ich freue mich über Euer Feedback!

Über Bert Kößler

Ein Kino in den eigenen vier Wänden fand ich schon immer spannend. Meine Leidenschaft gilt vor allem der Einrichtung, Steuerung und Automatisierung. Hier teile ich meine Erfahrungen mit Anfängern und Fortgeschrittenen, die mehr aus Ihrem Heimkino machen wollen.

22 Gedanken zu „Heimkino-Automatisierung im Großformat

  1. Hat wirklich Spaß gemacht den Artikel zu lesen. *Daumen hoch*

    Mach ja sowas ähnliches mit Netzwerksteuerung, hier geht es aber darum Steckdosen zu schalten, bspw. Licht an im Garten, wenn Sonnenuntergang + 5 Minuten (was ja auch jeden Tag anders ist).

    Das mache ich auch per Netzwerk, wusste aber ehrlich gesagt gar nicht (ich schäme mich), dass die anderen Geräte schon von Haus aus eine Netzwerkschnittstelle mitbringen.

    Wo bekommt man den die (technische) Beschreibung des Prokotolls her?
    Bspw. für meinen Fernseher Panasonic TX-L37ETW5. Dafür gibt’s ja ne Android App -> ergo hat das Ding auch eine Netzwerkprotokoll.

    Wo bekomme ich die Beschreibung her? Ist das gleich pro Hersteller oder gibt’s da Foren dazu?

    Meine Idee ist sowas wie „Babyphone an, Licht im Eck aus, wenn Fernseher an geht“. RaspberryPi mit PHP Server läuft sowieso schon…

    Grüße

    Christoph

    1. Hey Christoph alte Hütte 😀

      Das kommt ganz auf den Hersteller an. Die einen haben das in ihrer Bedienungsanleitung mit drin, bei anderen ist es eine separate Anleitung, die es zum Download gibt. Andere, wie Yamaha, machen ein ziemliches Geheimnis draus und man findet nur vereinzelt Informationen, wenn man ein bisschen hartnäckiger googelt. Ich hab mich zuerst mit Bruchstücken begnügt und dann mal den Support angeschrieben. Nachdem ich denen versichert hatte, dass ich keine App damit bauen will, die verkauft werden soll, haben sie mir mehr Material zugeschickt.

      Nimmst du immer noch das ConAir zur Funksteuerung? Gibt’s ja leider nicht mehr. Hab mir überlegt, ob ich das Teil von Brennenstuhl mal probieren soll, obwohl das ziemlich schlechte Bewertungen bezüglich der Reichweite hat. Ich such da noch was vernünftiges, weil mir der aktuelle Light Manager (der einzige mit integriertem Webserver) einfach zu teuer ist.

      Ich kann dir aber echt nur Node.js als Backend empfehlen. Wenn der Server mal was an die Clients melden soll, fluppt das einfach viel mehr.

  2. Hol dir doch das Teil von Brennenstuhl, kost ja nicht all zuviel (~50,- €) und zurückgeben kannst es immer noch, wenn die Reichweite so schlecht ist. Beim ConnAir kann ich mich nicht beklagen, deckt locker das ganze Haus (+Garten) ab.

    Mittlerweile habe ich auch die XML Beschreibung für meinen TV bekommen und kann daraus jetzt mal was kleines Basteln. Yeah!

    Meine Idee ist zu erkennen ob der TV aktuell läuft (leider geht das nur über getVolume() oder dergleichen, die aktuelle Sendung/Programm bekomme ich leider nicht heraus, zumindest habe ich keine Möglichkeit gefunden. ;(

    Würde das mit nem Conrjob prüfen so alle 5 Minuten und aus den Messdaten einen Google Kalender befüllen. Würde gerne mal mein TV Verhalten protokollieren und der Google Kalender wird bei mir sowieso für die Steckdosen Steuerung verwendet.

    Gruß

    Christoph

    1. Die TVs stellen sich doch heute meistens im Netzwerk als Bildwiedergabegeräte zur Verfügung. Das passiert meines Wissens nach über UPnP bzw. über einen Kanal, an dem man mitlauschen kann. Die IP liegt irgendwo im ganz oberen Bereich, irgendwas mit 235. Wenn du da mithören würdest, wüsstest du auch immer ziemlich schnell, ob der TV da ist, und du müsstest nicht mal das Netzwerk vollspammen.

    1. Hallo Andreas,

      danke für das Lob. Ja das stimmt, als Nicht-Programmierer ist man damit ziemlich aufgeschmissen. Es ist kein massentaugliches Produkt wie eine Logitech Harmony, bietet dafür aber auch Features, die die Masse gar nicht will.

      Langfristig will ich einen Stand erreichen, bei dem auch jemand mit wenig technischer Erfahrung und vor allem ohne Programmierkenntnisse etwas damit anfangen kann. Das ist aber ausgesprochen schwierig zu erreichen und wird mit Sicherheit noch lange dauern.

      Viele Grüße
      Bert

  3. Hi, super Artikel, danke dafür!
    Ich finde mich teilweise wieder – auch bei der separaten App mit WAF (Women Acceptance Factor ;-).
    Mein Anwendungsfall ist zunächst viel einfacher:
    Hausautomatisierung mit SPS, Multimediaserver/NAS mit Debian-Linux, Wohnzimmer-Abspieler mit Kodi -> 5.1/beamer und Multiroom mit VLC -> Deckenlautsprecher.
    Nach Vorgabe meiner Frau (Technik darf man nicht sehen) steht der alte Yamaha RX-V430RDS jetzt neben dem (headless)Linux-Server im Technikraum im Keller und wird notdürftig über einen IR Verlängerer im Blindflug bedient.
    Nach einigen erfolgreichen Gehversuchen mit curl Befehlen zu Ansteuerung einer Netzwerksteckdosenleiste traue ich mir auch YNC/YNCA zu und werde vermutlich einen neuen(alten) AV-Receiver kaufen, der YNC/YNCA beherrscht. Eine Anfrage beim Yamaha-Support läuft bereits und insbesondere das einfacher erscheinende YNCA in eine curl einzubauen habe ich noch nicht kapiert…
    Zitat: Vielleicht wird es so tatsächlich einmal möglich, das alles für Hobby-Programmierer zum Download anzubieten. (Bis dahin: Fragen kostet nichts.) Zitatende
    Ich frage hiermit ganz höflich nach den Programmen/Scripten und insbesondere dem so empfohlenen Node.js-Umgebung (was ist das? nie gehört?).
    Ich glaube zwar, alle persönlichen Interaktionen über 4 verschiedene Apps: Yamaha, Unified Remote (Kodi), Wago (SPS-Visualisierung) und Siemens (Heizung) sowie Remote Desktop mit VNC (Linux) machen zu können aber für Timer-Aktionen (cronjobs) und kombilierte Events wären batch-Lösungen sowie eine übergreifende eigene App mit WAF ein Traum…
    Beste Grüße aus Bayern

    1. Hi Thomas,

      da hast Du ja ganz ordentlich was vor!

      Mein Code ist gerade in einer kleinen Umbruch-Phase, weshalb es sinnvoller wäre noch ein paar Wochen zu warten. Ich schlage vor, dass Du Dir mal Node.js ansiehst und entscheidest, ob das was für Dich ist. Du solltest außerdem in JavaScript fit sein und keine Berührungsängste vor HTML und CSS haben. Und dann schreibst Du mich einfach mal per Mail an. 🙂

      Viele Grüße
      Bert

      1. Hi Bert,
        ist alles bereits realisiert, lediglich die IP-Fernsteuerung des AV-Receivers fehlt noch…
        Nein, ich bin nicht fit in JavaScript, weiß nur, daß es das gibt und HTML/CSS kenne ich nur aus der Vergangenheit als ich mal eine eigene homepage mit MS-Frontpage gemacht habe. Ich möchte auch lediglich die YNC/YNCA Befehle in (bash-) scripts verpacken könne und ggf. per cronjob starten. Dafür erhoffe ich mir mit Deiner Lösung ein howto 😉 Insbesondere zu YNCA habe ich bisher nix gefunden… LG Thomas

          1. Hi Bert,
            nach genau 1 Jahr kurzes feed-back:
            1. Yamaha A3030 gebraucht erstanden.
            2. YNC/YNCA Befehle unter Kontrolle.
            3. node-red gelernt und als zentrale Steuer-App zwischen Yamaha und SPS auf dem Debian-Server laufen.
            Nutzung: Alle zu automatisierenden, geräteübergreifenden Dinge, z.B. Weckfunktion mit Rollos hoch, Bayern 3 im Schlafzimmer, Kaffeemaschine in der Küche an.
            4. Für nicht zu automatisierende Dinge nutze ich problemlos unterschiedliche Apps unter Android, Win7 oder Tux.
            5. Ausblick:
            Einbindung einer Wii-Spielkonsole im Wohnzimmer (zur Erinnerung ansonsten sind nur Beamer und Lsp im WZ, Rest im Technikraum in Keller).
            Integration des Beamers (Sony VPL) ohne Netzschnittstelle (heute nur isoliert per IR vom Smartphone)
            Weiter gutes Gelingen!

  4. Hallo Bert,

    ich lese schon seit einiger Zeit dein Blog und es hat mir auch sehr beim Bau meines Heimkinos geholfen – danke dafür.

    Mittlerweile gehen mir aber auch die ganzen Fernbedieungen aufn Keks und ich habe angefangen ebenfalls zu automatisieren. Der Pi ist schon installiert und ich kämpfe im Moment mit Kodi (Tonprobleme und öftere Bildausfälle). Da ich fast alle Filme auf Scheiben habe, möchte ich ungern alles digitalisieren (über 1200 Filme sind einfach zu viel 😉 ).

    Was mich nun mehr interessiert ist, wie du deine Handyapp programmiert hast und wie du die Geräte abfragst. Ich selbst kenne mich mit HTML, PHP, CSS aus. JS ist mir zwar nicht unbekannt, aber auskennen würde ich dazu nicht sagen.

    Vielen Dank für deine Tipps,

    Grüße
    Oliver

    1. Hallo Oliver,

      und wieder einmal werde ich daran erinnert, dass ich dazu mal noch mehr schreiben sollte. Danke dafür! 😉

      Meine App in ihrem momentanen Zustand ist leider kein Sonntagnachmittag-Spaziergang. Mal eben installieren und loslegen ist damit nicht drin. Wenn Du viel Zeit hast und Dich vorab mal ein bisschen mit Node.js beschäftigst, kann ich Dir mal was zuschicken. Anderenfalls würdest Du fast bei Null anfangen, und da wäre es einfacher, wenn Du die Artikel hier in dieser Kategorie nutzt, um Dir das nötige Wissen zu erarbeiten und eigene Experimente zu machen.

      Ich versuche immer noch eine gute Lösung zu finden, wie man das etwas massentauglicher machen kann…

      Viele Grüße
      Bert

      1. Hallo Bert,

        danke für die Info. Ich muss mich auch auf der Arbeit nun mehr mit JavaScript auseinander setzten. Das kommt mir gerade recht :-).

        Ich hätte dennoch eine Frage. Hast du deine Automation auch auf einen RasPi? Wenn ja auf welchem Betriebssystem? Ich habe Raspbian (Jessie) und Kodi 15.2. Allerdings habe ich dauernd Bildausfälle und Tonprobleme. Mit der OSMC läuft alles flüssig und sauber – da bin ich fast am verzweifeln. Da ich noch mit LIRC und einer Steuerung meiner Funksteckdosen arbeiten möchte wäre mir Raspbian eigenlich lieber, oder geht das auch mit OSMC?

        Danke.
        Oliver

        1. Mit Raspbian hab ich Kodi noch nicht probiert. Ich kann mir vorstellen, dass das problematisch ist. Die Leistung muss schon sehr gut optimiert sein, damit alles flüssig läuft. Deshalb kann ich nur spezielle Distributionen wie OSMC oder OpenElec empfehlen.

          Verschiedene Software zur Steuerung sollte sich auch unter OSMC installieren lassen. Ich habe darunter auch schon diverse Tests gemacht, unter anderem ffmpeg, vlc und nginx. Es ließ sich alles installieren, wurden halt diverse Pakete nachgeladen.

          Ich würde Dir empfehlen, für Kodi auf OSMC umzusteigen und diesen Raspberry Pi nichts anderes machen zu lassen. Für diverse andere Experimente würde ich mir einen zweiten Pi holen. Da reicht ja wahrscheinlich auch irgend ein 1er-Modell. Kostet zwar ein paar Euro mehr, ist aber die sauberste Lösung. Gerade im Hinblick auf Updates und Backups ist das auch viel sicherer. Oder Du investierst etwas mehr und nimmst den jbmedia Light-Manager Air für die Funksteckdosen. Das ist dann deutlich komfortabler und vor allem vielseitiger anwendbar.

  5. Hallo Bert,

    Da ich mir in naher Zukunft ein zweites Heimkino zulegen darf (Ja, ein zweites :D) habe ich mir überlegt gehabt, soetwas in die Richtung selber zu machen.
    Nun da ich auf diesen wunderbaren Artikel gestoßen bin, hätte ich die Frage, ob du mir mal die Dateien etc. zuschicken könntest. Ich kenne mich schon sehr gut mit PHP, CSS, Java, … aus und würde mir das sehr gerne mal anschauen und eventuell in mein Heimnetz integrieren 🙂

    Vielen Dank,
    Jan

  6. Hallo Bert,
    ich muß mich bei dir bedanken, du hast eine super interessante Seite und durch dich habe ich Cinemavision u.a. auch mit Aktionen und Lichtsteuerung eingebunden und mein Heimkino völlig automatisiert (vorher hatte ich lediglich Macros).
    So ist es echt ein Luxuss der wirklich jedesmal Spaß macht.
    Ich kann dir dafür gar nicht genug danken.

    Was ich jetzt noch zur Perfektion benötigte, wäre wenn die Credit Scene bei Sekunde xy läuft, Kodi eine aktion (Licht hochdimmen) ausführen würde so wie bei dir oben beschrieben.
    Meine idee war es in jeden Filmordner eine zusätzliche chapter.xml datei zu legen, da es diese Funktion in Cinemavision leider noch nicht gibt.

    Wenn dieses Chapter dann bei Sekunde 5784 erreicht wird soll kodi die Aktion starten. Leider funktioniert das nicht.
    Weist du wo der Fehler liegen könnte oder hast du da einen einfachen Ansatz?
    Bin mir nicht sicher ob man mit Bookmarks oder ähnlichem sowas hinbekommen kann.

    Danke
    Jens

    1. Hallo Jens,

      schön, dass Dir mein Geblubber hier schon weiter geholfen hat. 😀

      Mit einer chapter.xml kommst Du wahrscheinlich nicht weit, weil Kodi die meines Wissens nach nicht unterstützt, und CinemaVision wohl erst recht nicht. Dann müsstest Du ein Kapitel ja auch noch mit einem Script verknüpfen können. Zu viele Hürden.

      In einer CinemaVision-Action kannst Du nicht mit einem sleep://5784 arbeiten, weil das nicht asynchron läuft. Die Action würde für die gesamte Dauer laufen, dann das Licht hoch dimmen und dann erst den Film starten.

      Du bräuchtest einen separaten Prozess, den Du mit der Action einfach nur anstartest und der dann parallel im Hintergrund läuft und nach der angegebenen Zeit den Befehl für das Licht ausführt. Ich könnte mir vorstellen, dass man unter Linux mit einem Bash-Script etwas derartiges machen kann:

      1. Datei im Ordner auslesen und Angaben darin verarbeiten
      2. für die angegebene Zeit warten
      3. Licht-Befehl ausführen

      Ein Bash-Script (*.sh) müsste sich aus einer CinemaVision-Action heraus anstoßen lassen. Das Lesen der Datei und die Zeitverzögerung könnte mit kleinen Tools vielleicht auf System-Ebene funktionieren (weiß nicht, ob sleep dafür das richtige Werkzeug ist).

      Dann sollte das aber auch noch für Post Credit Scenes mit mehreren Befehlen funktionieren.

      Und als letzte Schwierigkeit hast Du noch den Fall, wo Du mal im Film kurz Pause machen musst. Dafür kannst Du aber von Kodi die aktuelle Spielzeit vom Film abfragen und die auswerten.

      Ist alles nicht ganz trivial. Aber ne coole Idee auf jeden Fall, die Daten in einer Datei neben dem Film abzulegen. Es muss ja auch kein Bash-Script sein, was das ganze ausführt. Aber irgendwas mit „programmieren“ solltest Du schon können, um das hinzubiegen. Auf jeden Fall würde ich mich sehr freuen, von Deiner Lösung zu hören.

  7. Hallo Bert,

    Könntest du mir einen Rat geben mit welchem Gerät man Kodi unproblematisch nutzen kann? Ich suche schon lange danach. Weis aber nicht was ich dafür nutzen soll. Über einen Tip wäre ich dankbar.
    Geht auch über EMail.
    Danke im Voraus

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.