Anzeige des IP-Kamerabilds auf einem FireTV bei einem Ereignis

Anzeige des IP-Kamerabilds auf einem FireTV bei einem Ereignis

Da wir aus bestimmten Gründen immer noch auf unseren Keller warten, habe ich gezwungenermaßen etwas Zeit für Spielereien 😉 . Die Idee war, dass durch ein Ereignis (Türklingel/Fensterkontakt/Alarm/Sprachbefehl usw.) der Fernseher eingeschaltet und das jeweilige IP-Kamerabild direkt auf dem TV angezeigt wird. Nach einigen gescheiterten Versuchen mit einem Google Chromecast und VLC als RTSP-Stream-Umwandler habe ich mich an einen Lösungansatz mittels Amazon FireTV / FireTV-Stick gesetzt.

Die Voraussetzung für diese Anleitung sind:

ADB (Android Debug Bridge)

Um ein FireTV aus der Ferne steuern zu können, wird die Android Debug Bridge (ADB) benötigt. Dieses Toolset muss auf der Node-Red Plattform installiert werden. Im folgenden Beispiel verwende ich einen Raspberry Pi 3 mit einer aktuellen Loxberry Installation.

Auf dem Raspberry Pi (Loxberry) kann die Installation des ADB Toolset mit folgendem Konsolenbefehl durchgeführt werden:

sudo apt-get install adb

ADB aktivieren

Nach erfolgreicher Installation von ADB muss diese Funktion zunächst auf dem FireTV/FireTV-Stick aktiviert werden. Hierzu zunächst die Einstellungen des FireTV öffnen:

  • In den Einstellungen den Menüpunkt “Mein Fire TV” öffnen

  • Im Menü “Mein Fire TV” den Menüpunkt “Entwickleroptionen” öffnen

  • In den Entwickleroptionen den Punkt ADB-Debugging aktivieren

ADB Verbindung herstellen

Um eine Verbindung via ADB herzustellen, müsst ihr zunächst die IP Adresse eures FireTV herausfinden. Diese könnt ihr, sofern nicht schon bekannt, in den Einstellungen unter Mein Fire TV / Info / Netzwerk auslesen.

Sofern die Installation von ADB auf dem Raspberry Pi funktioniert hat, lässt sich nun mit folgendem Befehl eine ADB Verbindung zu eurem FireTV aufbauen (192.168.178.72 ist dabei die IP Adresse meines FireTV). Der Port 5555 ist fest und darf nicht verändert werden.

adb connect 192.168.178.72:5555

Nach diesem Befehl könnt ihr mittels adb devices die Verbindung eures FireTV überprüfen. Die Ausgabe sollte in etwa folgendermaßen aussehen:

List of devices attached
192.168.178.72:5555 device

Bei einer erfolgreichen Verbindung, könntet ihr nun schon mit folgendem Befehl z.B. Netflix öffnen:

adb shell am start -n com.netflix.ninja/.MainActivity -a android.intent.action.VIEW -d netflix

Starten von tinyCamViewer Pro

Nach der Installation von tinyCamViewer über den Amazon App Store, kann die App via Fernbedienung zunächst gestartet und konfiguriert werden. Wie ihr dort eure IP Kameras einbindet, wird in dieser Anleitung nicht behandelt. Viele Hersteller sind in der App aber bereits voreingestellt sodass die Konfiguration kein Hinderniss darstellen sollte. Sobald eure Kamerabilder in der Live View Übersicht angezeigt werden, könnt ihr mit der Anleitung fortfahren. (Bei euch sollten hier alle benötigten Kameras eingerichtet werden und sichtbar sein. Bei meinem Testaufbau stand mir lediglich eine Kamera zur Verfügung)

Da wir im folgenden Beispiel nicht einfach nur Netflix starten wollen, sondern die CamViewer App starten soll, müssen wir zunächst den dazu passenden Befehl herausfinden. Die einfachste Möglichkeit sich die notwendige Activity anzeigen zu lassen ist, die App zunächst via Fernbedienung am FireTV zu starten und im Hintergrund offen zu lassen. 

Mit Hilfe des folgenden Befehls kann man sich alle offenen und versteckten Fenster des FireTV anzeigen lassen.

adb shell dumpsys window windows

Nun muss lediglich noch das passende Fenster (die passende App) gefunden werden. In dem Fall tinyCamViewer ist dies der folgende Abschnitt:

 

Das relevante Fenster der Ausgabe (Fenster 7)

Der Ausgabe können wir entnehmen, dass die für unser Beispiel interessante Activity folgende Bezeichnung trägt: 

com.alexvas.dvr.pro/com.alexvas.dvr.activity.LiveViewActivity

Der komplette Befehl zum Starten der tinyCamViewer App lautet also:

adb shell am start -n com.alexvas.dvr.pro/com.alexvas.dvr.activity.LiveViewActivity

Die App sollte nun direkt in Die LiveView Ansicht starten. Innerhalb der App lässt sich folgendermaßen navigieren:

  • Anzeige der Kameraübersicht : adb shell input keyevent KEYCODE_0
  • Anzeige Kamera 1: adb shell input keyevent KEYCODE_1
  • Anzeige Kamera 2: adb shell input keyevent KEYCODE_2
  • usw.

Um den Startbildschirm (Home) des FireTV anzuzeigen kann der folgende Befehl verwendet werden:

adb shell input keyevent 3

Steuerung über Node-Red

Um die Befehle flexibel auslösen zu können, habe ich die Kommandos jeweils in eine Exec Node gepackt. Somit kann ich das Starten der App und die Auswahl der Kameras beliebig auslösen. Ob über ein Loxone Event , KNX oder ein sonstiges Ereignis. Am folgenden Beispiel habe ich Testweise parallel zu einer Lichtszene die Kamera 1 als Vollbild darstellen lassen.

  1. Befehl zum App Starten
  2. 500ms warten
  3. Befehl zur Kamera Übersicht
  4. 500ms warten
  5. Kamera 1 auswählen

Das TV Einschalten wird in diesem Beispiel nicht behandelt da hier die Unterschiede pro verwendetem TV zu groß sind. Dies kann aber im Falle Loxone über ein IR Control Air erfolgen. Sollte ein Smart TV im Einsatz sein und dieser über eine brauchbare API verfügen, ist dies natürlich die bessere Wahl. Wer sich nicht sicher ist, wie und ob er seinen TV über Loxone oder Node-Red ansteuern kann, darf mir gerne ein Kommentar unter dem Beitrag lassen oder mir eine E-Mail schreiben. Wir finden bestimmt eine Lösung 🙂

Der folgende Code kann direkt in Node-Red importiert werden. Bei Fragen oder Anregungen gerne Kommentieren und/oder eine E-Mail schreiben.

[{"id":"bda4ea3f.77db18","type":"exec","z":"c7b3a4bf.733698","command":"adb connect ","addpay":true,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":390,"y":80,"wires":[[],[],[]]},{"id":"5c220fab.b3918","type":"inject","z":"c7b3a4bf.733698","name":"","topic":"","payload":"192.168.178.72:5555","payloadType":"str","repeat":"300","crontab":"","once":true,"onceDelay":0.1,"x":180,"y":80,"wires":[["bda4ea3f.77db18"]]},{"id":"ab0a1223.4ab33","type":"exec","z":"c7b3a4bf.733698","command":"adb shell am start -n com.alexvas.dvr.pro/com.alexvas.dvr.activity.LiveViewActivity","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":610,"y":140,"wires":[[],[],[]]},{"id":"26554f22.4d4d7","type":"inject","z":"c7b3a4bf.733698","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":220,"y":140,"wires":[["ab0a1223.4ab33"]]},{"id":"cd611b74.70dfd8","type":"exec","z":"c7b3a4bf.733698","command":"adb shell input keyevent KEYCODE_0","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":470,"y":200,"wires":[[],[],[]]},{"id":"3111ca6d.198e36","type":"exec","z":"c7b3a4bf.733698","command":"adb shell input keyevent KEYCODE_1","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":470,"y":260,"wires":[[],[],[]]},{"id":"2fd55ba9.f30854","type":"exec","z":"c7b3a4bf.733698","command":"adb shell input keyevent KEYCODE_2","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":470,"y":320,"wires":[[],[],[]]},{"id":"5bd2037.edc00fc","type":"exec","z":"c7b3a4bf.733698","command":"adb shell input keyevent 3","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":430,"y":380,"wires":[[],[],[]]},{"id":"1d2ba198.4effce","type":"inject","z":"c7b3a4bf.733698","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":220,"y":200,"wires":[["cd611b74.70dfd8"]]},{"id":"774809aa.e54788","type":"inject","z":"c7b3a4bf.733698","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":220,"y":260,"wires":[["3111ca6d.198e36"]]},{"id":"6406ca1d.66a744","type":"inject","z":"c7b3a4bf.733698","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":220,"y":320,"wires":[["2fd55ba9.f30854"]]},{"id":"c81c01b6.dd7b7","type":"inject","z":"c7b3a4bf.733698","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":220,"y":380,"wires":[["5bd2037.edc00fc"]]},{"id":"a7409b6c.8ed778","type":"comment","z":"c7b3a4bf.733698","name":"Taste Home","info":"","x":640,"y":380,"wires":[]},{"id":"f93d150f.42cb08","type":"comment","z":"c7b3a4bf.733698","name":"Taste 2","info":"","x":710,"y":320,"wires":[]},{"id":"e96ab39b.1d19b","type":"comment","z":"c7b3a4bf.733698","name":"Taste 1","info":"","x":710,"y":260,"wires":[]},{"id":"ce455fbc.579d1","type":"comment","z":"c7b3a4bf.733698","name":"Taste 0","info":"","x":710,"y":200,"wires":[]},{"id":"ae406f26.f8929","type":"comment","z":"c7b3a4bf.733698","name":"CamViewerPro starten","info":"","x":1040,"y":140,"wires":[]},{"id":"b686d1d7.6b292","type":"comment","z":"c7b3a4bf.733698","name":"Verbindung herstellen","info":"","x":600,"y":80,"wires":[]},{"id":"bd7a469d.dd4c48","type":"exec","z":"c7b3a4bf.733698","command":"adb shell am start -n com.alexvas.dvr.pro/com.alexvas.dvr.activity.LiveViewActivity","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":850,"y":540,"wires":[[],[],[]]},{"id":"694adc11.46bae4","type":"delay","z":"c7b3a4bf.733698","name":"","pauseType":"delay","timeout":"500","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":660,"y":600,"wires":[["cf8462d2.0728a","309ab568.cb519a"]]},{"id":"cf8462d2.0728a","type":"exec","z":"c7b3a4bf.733698","command":"adb shell input keyevent KEYCODE_0","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":970,"y":600,"wires":[[],[],[]]},{"id":"309ab568.cb519a","type":"delay","z":"c7b3a4bf.733698","name":"","pauseType":"delay","timeout":"500","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":900,"y":660,"wires":[["11e876a1.0c0f69"]]},{"id":"11e876a1.0c0f69","type":"exec","z":"c7b3a4bf.733698","command":"adb shell input keyevent KEYCODE_1","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":1190,"y":660,"wires":[[],[],[]]},{"id":"d6bb1a9e.85e578","type":"comment","z":"c7b3a4bf.733698","name":"Kamera 1 Vollbild","info":"","x":1440,"y":580,"wires":[]},{"id":"832c35bb.5510d8","type":"loxone-control-in","z":"c7b3a4bf.733698","name":"","miniserver":"47d7601b.cdb11","control":"133561d8-03c1-1ea2-ffff1271215ac08e","state":"133561d8-03c1-1e5a-ffff05eca0397b02","x":140,"y":640,"wires":[["9aec7e63.1ad82"]]},{"id":"5178d543.46297c","type":"switch","z":"c7b3a4bf.733698","name":"","property":"payload[0]","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"num"},{"t":"eq","v":"778","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":430,"y":640,"wires":[["bd7a469d.dd4c48","694adc11.46bae4"],["d4e64230.36704"]]},{"id":"d4e64230.36704","type":"exec","z":"c7b3a4bf.733698","command":"adb shell input keyevent 3","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":670,"y":720,"wires":[[],[],[]]},{"id":"c9361deb.8e235","type":"comment","z":"c7b3a4bf.733698","name":"Taste Home","info":"","x":880,"y":720,"wires":[]},{"id":"9aec7e63.1ad82","type":"rbe","z":"c7b3a4bf.733698","name":"","func":"rbei","gap":"","start":"","inout":"out","property":"payload[0]","x":290,"y":640,"wires":[["5178d543.46297c"]]},{"id":"47d7601b.cdb11","type":"loxone-miniserver","z":"","host":"192.168.178.5","port":"80","enctype":"0","active":true}]

2 Gedanken zu „Anzeige des IP-Kamerabilds auf einem FireTV bei einem Ereignis

    1. Das steht auf dem Plan 😉 wenn Mal Zeit ist. Sind aktuell alles nur Tests was man hier so findet. Aktuell bauen wir erstmal die LOXpixel Platine fertig. Dann geht es weiter 🙂 Danke für deinen Hinweis 🙂

Schreibe einen Kommentar

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