Skip to content

Roku Integration

Justin Randall edited this page Jan 12, 2018 · 3 revisions


Roku provides a very simple REST API that uses GETS and POSTS. The full External Control Guide documents the full set of commands and queries one can make to a Roku device including sending key presses, launching channels, querying for the list of installed channels, etc. Unfortunately the one major missing piece is the ability to query for the currently active channel.

Because the API is a simple REST, the HTTP Binding or HTTP actions can be used and there is no need for a Roku specific binding.

However, unless your home router is configured to give your Rokus a static IP your Rokus will use DHCP and therefore are not guaranteed to always have the same IP address. To work around this the Rokus support Simple Service Discovery Protocol (SSDP) which lets one query the network for SSDP devices and get the URL of those devices back. Therefore it can be prudent for openHAB to discover the IP addresses of the Rokus rather than hard code them.

The following Python script will perform an SSDP query and print the Roku serial number and API URL. The script can be called from openHAB to get the Roku's current URL and then that discovered URL can be used to issue commands.


import sys
import socket
import re

ssdpRequest = "M-SEARCH * HTTP/1.1\r\n" + \
        "HOST:\r\n" + \
        "Man: \"ssdp:discover\"\r\n" + \
        "MX: 5\r\n" + \
        "ST: roku:ecp\r\n\r\n";
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
sock.sendto(ssdpRequest, ("", 1900))
while True:
        resp = sock.recv(1024)
        matchObj = re.match(r'.*USN: uuid:roku:ecp:([\w\d]{12}).*LOCATION: (http://.*/).*', resp, re.S)
        if matchObj is not None:
            print ( + " " +
    except socket.timeout:

An example of how to use it.


String BedroomRokuAddress "Bedroom Roku [%s]"
String DenRokuAddress "Den Roku [%s]"
Switch RefreshRokuAddresses // used for testing

Switch S_C_BedroomRokuHome "Go Home on Bedroom Roku"


rule "Get Roku Addresses"
        Time cron "0 0 0/1 ? * *" or
        Item RefreshRokuAddresses received command
    logInfo("Roku", "Refreshing Roku Addresses")
    // Replace the path with your path to the Python script
    val String results = executeCommandLine("/etc/openhab/configurations/scripts/", 20000)
    logInfo("Roku", " results:\n" + results)
    val rokuAddrs = results.split("\n")
    rokuAddrs.forEach[addr |
        val s = addr.split(" ")
        switch (s.get(0)) {
                // Replace 1RE######### with your Roku's serial number
                case "1RE#########" : BedroomRokuAddress.postUpdate(s.get(1))
                case "1RE#########" : DenRokuAddress.postUpdate(s.get(1))
                default : logInfo("Roku", s.get(0) + " is an unknown Roku")

rule "Go Home on Bedroom Roku after bed"
        Time cron "0 0 2 ? * *" // 2 am
        logInfo("Roku", "Sending Bedroom Roku to Home")

NOTE: You can find the serial number on the label on the bottom of your Roku.

feature overview


Setup intro

Linux and OS X





User Interfaces



(link to openHAB forum)



Application Integration



A good source of inspiration and tips from users gathered over the years. Be aware that things may have changed since they were written and some examples might not work correctly.

Please update the wiki if you do come across any out of date information.

Binding configurations

Use case examples

Item definition examples

Sitemap definition examples

Collections of Rules on a single page

Single Rules


Syntax highlighting for external editors

Release Notes

Clone this wiki locally
You can’t perform that action at this time.