Roku Emulator per Docker

Hallo,
Fonzo hatte mich vor einigen Jahren mit seinen Modulen für Logitech Harmony, Roku und Neeo zu IPS getrieben. Danke dafür. Der Roku-Emulator hatte bei mir als AV-Fan leider die Eigenschaft das er nicht von allen meinen Hubs erkannt wurde. Auf der Suche nach einer Lösung kam ich als Docker-Fan auf ein Docker-Image das eine Roku emuliert und die Tasten per MQTT weiterleitet. Dieser Emu wurde sofort von allen meinen Hubs erkannt. Hier möchte ich „kurz“ erklären wie man ihn in IPS benutzen kann.

Das von mir verwendete Docker-Image heißt: mukowman/roku_dummy

Bei mir laufen der einfachheithalber, und aus Faulheit, sowohl IPS als auch Roku mit der Einstellung Network=host, d.h. beide Docker besitzen die selbe IP-Adresse wie die von mir benutzte Synology Diskstation. Wenn nicht Netzwerk=host benutzt wird müssen die entsprechenden Ports bei den Docker-Images nach außen geführt werden.

Beim Start von Roku müssen die nötigen Einstellungen in Umgebungsvariablen vorgenommen werden. Die Einstellungen sehen bei mir so aus:

Host-IP muss die IP vom Docker sein, bei mir die selbe wie Synology. Host-Port dient zur Erkennung des Emus von einer Harmony. MQTT_HOST IP-Adresse vom MQTT-Server auf IPS, bei mir die selbe wie Synology. MQTT_PORT Port des MQTT-Servers auf IPS. Ich benutze für jeden Klienten einen eigenen MQTT-Server deswegen hier 1888. MQTT_USER und MQTT_PASSWORD hier gehören die Daten rein die man in IPS beim MQTT-Server angegeben hat. Das Volume Backup habe ich eigerichtet um Daten mit dem Docker-Image austauschen zu können.

In IPS muss der MQTT-Splitter wie folgt eingerichtet werden:

und der MQTT-IO

MQTT IO

Wenn alles geklappt hat sollte es im MQTT Konfigurator ähnlich wie bei mir aussehen

Hier muss ich noch etwas zu sagen. Das Original Docker-Image verwendet nur das Topic roku/keypress. Hier würden alle Hubs, wenn mehrere vorhanden sind, die selben Meldungen verschicken. Ich habe im Docker 2 Python-Dateien verändert so das meine Topics roku-IP vom Hub/keypress sind. Hierfür ist das Backup-Volume nötig. Bei Interesse an den Änderungen bitte melden.
Mit dem Konfigurator kann jetzt die/eine Roku-Instanz erstellt werden. Sobald Roku-Tasten simuliert werden sieht es dann in IPS so aus:

In Value steht einer von 14 Strings der einer simulierten Taste entspricht. Um mit diesem String arbeiten zu können habe ich ein kleines Script Handle-Roku geschrieben:

<?php
$key = GetValue(ID der variablen Value);
$DeviceID = ID einer Android Streaming Box;
$isFireTV = true = Fire-TV,  false=Android-TV;
switch ($key){
    case 'Down':
        FireTV_Waipu($DeviceID, $isFireTV);
        break;
    case 'Left':
        FireTV_PrimeVideo($DeviceID, $isFireTV);
        break;
    case 'Right':
        FireTV_Netflix($DeviceID, $isFireTV);
        break;
    case 'Up':
        FireTV_Kodi($DeviceID, $isFireTV);
        break;
    case 'Search':
        SetValue(40199, hk-tv);
        break;
    case 'InstantReplay':
        FireTV_Sat($DeviceID, $isFireTV);
        break;
    case 'Info':
        break;
    case 'Select':
        break;
    case 'PowerOff':
        break;
    case 'Play':
        IPS_RunScript(57482);
        break;
    case 'Back':
        RequestAction(29473, true);
        break;
    case 'Rev':
        $Brightness = GetValue(55532) - 10;
        if ($Brightness < 0) $Brightness = 0;
        RequestAction(55532, $Brightness);
        break;
    case 'Fwd':
        $Brightness = GetValue(55532) + 10;
        if ($Brightness > 100) $Brightness = 100;
        RequestAction(55532, $Brightness);
        break;
    case 'Home':
        if (GetValue(32822)) RequestAction(32822, false);
        else  RequestAction(32822, true);
        break;
}

In diesem Script starte ich u.a. diverse Apps und regele die Helligkeit. Was bei den Tasten geschehen soll bestimmen nur die eigenen Bedürfnisse.

Diese Konfiguration läuft bei mir seit einigen Monaten ohne Ausfälle. Eine Einschränkung habe ich bisher. Meine Sofabaton X1 erkennt den Emu leider (noch) nicht.

Da das Harmony-Modul bei mir immer mal wieder mehrere Sekunden nicht mehr auf Tasten reagiert hat habe ich auch hier eine Docker-Lösung für mich gefunden. Ich schätze die Probleme kommen von XMPP und Docker benutzt wohl WebSockets. Bei Interesse bitte auch melden. Genau wie der Roku Ersatz ist mein Harmony Ersatz leider nicht so benutzerfreundlich wie die Module von Fonzo.

Ralf

2 „Gefällt mir“

Hallo Ralf,
vielen Dank für die gute Anleitung.
Ich habe es jetzt erst einmal alles eingerichtet und werde es sicherlich für andere Dinge später gut gebrauchen können.
Derzeit bin ich mit deiner LMAIR Lösung erstmal zufrieden :ok_hand:

P.S. Wenn die Sofabaton dies unterstützt, wäre es schön, wenn du dies mitteilen könntest. Bis dahin hält meine Harmony hoffentlich noch lange :innocent:

Hallo Ralf,
ich habe jetzt mal versucht den Roku2Mqtt Weg einzuschlagen.
Der Roku wird in MyHarmony als Roku 4 Emulator über das Netzwerk gefunden. Auffällig ist bei mir, dass aber nur einige Befehle über die Harmony eine Veränderung im „Value“ String bzw. bei den Nutzdaten der Instanzkonfiguration reagieren.

Lediglich die Befehle „Home“, „InstantReplay“, „Search“, „Sleep“ reagieren und verändern die Variable.
Die Befehle „Back Space, Power on, Page up, Page down, Amazon, Crackle, HBONow, Hulu, MGO, Netflix, Pandora, Showtime, Sling Tv und Vudu“ reagieren nicht.

Weißt du, woran das liegt?
Viele Grüße
marvus

Moin Marvus,
ich werte aus:

    case 'Down':
    case 'Left':
    case 'Right':
    case 'Up':
    case 'Search':
    case 'InstantReplay':
    case 'Info':
    case 'Select':
    case 'PowerOff':
    case 'Play':
    case 'Back':
    case 'Rev':
    case 'Fwd':
    case 'Home':

Nicht alle Befehle die Harmony anbietet gehen über das Netz. Du kannst es am Hub sehen. Bei den Apps z.B. hat bei mir immer der Hub geblinkt was ein Zeichen ist das vermutlich IR benutzt wird.

roku_dummy scheint Folgendes anzubieten:

    KEY_HOME = 'Home'
    KEY_REV = 'Rev'
    KEY_FWD = 'Fwd'
    KEY_PLAY = 'Play'
    KEY_SELECT = 'Select'
    KEY_LEFT = 'Left'
    KEY_RIGHT = 'Right'
    KEY_DOWN = 'Down'
    KEY_UP = 'Up'
    KEY_BACK = 'Back'
    KEY_INSTANTREPLAY = 'InstantReplay'
    KEY_INFO = 'Info'
    KEY_BACKSPACE = 'Backspace'
    KEY_SEARCH = 'Search'
    KEY_ENTER = 'Enter'
    KEY_FINDREMOTE = 'FindRemote'
    KEY_VOLUMEDOWN = 'VolumeDown'
    KEY_VOLUMEMUTE = 'VolumeMute'
    KEY_VOLUMEUP = 'VolumeUp'
    KEY_POWEROFF = 'PowerOff'
    KEY_CHANNELUP = 'ChannelUp'
    KEY_CHANNELDOWN = 'ChannelDown'
    KEY_INPUTTUNER = 'InputTuner'
    KEY_INPUTHDMI1 = 'InputHDMI1'
    KEY_INPUTHDMI2 = 'InputHDMI2'
    KEY_INPUTHDMI3 = 'InputHDMI3'
    KEY_INPUTHDMI4 = 'InputHDMI4'
    KEY_INPUTAV1 = 'InputAV1'

An die zusätzlichen Befehle kommt man vielleicht wenn man als Geräte einen RokuTV auswählt falls das geht.

Alle Hubs die Du mit Roku verbindest würden die selben Befehle ausführen. Ich habe die Quellen so geändert das die IP im Topic ist und so jeder Hub seinen eigenen X Befehle hat. Ich habe mehrere Hubs in Betrieb.

Ralf

Hallo Ralf,
was ich nur nicht verstehe ist, dass ich den gleichen Dockercontainer wie du benutze, die Harmony über das Netzwerk den Docker Roku erkennt und ich aber andere Bedienvariablen habe als du. Das kann doch eigentlich nicht sein.

Wie oben geschrieben, habe ich auch nicht mehr als die oben genannten und auch nur die vier genannten reagieren an der Fernbedienung. Nach deinen Werten müsste ja beispielsweise „down“ auch erkannt werden. :thinking:

Moin Marvus,
Ich habe debug geöffnet und in der Harmony App beim Roku Gerät alle Button gedrückt und das hat das debug aufgezeichnet:
TXT: 08.05.2024, 22:00:20 | STRING | Down
TXT: 08.05.2024, 22:00:21 | STRING | Left
TXT: 08.05.2024, 22:00:22 | STRING | Right
TXT: 08.05.2024, 22:00:23 | STRING | Up
TXT: 08.05.2024, 22:00:23 | STRING | Select
TXT: 08.05.2024, 22:00:24 | STRING | Play
TXT: 08.05.2024, 22:00:26 | STRING | Rev
TXT: 08.05.2024, 22:00:27 | STRING | Fwd
TXT: 08.05.2024, 22:00:28 | STRING | Back
TXT: 08.05.2024, 22:00:29 | STRING | Search
TXT: 08.05.2024, 22:00:29 | STRING | PowerOff
TXT: 08.05.2024, 22:00:30 | STRING | Info
TXT: 08.05.2024, 22:00:33 | STRING | Home
TXT: 08.05.2024, 22:00:39 | STRING | InstantReplay

Also 14 Funktionen gehen bei mir. Der Rest geht über IR.

Ralf Biedermann

Hallo Ralf,
ich habe jetzt auch mal einen Debug aufgezeichnet. Ich bekomme nur die Befehle:

TXT: 13.05.2024, 20:22:00 |               STRING | Home
HEX: 13.05.2024, 20:22:00 |               STRING | 48 6F 6D 65 
TXT: 13.05.2024, 20:22:27 |               STRING | InstantReplay
HEX: 13.05.2024, 20:22:27 |               STRING | 49 6E 73 74 61 6E 74 52 65 70 6C 61 79 
TXT: 13.05.2024, 20:22:33 |               STRING | Search
HEX: 13.05.2024, 20:22:33 |               STRING | 53 65 61 72 63 68 
TXT: 13.05.2024, 20:22:36 |               STRING | PowerOff
HEX: 13.05.2024, 20:22:36 |               STRING | 50 6F 77 65 72 4F 66 66 

Ich verstehe nicht, wieso ich nicht die gleichen wie du habe, obwohl wir den gleichen Docker nutzen und das Gerät über das Netzwerk gefunden wird. Oder hast du es manuell angelegt?

So habe ich nur 4 mögliche Funktionen und die sind dann doch ein bisschen wenig :wink:

Hi,
besser als gar nichts oder? :grinning: Exportiere mal das Log von Roku und durchsuche es nach „keypress“. Im Log sieht es dann z.B. so aus:

<tr><td>2024/05/08&nbsp;22:00:39</td><td>stdout</td><td>INFO:aiohttp.access:192.168.178.95&nbsp;[08/May/2024:20:00:39&nbsp;+0000]&nbsp;"POST&nbsp;/keypress/InstantReplay&nbsp;HTTP/1.1"&nbsp;200&nbsp;149&nbsp;"-"&nbsp;"LuaSocket&nbsp;2.0.2"
</td></tr>
<tr><td>2024/05/08&nbsp;22:00:39</td><td>stdout</td><td>BAh2nYKsDgdSNopdbGvtCR
</td></tr>
<tr><td>2024/05/08&nbsp;22:00:39</td><td>stdout</td><td>192.168.178.95
</td></tr>
<tr><td>2024/05/08&nbsp;22:00:37</td><td>stdout</td><td>INFO:aiohttp.access:192.168.178.95&nbsp;[08/May/2024:20:00:37&nbsp;+0000]&nbsp;"POST&nbsp;/keypress/Home&nbsp;HTTP/1.1"&nbsp;200&nbsp;149&nbsp;"-"&nbsp;"LuaSocket&nbsp;2.0.2"
</td></tr>
<tr><td>2024/05/08&nbsp;22:00:37</td><td>stdout</td><td>BAh2nYKsDgdSNopdbGvtCR
</td></tr>
<tr><td>2024/05/08&nbsp;22:00:37</td><td>stdout</td><td>192.168.178.95
</td></tr>
<tr><td>2024/05/08&nbsp;22:00:33</td><td>stdout</td><td>INFO:aiohttp.access:192.168.178.95&nbsp;[08/May/2024:20:00:33&nbsp;+0000]&nbsp;"POST&nbsp;/keypress/Home&nbsp;HTTP/1.1"&nbsp;200&nbsp;149&nbsp;"-"&nbsp;"LuaSocket&nbsp;2.0.2"
</td></tr>
<tr><td>2024/05/08&nbsp;22:00:33</td><td>stdout</td><td>BAh2nYKsDgdSNopdbGvtCR
</td></tr>
<tr><td>2024/05/08&nbsp;22:00:33</td><td>stdout</td><td>192.168.178.95
</td></tr>
<tr><td>2024/05/08&nbsp;22:00:30</td><td>stdout</td><td>INFO:aiohttp.access:192.168.178.95&nbsp;[08/May/2024:20:00:30&nbsp;+0000]&nbsp;"POST&nbsp;/keypress/Info&nbsp;HTTP/1.1"&nbsp;200&nbsp;149&nbsp;"-"&nbsp;"LuaSocket&nbsp;2.0.2"
</td></tr>
<tr><td>2024/05/08&nbsp;22:00:30</td><td>stdout</td><td>BAh2nYKsDgdSNopdbGvtCR
</td></tr>
<tr><td>2024/05/08&nbsp;22:00:30</td><td>stdout</td><td>192.168.178.95
</td></tr>

Ralf