Fakeroku Emulator

Emuliert Roku-Geräte, damit ECP/SSDP-Fernbedienungen (Harmony, Sofabaton) Ereignisse in ioBroker auslösen

Aktueller Release
1.7.1
Entwickler
krobi, Pmant, iobroker-community-adapters
Lizenz
MIT

Dieser Adapter lässt ioBroker im Heimnetz wie ein oder mehrere Roku-Streaming-Geräte aussehen. Eine Fernbedienung, die das Roku-Protokoll spricht — ein Logitech-Harmony-Hub oder eine Sofabaton X1/X2 — findet das emulierte Gerät, und jeder Tastendruck darauf wird zu einem Datenpunkt in ioBroker, auf den Skripte und Visualisierungen reagieren können.

Er ist das Eingabe-Gegenstück zum Logitech-Harmony-Adapter: Statt dass ioBroker ein Gerät steuert, steuert ein Gerät den ioBroker.

Die offizielle Roku-App funktioniert mit diesem Adapter nicht. Sie spricht mit echten Rokus über Rokus herstellereigenen, undokumentierten ECP-2-WebSocket-Kanal, den dieser Emulator nicht nachbildet. Nutze einen Harmony-Hub oder eine Sofabaton — die sprechen das offene Protokoll, das dieser Adapter bedient.

Voraussetzungen

  • Node.js 22 oder neuer
  • js-controller 7.2.2 oder neuer
  • admin 8.0.11 oder neuer
  • Eine Fernbedienung bzw. ein Hub im selben Heimnetz wie der ioBroker-Rechner

Einrichtung

1. Instanz anlegen

Adapter installieren und eine Instanz anlegen. Er läuft sofort: Die Instanz bringt bereits einen emulierten Roku mit, Name „Roku", Anschluss 8060.

2. Netzwerkschnittstelle wählen (meistens: nicht)

Lass Netzwerkschnittstelle auf „alle Schnittstellen". Der Adapter ermittelt dann selbst die erreichbare Adresse deines ioBroker-Rechners und kündigt diese an.

Eine bestimmte Adresse wählst du nur, wenn dein ioBroker-Rechner in mehreren Netzen hängt und die Fernbedienung nur eines davon erreicht.

3. Emulierte Rokus anlegen oder ändern

Jede Karte unter Emulierte Roku-Geräte ist ein Roku, den deine Fernbedienung finden kann.

  • Name — erscheint als Gerätename auf der Fernbedienung und als Ordner im Objektbaum. Nimm etwas Wiedererkennbares, zum Beispiel den Raum.
  • ECP-Port — der Netzwerk-Port, auf dem dieser Roku antwortet. 8060 ist der Port eines echten Roku. Jeder emulierte Roku braucht seinen eigenen; der Dialog schlägt einen freien vor und weist einen bereits belegten ab.
  • Typ
    • Player (eine Streaming-Box) bietet die 16 üblichen Navigations- und Wiedergabetasten.
    • TV bietet zusätzlich Lautstärke, Programm und Eingangswahl sowie eine Ausschalt-Taste. Wähle das nur, wenn du diese zusätzlichen Tasten wirklich als Auslöser in ioBroker haben willst.

4. Fernbedienung anlernen

Logitech Harmony: In der Harmony-App ein Gerät hinzufügen, als Hersteller Roku wählen und auf deinen ioBroker-Rechner zeigen. Der Hub findet den emulierten Roku von selbst und liest den Anschluss aus der Ankündigung — du musst ihn nicht eintippen.

Sofabaton X1/X2: In der Sofabaton-App ein Roku-Gerät hinzufügen, während die App im selben Netz ist. Der Adapter meldet eine aktuelle Roku-Version — genau das prüfen diese Fernbedienungen, bevor sie ein Gerät annehmen.

Was im Objektbaum entsteht

Auf Instanz-Ebene:

DatenpunktTypBedeutung
info.connectionboolean, nur lesbarNur wahr, solange jeder konfigurierte Roku tatsächlich lauscht. Kann einer nicht starten — fast immer, weil sein Port schon belegt ist —, nennt das Protokoll Gerät und Port, und der Adapter versucht dieses Gerät jede Minute erneut, bis es läuft.

Je emuliertem Roku, unterhalb von fakeroku.0.<Name>:

DatenpunktTypBedeutung
commandstring, nur lesbarDer letzte Befehl als lesbarer Text: Home, Lit_a, launch:12, search:news.
commandTypestring, nur lesbarUm welche Art Befehl es sich handelte: keypress, keydown, keyup, launch, install, input oder search.
keys.<Taste>boolean, nur lesbarEin Datenpunkt je Taste. Ein Tastendruck setzt ihn kurz auf true und wieder auf false; eine gehaltene Taste bleibt true, bis sie losgelassen wird.

Tastatureingaben der Fernbedienung (Lit_a) und App-Starts erscheinen nur in command — sie bekommen keine eigenen Datenpunkte.

Verwendung im Skript

Der übliche Weg ist, auf eine Taste zu reagieren, die true wird:

on({ id: "fakeroku.0.Wohnzimmer.keys.Play", val: true }, () => {
  // deine Aktion
});

Oder command beobachten, wenn du mehrere Tasten an einer Stelle behandeln willst:

on({ id: "fakeroku.0.Wohnzimmer.command" }, obj => {
  log("Fernbedienung sendete: " + obj.state.val);
});

Die Tasten-Datenpunkte werden bei jedem Adapterstart auf false zurückgesetzt. Eine Taste, die beim Stoppen von ioBroker gedrückt stehen geblieben ist, kann deine Regel danach also nicht blockieren. Das Loslassen einer Taste, die du tatsächlich hältst, wird nie verworfen — auch dann nicht, wenn der Adapter gerade eine Befehlsflut abweist; sonst wäre die Flutbremse das, was eine Taste hängen lässt.

Genutzte Anschlüsse

  • TCP 8060 (einer je emuliertem Roku, einstellbar) — das Steuerprotokoll. Hierhin sendet deine Fernbedienung ihre Tastendrücke.
  • UDP 1900 (Multicast) — die Geräteerkennung, damit die Fernbedienung die emulierten Rokus findet. Dieser Anschluss ist vom Standard vorgegeben und wird von allen gemeinsam genutzt.

Beantwortet werden nur Geräte aus deinem eigenen Heimnetz. Eine Anfrage aus dem Internet wird abgewiesen, eine Suche von außen ignoriert.

Beim Stoppen der Instanz melden sich die emulierten Rokus im Netz ab. Die Fernbedienung kann sie damit aus ihrer Liste nehmen, statt noch eine Stunde lang Tastendrücke ins Leere zu schicken.

Du kannst mehrere Instanzen auf demselben Rechner betreiben — gib jeder eigene ECP-Ports. UDP 1900 teilen sie sich: Der Adapter öffnet den Anschluss mit Adress-Wiederverwendung, jede Instanz empfängt die Suchanfragen also und antwortet für ihre eigenen Geräte. Nur wenn ein anderes Programm den Anschluss exklusiv hält, startet eine Instanz ohne Geräteerkennung — das steht dann im Protokoll, und bereits gekoppelte Fernbedienungen kommen weiterhin durch.

Der Adapter läuft außerdem im Compact-Modus von ioBroker, in dem sich mehrere Adapter einen Prozess teilen, statt dass jeder einen eigenen startet. Auf kleinen Rechnern spart das Speicher und Startzeit. Eingeschaltet wird er in den Instanz-Einstellungen; hier ist dafür nichts umzustellen.

Fehlersuche

Die Fernbedienung findet kein Gerät. Prüfe, ob Hub und ioBroker-Rechner im selben Netz sind und keine Firewall den UDP-Anschluss 1900 blockiert. Bei einem Rechner mit mehreren Netzwerkkarten die richtige unter Netzwerkschnittstelle auswählen. Ist die Erkennung nicht verfügbar, schreibt der Adapter das ins Protokoll und arbeitet für bereits gekoppelte Fernbedienungen weiter.

Die Fernbedienung findet nichts, und im Protokoll steht „advertising on 172.17.x.x". Diese Adresse gehört zu einer Docker-Brücke auf dem Rechner, nicht zu deinem Heimnetz — keine Fernbedienung erreicht sie. Der Adapter bevorzugt von sich aus eine echte Netzwerkadresse; das taucht also nur auf, wenn der Rechner in dem Moment keine andere zu bieten hat. Wähle unter Netzwerkschnittstelle die richtige aus und starte die Instanz neu.

Die Instanz bleibt „nicht verbunden". Mindestens ein konfigurierter Roku konnte nicht starten. Das Protokoll nennt Gerät und Anschluss — fast immer ist der Anschluss schon von etwas anderem belegt (auch von einem zweiten emulierten Roku mit demselben Anschluss). Gib ihm einen freien. Der Adapter versucht es bei so einem Gerät jede Minute erneut und meldet im Protokoll, wenn es hochkommt — ein Anschluss, den der vorherige Prozess nach einem Neustart noch hielt, löst sich damit von allein.

Ich drücke eine Taste und in ioBroker passiert nichts. Stelle die Protokollstufe der Instanz kurz auf debug. Jeder angewendete Befehl wird mit Absenderadresse protokolliert, bei einer Taste mit ihrem Namen (bei launch, input und search steht stattdessen das Gestartete bzw. Getippte da). Erscheint die Zeile, ist der Befehl angekommen und das Problem liegt im Skript, das den Datenpunkt liest.

Erscheint nichts, suche zuerst nach einer Warnung über mehr als 25 Befehle pro Sekunde: Befehle, die diese Bremse verwirft, werden nicht einzeln protokolliert — eine zu gesprächige Fernbedienung sieht also genauso aus wie eine, die den Adapter gar nicht erreicht. Ohne so eine Warnung kommt die Fernbedienung wirklich nicht durch: Netz und ECP-Port prüfen.

Wiedergabe und Pause tun dasselbe. Das ist das Roku-Protokoll, nicht der Adapter: Die Fernbedienung sendet für Wiedergabe und Pause denselben Befehl, die beiden sind hier also nicht unterscheidbar.

Die App-Tasten meiner Harmony bewirken nichts. Die App-Tasten der Harmony (Netflix, YouTube …) hängen an Harmony-Aktivitäten und werden nie an das Gerät gesendet — der Adapter sieht sie also nie.

Datenschutz

Der Adapter spricht ausschließlich mit Geräten im Heimnetz. Er kontaktiert keinen Cloud-Dienst und sendet nirgendwohin Daten. Die optionale Fehlerberichterstattung über Sentry ist aus, solange du in den ioBroker-Systemeinstellungen die Diagnose nicht eingeschaltet hast; sie überträgt eine anonyme Installations-Kennung und den Fehler selbst, keine personenbezogenen Daten.

Changelog

1.7.1 (2026-09-16)

  • (krobipd) Fixed: a second instance on the same host is possible again — an instance carried over from an older version still claimed the whole machine.

1.7.0 (2026-09-16)

  • (krobipd) Fixed: button datapoints keep their value and their room and function assignment when the adapter starts.
  • (krobipd) Fixed: after an emulated Roku drops out, its port is free again instead of staying blocked until ioBroker restarts.
  • (krobipd) Fixed: stopping the instance no longer leaves it reported as connected.
  • (krobipd) Fixed: a key you hold right after a short press stays pressed instead of being released early.
  • (krobipd) Fixed: the device dialog now also refuses a name that would collide with an existing device in the object tree.
  • (krobipd) Improved: after the host gets a new IP address, remotes find the emulated Rokus again without restarting the instance.
  • (krobipd) Improved: the admin now warns you when a port you enter is already used by another adapter on this host; the instance restarts once after this update.

1.6.1 (2026-09-07) — stable

  • (krobipd) Changed: installing straight from GitHub is no longer offered — the adapter is built before publishing, so it is installed from the ioBroker repository instead.

1.6.0 (2026-09-07)

  • (krobipd) Fixed: saving a device in the admin could change its identity on the network, so a paired Harmony or Sofabaton lost it.
  • (krobipd) Fixed: with the device list open twice, editing or deleting a card could hit a different emulated Roku than the one clicked.
  • (krobipd) Fixed: releasing a key was dropped while the adapter shed a flood of commands, so the key could stay pressed for half a minute.
  • (krobipd) Fixed: an ECP port still held after a restart left that device dead until you restarted the instance; it is retried every minute now.
  • (krobipd) Fixed: stopping the instance now takes the emulated Rokus out of the remote's list instead of leaving them there for up to an hour.
  • (krobipd) Fixed: an emulated Roku whose server died is no longer offered for discovery.
  • (krobipd) Fixed: a configured port no server can bind falls back to 8060 instead of leaving the device unstarted.
  • (krobipd) Changed: the device dialog refuses a reserved or colliding name right away instead of reporting it after saving.
  • (krobipd) Changed: the adapter can now run in compact mode, sharing one process with other adapters instead of claiming its own.
  • (krobipd) Changed: more than one instance may run on the same machine again; only the ports have to differ.

1.5.0 (2026-09-03)

  • (krobipd) Fixed: deleting the last emulated Roku left all of its datapoints behind for good. They are now removed whenever the configuration says a device is gone.
  • (krobipd) Fixed: on a host running Docker the adapter could announce itself under a container address no remote can reach. A real network address is preferred now.
  • (krobipd) Fixed: an emulated Roku whose server died while running left the instance showing "connected". It now reports the failure and names the device.

License

The MIT License (MIT)

Copyright (c) 2017-2023 Pmant patrickmo@gmx.de
Copyright (c) 2023-2026 iobroker-community-adapters iobroker-community-adapters@gmx.de
Copyright (c) 2026 krobi krobi@power-dreams.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.