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}]

11 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 🙂

  1. Hallo Dennis,
    ich finde die Aneitung super! Genau das habe ich gesucht.
    Leider funktioniert das Öffnen des Cam Viewer nicht wie beschrieben. Folgendes Fenster wird bei mir ausgelesen:
    com.rcreations.WebCamViewerPaid/com.rcreations.WebCamViewerPaid.GalleryViewActivity
    Im SSH und unter Node Red habe ich aber mit folgenden Befehl keine Reaktion:
    adb shell am start -n com.rcreations.WebCamViewerPaid/com.rcreations.WebCamViewerPaid.GalleryViewActivity
    Mache ich da irgendetwas faslch?
    Noch eine zweite Frage:
    Kann ich über diese Methode auch irgendwie die Lautstärke über den FireTV Stick steuern?
    Gruß, Johny

    1. Das klingt für mich nach der falschen App 🙁 ich bin mir nicht sicher ob es für Lautstärke entsprechende Tasten vorgesehen gibt. Nur bei der IR Variante aber das bringt dir wohl nicht viel. Habe aktuell kein Setup um das auszuprobieren. Werde aber demnächst weiter testen mit Netflix und co und schaue ob ich über etwas stolpere.

  2. Das ist absolut kranker scheiß. Danke für diese mega Anleitung. Jetzt denken meine Freunde ich habe komplett einen an der klatsche (im positivem Sinne)! 🙂

  3. Hallo! Ich hab lange nach so einer Möglichkeit gesucht und werde das heut Abend gleich mal implementieren 🙂
    Ich habe aber noch eine Frage.. ist es möglich nach n Sekunden zurück zu wechseln zur ursprünglichen App, diese aber pausiert zu lassen?

    Szenario:

    Netflix läuft, es klingelt, Kamerabild wird 30 Sekunden angezeigt, Wechselt zurück auf Netflix, Netflix bleibt pausiert?

    Liebe Grüße! 🙂

    1. Durch das erneute Starten von Netflix nach 30 Sekunden sollte genau das passieren. Er dürfte die App im Hintergrund nicht schließen.
      Ich habe das so noch nicht versucht, da es damals nur ein Testaufbau für mich war. Versuch es doch einfach mal und gib mir nochmal Bescheid. Würde mich interessieren ob es geklappt hat 🙂

      1. Durch das drücken der “zurück” taste per adb sollte das auch funktionierne. durch drücken der physikalischen zurück Taste funktioniert es jedenfalls 🙂

        Ich habe aber noch eine Frage.. den TV anschalten funktioniert per Keyevent Home.. gibt es eine möglichkeit ihn auch wieder auszuschalten? oder alternativ die möglichkeit einen “langen” homeklick zu machen? dann könnte man lang home klciken und switchen zu ruhezustand.. das würde ja auch gehen.

        1. Ich kann es leider nicht nachbauen da es wie gesagt nur einen Test war. Aber könnte mir vorstellen, dass es ein Keyevent für Long press gibt. Ich würde denn TV aber vermutlich extern steuern.

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.