External integration - Roku

Hi everyone! :waving_hand:

Second in the North American series :united_states:: Roku, the #1 streaming device in the US, in a box, a key, or a « Roku TV » television. Like Android TV, everything happens locally, via the official Roku API, without an account or cloud.

What it does

  • Automatic discovery of Roku devices on the network in the Discovery tab, with an IP entry as a backup. Each Roku is recognized by its serial number, even if it changes address.
  • Roku TV: power on/off, input selection (HDMI or antenna), volume, mute, and channels.
  • All Roku devices: the on-screen app (displayed and modifiable), playback status, and remote control buttons.
  • Three widgets: a remote control, current playback with the app icon, and app shortcuts with their icons.
  • Scenes: a « changed application » trigger, and « open an application » and « press a button » actions.

The cool part

Netflix launches on the living room TV → dimmed lights :popcorn:
10:30 PM on a weekday → the Roku TV turns off by itself :sleeping_face:

Installation

:warning: Gladys 5.1 minimum.

  1. On the Roku: Settings → System → Advanced System Settings → Mobile Device Control → Enabled. On a Roku TV, also enable Quick TV Startup.
  2. In Gladys: Integrations → Roku → Install, then the Discovery tab to add your devices.

Honest caveats: Roku does not provide a volume level, only + / − buttons, and a Roku box does not really turn off (its status is only displayed).

:warning: Developed without the hardware, I don’t have a Roku: tests are based on real device responses, but nothing beats trying it out at home. @ruegerth, as promised, it’s time :wink:

Like the previous ones, it is developed with Claude Code :robot:.

Repository: GitHub - guim31/gladys-roku: Roku TVs and streaming players, local control (ECP) for Gladys Assistant · GitHub

Let me know what’s missing :folded_hands:

Fast … super work.
Here is my test:

  1. Fresh installation of Gladys v5.1.4

with location Quebec :wink:

  1. On the Roku Express 4k Stick, the settings were adopted as specified (Settings - System - Advanced System Settings - Control by Mobile Apps - Enabled)

  2. In Gladys, for speed and simplification, various services were deactivated:

  1. Dashboard created, time and sun added:

  1. The Roku integration was installed; it opens the Configuration tab by default the first time:

The first display:

There, the local IP of the Roku Stick was entered and a test was performed … successfully:

On the start dashboard, all available widgets were activated one after the other:

  • Remote

  • Playback

  • App

Here is the first problem point. Not all apps installed on the Roku Stick (from YouTube to ARD to Arte) are displayed. For example, Disney, KiKa, RTL, and others are missing :frowning:

The dashboard with the Roku widgets:

FIRST TESTS:

I can select the apps displayed in Roku apps, so currently YouTube, ZDF, ARD, and Arte. When selected, these are then displayed in the ROKU PLAYBACK widget and also simultaneously on the TV!!! but

The PLAY/PAUSE and REPLAY buttons do not work. I can click them, but no reaction is visible on the TV.

COUNTERTEST:

Selection with remote directly on the stick, there ARTE selected. The widgets react to this and display:

If I then click Home in the Remote widget, the following happens:

Here is the corresponding debug log with the above steps:

[2026-10-10T07:51:05.087Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:51:05.108Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (20 ms)
[2026-10-10T07:51:05.123Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (9 ms)
[2026-10-10T07:51:05.128Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:51:15.078Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (30 ms)
[2026-10-10T07:51:15.090Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:51:15.112Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (22 ms)
[2026-10-10T07:51:15.127Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (9 ms)
[2026-10-10T07:51:15.132Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:51:15.144Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/apps -> HTTP 200 (12 ms)
[2026-10-10T07:51:25.084Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (36 ms)
[2026-10-10T07:51:25.091Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:51:25.113Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (22 ms)
[2026-10-10T07:51:25.131Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (10 ms)
[2026-10-10T07:51:25.135Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:51:35.086Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (36 ms)
[2026-10-10T07:51:35.097Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:51:35.119Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (22 ms)
[2026-10-10T07:51:35.139Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (10 ms)
[2026-10-10T07:51:35.145Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:51:45.081Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (31 ms)
[2026-10-10T07:51:45.102Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:51:45.120Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (18 ms)
[2026-10-10T07:51:45.141Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (13 ms)
[2026-10-10T07:51:45.145Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:51:55.080Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (29 ms)
[2026-10-10T07:51:55.088Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:51:55.108Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (20 ms)
[2026-10-10T07:51:55.129Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (14 ms)
[2026-10-10T07:51:55.135Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:52:05.076Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (25 ms)
[2026-10-10T07:52:05.083Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:52:05.106Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (22 ms)
[2026-10-10T07:52:05.126Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (14 ms)
[2026-10-10T07:52:05.133Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:52:15.087Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (35 ms)
[2026-10-10T07:52:15.094Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:52:15.117Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (22 ms)
[2026-10-10T07:52:15.135Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (12 ms)
[2026-10-10T07:52:15.141Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:52:25.084Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (31 ms)
[2026-10-10T07:52:25.091Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:52:25.111Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (20 ms)
[2026-10-10T07:52:25.128Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (12 ms)
[2026-10-10T07:52:25.133Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:52:25.146Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/apps -> HTTP 200 (13 ms)
[2026-10-10T07:52:35.082Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (29 ms)
[2026-10-10T07:52:35.092Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:52:35.114Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (22 ms)
[2026-10-10T07:52:35.133Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (12 ms)
[2026-10-10T07:52:35.141Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:52:45.085Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (31 ms)
[2026-10-10T07:52:45.113Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:52:45.137Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (24 ms)
[2026-10-10T07:52:45.154Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (12 ms)
[2026-10-10T07:52:45.160Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:52:55.089Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (35 ms)
[2026-10-10T07:52:55.102Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:52:55.126Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (24 ms)
[2026-10-10T07:52:55.151Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (13 ms)
[2026-10-10T07:52:55.161Z] [DEBUG] [roku] Roku Express 4K: app=737818 (Arte), player=close
[2026-10-10T07:52:55.174Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): published app=737818
[2026-10-10T07:52:55.174Z] [DEBUG] Scene event app_changed: Arte on Roku Express 4K
[2026-10-10T07:53:05.083Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (29 ms)
[2026-10-10T07:53:05.093Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:53:05.113Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (19 ms)
[2026-10-10T07:53:05.127Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (8 ms)
[2026-10-10T07:53:05.133Z] [DEBUG] [roku] Roku Express 4K: app=737818 (Arte), player=close
[2026-10-10T07:53:15.088Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (34 ms)
[2026-10-10T07:53:15.099Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:53:15.122Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (23 ms)
[2026-10-10T07:53:15.138Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (10 ms)
[2026-10-10T07:53:15.142Z] [DEBUG] [roku] Roku Express 4K: app=737818 (Arte), player=close
[2026-10-10T07:53:25.082Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (26 ms)
[2026-10-10T07:53:25.090Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:53:25.113Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (23 ms)
[2026-10-10T07:53:25.130Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (12 ms)
[2026-10-10T07:53:25.138Z] [DEBUG] [roku] Roku Express 4K: app=737818 (Arte), player=close
[2026-10-10T07:53:35.087Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (31 ms)
[2026-10-10T07:53:35.093Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:53:35.115Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (22 ms)
[2026-10-10T07:53:35.134Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (12 ms)
[2026-10-10T07:53:35.139Z] [DEBUG] [roku] Roku Express 4K: app=737818 (Arte), player=close
[2026-10-10T07:53:45.084Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (27 ms)
[2026-10-10T07:53:45.090Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:53:45.115Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (25 ms)
[2026-10-10T07:53:45.134Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (11 ms)
[2026-10-10T07:53:45.140Z] [DEBUG] [roku] Roku Express 4K: app=737818 (Arte), player=close
[2026-10-10T07:53:55.086Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (29 ms)
[2026-10-10T07:53:55.101Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:53:55.122Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (21 ms)
[2026-10-10T07:53:55.139Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (11 ms)
[2026-10-10T07:53:55.145Z] [DEBUG] [roku] Roku Express 4K: app=737818 (Arte), player=close
[2026-10-10T07:54:05.085Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (28 ms)
[2026-10-10T07:54:05.092Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:54:05.114Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (22 ms)
[2026-10-10T07:54:05.130Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (10 ms)
[2026-10-10T07:54:05.137Z] [DEBUG] [roku] Roku Express 4K: app=737818 (Arte), player=close
[2026-10-10T07:54:15.090Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (32 ms)
[2026-10-10T07:54:15.097Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:54:15.117Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (20 ms)
[2026-10-10T07:54:15.133Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (11 ms)
[2026-10-10T07:54:15.142Z] [DEBUG] [roku] Roku Express 4K: app=737818 (Arte), player=close
[2026-10-10T07:54:25.095Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (36 ms)
[2026-10-10T07:54:25.104Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:54:25.127Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (23 ms)
[2026-10-10T07:54:25.144Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (12 ms)
[2026-10-10T07:54:25.151Z] [DEBUG] [roku] Roku Express 4K: app=737818 (Arte), player=close
[2026-10-10T07:54:35.089Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (30 ms)
[2026-10-10T07:54:35.095Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:54:35.115Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (20 ms)
[2026-10-10T07:54:35.130Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (9 ms)
[2026-10-10T07:54:35.138Z] [DEBUG] [roku] Roku Express 4K: app=737818 (Arte), player=close
[2026-10-10T07:54:45.087Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (26 ms)
[2026-10-10T07:54:45.096Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:54:45.114Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (18 ms)
[2026-10-10T07:54:45.129Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (9 ms)
[2026-10-10T07:54:45.135Z] [DEBUG] [roku] Roku Express 4K: app=737818 (Arte), player=close
[2026-10-10T07:54:54.503Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): key Home
[2026-10-10T07:54:54.553Z] [DEBUG] [roku:ecp] POST 192.168.0.224/keypress/Home -> HTTP 200 (50 ms)
[2026-10-10T07:54:55.078Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (17 ms)
[2026-10-10T07:54:55.085Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:54:55.105Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (20 ms)
[2026-10-10T07:54:55.110Z] [DEBUG] [roku] Roku Express 4K: app=home (Home), player=-
[2026-10-10T07:54:55.124Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): published app=home
[2026-10-10T07:54:55.125Z] [DEBUG] Scene event app_changed: Home on Roku Express 4K
[2026-10-10T07:54:56.069Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (16 ms)
[2026-10-10T07:54:56.078Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:54:56.101Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (22 ms)
[2026-10-10T07:54:56.118Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (11 ms)
[2026-10-10T07:54:56.124Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:54:56.137Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/apps -> HTTP 200 (13 ms)
[2026-10-10T07:54:56.157Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): published app=562859
[2026-10-10T07:54:56.157Z] [DEBUG] Scene event app_changed: Roku Dynamic Menu on Roku Express 4K
[2026-10-10T07:55:05.088Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (27 ms)
[2026-10-10T07:55:05.097Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:55:05.115Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (18 ms)
[2026-10-10T07:55:05.134Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (12 ms)
[2026-10-10T07:55:05.140Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:55:15.095Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (34 ms)
[2026-10-10T07:55:15.103Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:55:15.124Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (21 ms)
[2026-10-10T07:55:15.143Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (11 ms)
[2026-10-10T07:55:15.149Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:55:25.096Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (34 ms)
[2026-10-10T07:55:25.102Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:55:25.124Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (21 ms)
[2026-10-10T07:55:25.143Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (11 ms)
[2026-10-10T07:55:25.149Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close, power-mode=PowerOn
[2026-10-10T07:55:25.134Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (32 ms)
[2026-10-10T07:55:25.156Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (15 ms)
[2026-10-10T07:55:25.160Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:55:35.094Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (32 ms)
[2026-10-10T07:55:35.102Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:55:35.117Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (15 ms)
[2026-10-10T07:55:35.136Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (14 ms)
[2026-10-10T07:55:35.145Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:55:45.090Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (27 ms)
[2026-10-10T07:55:45.098Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:55:45.118Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (20 ms)
[2026-10-10T07:55:45.140Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (16 ms)
[2026-10-10T07:55:45.144Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:55:55.092Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (29 ms)
[2026-10-10T07:55:55.098Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:55:55.120Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (22 ms)
[2026-10-10T07:55:55.136Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (10 ms)
[2026-10-10T07:55:55.143Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:56:05.090Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (27 ms)
[2026-10-10T07:56:05.099Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:56:05.120Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (21 ms)
[2026-10-10T07:56:05.138Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (13 ms)
[2026-10-10T07:56:05.145Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:56:05.160Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/apps -> HTTP 200 (14 ms)
[2026-10-10T07:56:15.095Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (31 ms)
[2026-10-10T07:56:15.103Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:56:15.120Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (16 ms)
[2026-10-10T07:56:15.138Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (11 ms)
[2026-10-10T07:56:15.143Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:56:25.092Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (28 ms)
[2026-10-10T07:56:25.104Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:56:25.126Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (22 ms)
[2026-10-10T07:56:25.143Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (13 ms)
[2026-10-10T07:56:25.150Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:56:35.095Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (29 ms)
[2026-10-10T07:56:35.102Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:56:35.120Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (18 ms)
[2026-10-10T07:56:35.137Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (9 ms)
[2026-10-10T07:56:35.143Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:56:45.093Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (28 ms)
[2026-10-10T07:56:45.101Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:56:45.121Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (20 ms)
[2026-10-10T07:56:45.137Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (12 ms)
[2026-10-10T07:56:45.147Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:56:55.105Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (39 ms)
[2026-10-10T07:56:55.114Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:56:55.141Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (26 ms)
[2026-10-10T07:56:55.160Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (13 ms)
[2026-10-10T07:56:55.165Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close
[2026-10-10T07:57:05.094Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/device-info -> HTTP 200 (28 ms)
[2026-10-10T07:57:05.100Z] [DEBUG] [roku] Roku Express 4K (192.168.0.224): Roku Roku Express 4K [3940EU2], box, Roku OS 15.3.4, power-mode=PowerOn
[2026-10-10T07:57:05.130Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/active-app -> HTTP 200 (30 ms)
[2026-10-10T07:57:05.150Z] [DEBUG] [roku:ecp] GET 192.168.0.224/query/media-player -> HTTP 200 (14 ms)
[2026-10-10T07:57:05.156Z] [DEBUG] [roku] Roku Express 4K: app=562859 (Roku Dynamic Menu), player=close

… will be continued, first a coffee … super work so far, looks good

Continuing the tests:

Question: What happens if I select an app with the remote that is not displayed in the integration?

Result:

It is displayed, but now it gets complicated. If I click « Play » in the Roku Playback widget, then the Roku Disney app goes to the next step… the TV shows the profile selection… and now?
Well, I’ll just click on « Keys » in the Roku Remote widget… no reaction, so I’ll just leave the selection (of the last user) in the Disney app as is and click « OK »… that works. The app continues, but:

The Disney app now asks for a password. This is also displayed on the TV, but since I cannot operate the « Keys » in the Roku Remote widget or they do not respond, this test ends here

Next round:

  • Roku Apps: Select App « ZDF » … works
  • Roku Playback: Buttons don’t work at all
  • Roku Remote:

Just clicked « OK », as the APP automatically offers something as « selected »… works…
then clicked « OK » again, as « Playback » is selected in the app … works… playback begins.

Then during playback in

  • Roku Playback: Play/Pause button now works, playback stops, then
  • Roku Playback: Replay button does not respond… no change

Then while playback is stopped in

  • Roku Remote: OK button clicked twice … playback resumes

A huge thank you @ruegerth for these super detailed tests, with the screenshots and the log: it’s exactly what I needed :folded_hands:

1.0.3 is published, it fixes everything you reported:

  • The Playback widget buttons: The issue came from Gladys, not your TV. Before executing a press, Gladys re-reads the widget content, with a limit of 30 re-reads per minute. My widgets were reloading way too often, the limit was reached, and Gladys then refused the press without saying anything. Hence the buttons that worked « sometimes » (in Disney+ yes, in Arte no). It’s fixed: the widgets reload much less, and the widget shows the new state right after the press.
  • The « Touches… » button couldn’t work: it opened a form that the current version of Gladys doesn’t know yet. It is replaced by a new widget « Roku Navigation » with the four arrows, to be placed next to the remote control. The remote control keeps OK, Back, Home and Play/Pause.
  • To type text (Disney+ password, a search): new scene action « Type text on a Roku ». You create a scene with your text and you launch it from a Scene box on the dashboard. Be careful, scenes are visible to all Gladys users: avoid for a sensitive password.
  • The Applications widget displays a maximum of 4 apps (Gladys limit). Enter the names you want in its settings (Disney+, KiKA, RTL…), or add a second Applications widget to have 4 more. All your apps remain in the device’s « Application » feature, usable in scenes.
  • « Roku Dynamic Menu » now displays « Home ».

A note on Replay: it’s the « Instant Replay » button of Roku, and each app decides if it handles it. In ZDF it does nothing, even with the real remote control, I imagine. It’s not the integration :wink:

The update will be offered to you in Gladys as soon as the store has seen it, during the day. You will just have to update the integration, then add the Navigation widget if you want it. If a button remains ineffective after the update, a screenshot of the Network tab of the browser (F12) at the time of the press would help a lot.

Thanks for the quick response.

New test round:

  • Roku Apps … Got it … it applies: Who can read is at an advantage :wink:

  • Redesign of the Dashboard:

Step 1:

  • Roku Apps: Selection of Arte. works:

  • TV: Arte is started, a film with the preselection « Playback » is marked.
  • Roku Remote: Play button clicked… no reaction:

  • Roku Playback: Play button clicked… no reaction:

  • Roku Remote: Home clicked … Home screen of the stick is displayed.

  • Roku Navigation: Maneuvered to the Netflix app… works

  • Roku Remote: « Play » button … works:

The app starts

  • Roku Remote: « Play » button … works, the app shows its next page, here profile selection

  • Roku Remote: « Play » button … no reaction

  • Roku Remote: « OK » button … works, the profile preset in the app goes

  • Roku Navigation: Selected any movie via Buttons Up, Right, Right, etc.

  • Roku Remote: « OK » button … movie starts

Perfect… Congratulations

Tester’s suggestion:

– Integrate the Roku Navigation Widget into the Roku Remote Widget, include it, display it… then the user will immediately know what it’s for. It’s like that on every remote control.

Best regards and lots and lots of praise and recognition for the quick work,

Tom

Next suggestion from the tester:

Removing the « Replay » button at this stage of development is app-dependent and only causes confusion if one app offers it and the other does not.

Thanks Tom, that’s nice to hear :blush: And thanks for your two suggestions, the second one is already in 1.0.4:

  • Replay removed from the Play widget: you’re right, a button that works in one app and not in another just causes confusion. The widget keeps Play/Pause, Fast Backward, and Fast Forward. Replay remains available as a device button and in the scene action « press a button », for those who need it.
  • Navigation in the Remote: I would have loved that, but Gladys currently limits each widget to 4 buttons, and a real remote requires at least 7 (the 4 arrows, OK, Back, Home). Hence the two widgets, to be placed one below the other. I’ll bring up the idea of a real directional pad in widgets to @pierre-gilles: it would serve all remote integrations.

And for the Play button that « does nothing » on Arte: that’s normal Roku behavior. In app menus, it’s OK that confirms (as you found), and Play/Pause only works during a video, more or less depending on the app. I’ve specified this in the documentation.

As usual, the update will be offered to you as soon as the store has seen it, later today. Thanks again for these top-notch tests :folded_hands:

I’m happy to do that. Since the navigation currently can’t be integrated into the remote. Another suggestion, but I have no idea if it’s possible or makes sense. Here’s what I’m thinking:

The « OK » button is used to select the app and within the app until the actual selection menu for the stream/movie to be displayed.

Why not gray out the « Play » button until then?

Best regards
Tom

Good idea Tom, I’ve looked into it :slightly_smiling_face:

Two things are blocking for now:

  • Gladys doesn’t know how to gray out a widget button yet: a button is either displayed or not, there is no « disabled » state. I’ll add it to my list of ideas to propose to @pierre-gilles, along with the directional pad.
  • Hiding it outside of a video would be risky: the button would depend on what the app reports to the Roku, and not all apps indicate that a video is playing. The button could then disappear in the middle of a movie, which would be worse than the original problem :sweat_smile:

So I’ll keep Play/Pause visible, and the documentation now specifies that in menus it’s OK that confirms. If Gladys ever learns to gray out a button, I’ll do it with pleasure!