The logon method to the backend systems changed in January / February 2024. I currently lack the skills and knowledge to figure out how to get the session to connect for CH, GB, IE, NL, and likely SK. However, as at 15 June 2024, BE users have reported a fix for BE which I have added in to v2.3.2.
If you know anything about session authentication and are able to help, please get in touch.
homebridge-eosstb
is a Homebridge plugin allowing you to control your set-top box (typically an ARRIS DCX960 / VIP5002W or HUMAX EOS1008R / 2008C) running on the Telenet BE / Sunrise CH / UPC SK / Virgin Media GB & IE / Ziggo NL Horizon TV platform with Apple HomeKit using the Home app and the Apple TV Remote in the Control Center.
iOS/iPadOS 16+ Accessory Tiles | Older iOS/iPadOS Accessory Tiles |
---|---|
This plugin displays your set-top box as a Set-Top Box accessory with power, channel and remote-control capabilities on your iOS device (iPhone, iPad, iMac, etc.).
You need a subscription to the online TV service from your local TV provider. The username and password are the same as used in the TV provider's TV app on your iOS device (the app varies by country; in Switzerland it is Sunrise TV).
Supports multiple set-top boxes, should you have more than one.
If you like this plugin, consider buying me a coffee!
Logon methods for BE should be working again from v2.3.2-beta.1. Use Authentication Method B.
Logon methods for many providers changed from January 2024 to mid February 2024.
For GB, IE, NL and CH the logon method is no longer working. Refer Issue #112. If are able to help, please get in touch.
Due to the adding of features and functions, this Readme applies from v2.3.0. For prior versions, please see the eosstb release history on npm.
As Liberty Global (the operator of the Horizon TV platform) operates in multiple countries under multiple brands, this plugin will work in a number of countries that use the Horizon TV platform. The known countries that use the same TV platform with the ARRIS DCX960 / VIP5002W or HUMAX EOS1008R / 2008C set-top box are:
Country | TV Provider | Web App | Box Name | Notes |
---|---|---|---|---|
BE | Telenet | Telenet TV | Telenet TV-Box | As of 15 June 2024 should be working again. Use Authentication Method B. |
CH | Sunrise | Sunrise TV | Sunrise TV Box | As of February 2024, connection to box is no longer working. Help Wanted! |
GB | Virgin Media | Virgin TV Go | Virgin TV 360 and Virgin TV 360 Mini | As of January 2024, connection to box is no longer working. Help Wanted! |
IE | Virgin Media | Virgin TV Anywhere | 360 Box | As of January 2024, connection to box is no longer working. Help Wanted! |
NL | Ziggo | Ziggo GO | Mediabox Next | As of February 2024, connection to box is no longer working. Help Wanted! |
SK | UPC Broadband Slovakia | UPC TV | UPC TV Box | Testers Wanted |
------- | ----------- | ------- | -------- | ------------- |
PL | UPC PL | UPC TV GO | UPC TV Box | UPC TV in Poland appears to have been discontinued in August 2023 |
If you subscribe to a TV service from one of these countries, you are lucky, this plugin will work for you.
May also work with other Liberty Global countries, if you know of any, let me know.
This plugin was written and tested on the author's set-top box (ARRIS mediabox model DCX960/KK0L/A816/0000) running on Sunrise TV in Switzerland. It has also been extensively tested on Telenet in Belgium (also on the 2nd generation HUMAX 2008C-STB-xx), Virgin Media in Great Britain and Ireland, and Ziggo in the Netherlands.
I tried to find a good common name that works for this plugin for all countries. Each country uses a different marketing name for the box, so I could not use the local name. The EOS system, also known as the Horizon platform, originally used an ARRIS DCX960, but even this box comes in different types and with different firmware, so I decided not to use the model name. I stuck with the box identifier that appears in the mqtt messages: EOSSTB.
In March 2022, a newer version of the set-top box appeared in Telenet in Belgium: a HUMAX 2008C-STB-TN, which identifies itself as EOS2STB. This has since been seen in NL as a HUMAX 2008C-STB-ZG, and in CH as a HUMAX 2008C-STB-UPC/CH.
In January 2023, an ARRIS VIP5002W appeared, which identifies itself as an APLSTB. However, I will keep the plugin name unchanged at EOSSTB.
This plugin is not provided by Telenet or Sunrise or Virgin Media or Ziggo any other affiliate of Liberty Global. It is neither endorsed nor supported nor developed by Liberty Global or UPC Broadband or any affiliates. Liberty Global can change their systems at any time and that might break this plugin. But I hope not.
Full Remote-Control Support: The Apple TV Remote in your iOS device can control your set-top box; including power, menu navigation, play, pause, fast-forward, rewind, channel up/down, volume and mute commands. All keys are fully configurable for single-tap and double-tap.
Powerful Key Macros: You can program key macros to control your set-top box. Key macros are powerful ways of accessing any content such as radio channels that cannot be accessed directly via a channel number.
Siri Support You can control your set-top box with Siri (to the extent of what Apple Siri supports).
Shortcuts Support You can read and control your set-top box with Shortcuts and HomeKit automations (to the extent of what Apple supports), allowing you to control switch-on and channel selection in Home Automations, Shortcuts and Personal Automations, as well as read a lot of status information from your set-top box.
Synchronised Set-Top Box Name: Changing the name of the set-top box in the Home app changes it on the TV and backend systems in real time, and vice-versa. No reboot required. You can turn off the sync if desired in the config.
Synchronised Current Channel: Changing the channel on the set-top box changes the displayed channel in the Home app in real time, and vice-versa.
Selectable Channel Sort By: Channels in the Home app channel list can be listed in the same order as shown on the TV, or by Most Watched.
Synchronised Channel List Order: Changing the order of channels in a profile on your set-top box changes the standard channel list order in the Home app in real time. No reboot required. Note that the Shared Profile channel list order cannot be changed.
Master Channel List Refreshed Daily: The master channel list is refreshed daily, ensuring it is always up to date.
Ignores Non-Subscribed Channels: Only the channels you subscribe to are shown in the Home app, saving you valuable slots in the Home app channel list.
Optional Channel Numbers: If you wish, you can display a channel number before the channel name. As this consumes some space on the Home app tile, it is off by default.
Default Profile Support: The default profile on start-up of the set-top box is used for the channel list if no other profile is configured for the plugin.
Intelligent Mute: Clicking Volume Down on your iOS device three times in rapid succession sends a Mute command to your TV. A subsequent tap of Volume Up or Volume Down cancels the mute (TV dependent). The triple-tap timing is configurable.
Robust Session Handler: If the web session or mqtt sessions are lost, the plugin will automatically try to reconnect.
Informative Log Entries: The plugin logs show lots of information about your session and the state of the set-top box. Log levels are configurable with debugLevel.
Fully Configurable: A large amount of configuration items exist to allow you to configure your plugin the way you want.
Future Feature Support: The plugin also supports current and target media state as well as closed captions, even though the Home app accessory cannot currently display or control this data in the home app (as at iOS 18.0). Hopefully, Apple will add support for these features in the future. You can however use this data in Home Automations or the Shortcuts app.
Homebridge UI: the easiest way to install is to search for eosstb in the Homebridge UI, and then click INSTALL.
Manual install:
sudo npm install -g homebridge-eosstb
After installing, make sure you restart Homebridge.
The set-top box accessory is exposed as a separate external accessory and each set-top box needs to be manually paired as follows:
Your new accessory will appear shortly in the room that you selected. It may show Updating... for a few minutes as it loads all the data.
You can force a Home app refresh by switching to another room and then back again.
To access the Apple TV Remote, open your Control Center by swiping down from the top (newer iPhones and iPads) or up from the bottom of the screen (older iPhones). If you do not see the remote-control icon, you will need to activate it in Settings > Control Centre and ensure that the Apple TV Remote is in the list of INCLUDED CONTROLS. Make sure you select the correct device from the drop-down list at the top of the Apple TV Remote:
The following keys are supported by in the Apple TV Remote in the Control Center:
Key | Single Tap | Double Tap |
---|---|---|
Mute | Mute | n/a |
Power | Power | n/a |
Up | ArrowUp | ChannelUp |
Down | ArrowDown | ChannelDown |
Left | ArrowLeft | MediaRewind |
Right | ArrowRight | MediaFastForward |
Select | Enter | Enter |
PlayPause | MediaPlayPause | MediaPlayPause |
Back | Escape | Escape |
Info | MediaTopMenu | Guide |
Volume Up | volUpCommand | - |
Volume Down | volDownCommand | 3 clicks = mute |
NOTE: Prior to iOS 18.0, the Mute and Power buttons appeared in the Remote Control, however they were disabled. As of iOS 18.0, the buttons are enabled. Double tap is not applicable to the Mute and Power buttons.
The table shows the default key mappings. You can map any Apple TV Remote button to any set-top box remote control button, see the Wiki for all of the known KeyEvents.
The volume controls do not control the set-top box directly, as the set-top box has no volume capability. The set-top box physical remote actually sends IR commands to your TV. If you can control your TV volume via a network connection then the volume controls can be used to send volume commands to your TV via the raspberry pi. This is what the author uses.
Many TV providers provide hundreds of TV channels. The Home app is limited to 100 "services", which are TV channels or reserved for system control. This limits the maximum possible channels to 95, and thus the plugin will load the first 95 subscribed channels found, ignoring all non-subscribed channels.
If the channels you wish to have in the Home app are not within the first 95 subscribed channels in your TV providers channel list, then you can create a profile on the set-top box, and configure the profile with the channels you want, in the order you want. Enter the same profile name in the plugin config Profile Name, and the plugin will load the channels from that profile.
Any changes in the profile on the set-top box will automatically be reflected in the plugin. As the Home app does not expect channels to change in the channel list, you may need to force-close the Home app and reopen it to force a refresh of the displayed channels after a change is made on your set-top box.
The profile used by the plugin does not have to be the same as the set-top box's start-up profile. It is OK to configure a profile that is dedicated to the plugin, if you so wish.
The config item Channel Sort By allows the channels to be sorted by Channel Order (the standard channel order as shown on the TV) or by Most Watched. Most Watched is reported by the backend systems and is profile-based. It is not clear how often this list is updated, however for a TV subscription with many channels, this may be a preferable option to show your most watched channels at the top of the channel list.
You can program key macros to access any function of your set-top box. This is particularly useful to select radio channels. Key macros are loaded at the end of the channel list. See the Wiki Key Macros page for full details.
Due to HomeKit design limitations, the maximum services for a single accessory are 100. Over this value the Home app will no longer respond. Services used in this set-top box accessory are:
The eosstb plugin can detect the target and current media state and shows STOP, PLAY, PAUSE or LOADING (loading is displayed only for current media state when fast-forwarding or rewinding) in the Homebridge logs. Unfortunately, the Apple Home app cannot do anything with the media state (as at iOS 18.0) apart from allow you to read it in Shortcuts or Automations. Hopefully this will improve in the future.
The eosstb plugin can detect the current recording state of the set-top box, both for local HDD-based recording (for boxes that have a HDD fitted) and for network recording. The plugin shows IDLE, ONGOING_NDVR or ONGOING_LOCALDVR in the Homebridge logs. DVR means digital video recorder; N for network and LOCAL for local HDD based recording. The Apple Home app cannot natively do anything with the recording state but the eosstb plugin uses it to set the inUse charateristic if the set-top box is turned on or is recording to the local HDD. This is useful in Shortcuts or Automations.
The eosstb plugin can detect the closed captions state (Subtitle options in the set-top box menu) and shows ENABLED or DISABLED in the Homebridge logs. Unfortunately, the Apple Home app cannot do anything with the closed captions state (as at iOS 18.0) apart from allow you to read it in Shortcuts or Automations. Hopefully this will improve in the future.
Add a new platform to the platforms section of your homebridge config.json
.
Example minimum (mandatory) configuration:
"platforms": [
{
"country": "ch",
"username": "yourTvProviderUsername",
"password": "yourTvProviderPassword",
"platform": "eosstb"
}
]
Example extended configuration as used on the author with his EOSSTB set-top box. An extended configuration allows you to customise the behaviour of each set-top box device. You must identify the devices by their deviceId:
"platforms": [
{
"platform": "eosstb",
"name": "EOS",
"country": "ch",
"username": "yourTvProviderUsername",
"password": "yourTvProviderPassword",
"doublePressTime": 250,
"triplePressTime": 800,
"masterChannelRefreshCheckInterval": 60,
"debugLevel": 0,
"devices": [
{
"deviceId": "3C36E4-EOSSTB-00365657xxxx",
"name": "Sunrise TV",
"syncName": true,
"profile": "Dad",
"channelOrder": "mostWatched",
"accessoryCategory": "settopbox",
"playPauseButton": "MediaPlayPause",
"backButton": "Escape",
"infoButton": "MediaTopMenu",
"volUpCommand": "samsungctl --host x.x.x.x --name HomeKit --timeout 0.2 KEY_VOLUP",
"volDownCommand": "samsungctl --host x.x.x.x --name HomeKit --timeout 0.2 KEY_VOLDOWN",
"muteCommand": "samsungctl --host x.x.x.x --name HomeKit --timeout 0.2 KEY_MUTE",
"manufacturer": "ARRIS",
"modelName": "DCX960",
"serialNumber": "123456",
"firmwareRevision": "4.40",
"showChannelNumbers": false,
"maxChannels": 50
},
],
"channels": [
{
"channelKeyMacro": "TV MediaTopMenu wait(2000) ArrowRight ArrowRight Enter wait(1000) ArrowDown wait(1500) Enter wait(2000) Enter",
"channelName": "Last Played Radio"
},
{
"channelId": "SV09690",
"channelName": "Netflix"
}
]
}
]
Unless otherwise stated, all config items are case sensitive.
Mandatory config items must always exist. These are used to establish the session to the EOS / Horizon platform. If any mandatory config items are missing, a warning is shown and initialization is aborted.
platform: the name of the platform. Mandatory, must be eosstb.
country: Your country. Must be one of ch, nl, be-nl, be-fr, at or gb. Not case sensitive. This controls the country-specific logon sequence and the mqtt sessions. Mandatory.
username: Your login username for your TV account, same as used in the TV app on your iOS device. Often an email address, but some providers use a mobile phone number. Mandatory.
password: Your password associated with your TV account. Mandatory.
name: The platform name that appears in the Homebridge logs. In many countries the platform is called Horizon, but you can name it to anything. Optional, defaults to "EOSSTB".
doublePressTime: The amount of time in ms to detect double-tap of a button. Used for double-tap or triple-press features, such as double-tap of Info generates Guide. Optional, defaults to 250ms.
triplePressTime: The amount of time in ms to detect triple-tap of a button. Used for triple-tap or triple-press features, such as triple-press of Volume Down generates Mute. Optional, defaults to 800ms.
masterChannelListValidFor: Amount of time in seconds that the master channel list stays valid for. Default 60s.
debugLevel: Controls the amount of debug data shown in the Homebridge logs, independent of the debug setting in Homebridge. Extra debug messages above level 0 are shown in the Homebridge log in the warning colour, normally yellow. Supported values are: 0=No debug logging, 1=Minimum, 2=Enhanced, 3=Verbose. Optional. Defaults to 0 if not found. Warning: a lot of log entries can occur at the higher debug levels.
Most people will be happy with the default device config. If you do not need to change anything, you can omit the device config section. If you want to configure your devices differently, do so here. Multiple devices are supported, each device can be configured separately. The devices are identified by their physical deviceId. You will see that there is no option to set the name in the config, as the name of the set-top box displayed in the Home app is always synchronised to the physical set-top box. You can change the set-top box name in the Home app.
name: The device name. Set to anything you want. If syncName is true, the name will also be synced to the set-top box. Note that the set-top box name must be between 3 and 14 characters long; shorter names are expanded, longer names are truncated. Optional, defaults to the current set-top box name.
syncName: You can choose to sync the HomeKit name with the physical set-top box name. If you set syncName to false, you can name the set-top box in HomeKit differently to the physical set-top box. Optional, defaults to true.
accessoryCategory: The accessory category. This changes the image on the tile in the Home app. Allows you to use a TV or an Audio Receiver or a Set-Top Box (default). Available values are: Set-Top-Box = any of "settopbox", "stb". TV = any of "television", "tv". Audio Receiver = any of "receiver", "audio-receiver", "avr". Not case sensitive. Optional, defaults to Set-Top Box if the value is not recognised.
manufacturer: You can add a manufacturer name if you wish. Defaults to the detected device and platform type, otherwise to the eosstb platform name. Optional.
serialNumber: You can add a serial number if you wish. Defaults to the set-top box serial number id, otherwise to the physical deviceId. Optional.
modelName: You can add a model name if you wish. Defaults to the detected device model and product type or device type, otherwise to the eosstb plugin name. Optional.
firmwareRevision: You can add a firmware revision if you wish. Must be numeric (non-numeric values are not displayed in the Home app). Defaults to the eosstb plugin version. Optional.
profile: The profile name to use to load the channel list for the device. Optional, defaults to the default profile on startup, as configured on the set-top box. The plugin loads the first 95 subscribed channels found, which is a limitation of HomeKit. To manage your favourite channels within the constraint of 95 channels, create a profile on your set-top box, and use the profile name in the plugin config. If your profile is changed to the set-top box, the changes will be pushed to HomeKit. Channels should stay in a consistent channel order as the channel number is used in HomeKit scenes, not the channel name.
channelOrder: The method to sort the channels in the channel list in the Home app. Available values are: Channel order = "channelOrder", Most Watched = "mostWatched". Case sensitive. Optional, defaults to channelOrder.
maxChannels: The maximum number of channels to load. Optional, defaults to 95. Note: you may need to do force-close and reopen the Home app to force it to recognise a change in the quantity of channels available.
showChannelNumbers: Shows or hides the channel numbers in the channel selector in HomeKit. Values: true or false (default). If channel numbers are displayed, there is less room for the channel name. Optional, defaults to false.
playPauseButton: The command issued to the set-top box when the Play/Pause button (> ||) in the Apple TV Remote is tapped. Normally MediaPause. Optional, defaults to MediaPause if not found.
backButton: The command issued to the set-top box when the BACK button in the Apple TV Remote is tapped. Normally Escape. Optional, defaults to Escape if not found.
infoButton: The command issued to the set-top box when the Info button (i) in the Apple TV Remote is tapped. As the Apple TV Remote has no Menu button, the Info button should be used to access the menu. This is why the Info button is set to MediaTopMenu. Optional, defaults to MediaTopMenu if not found.
volUpCommand: The bash command to increase the volume of the TV. This command is sent when the Apple TV Remote is open and you press the Volume Up button on your device. Optional.
volDownCommand: The bash command to decrease the volume of the TV. This command is sent when the Apple TV Remote is open and you press the Volume Down button on your device. Optional.
muteCommand: The bash command to mute the TV. Whilst not supported natively in the Apple TV Remote, this plugin integrates it with a triple-press on the Volume Down button. Mute is also supported in Homebridge. Optional.
Some channels such as Netflix are actually apps on the set-top box, and not normal linear TV channels. They appear in the channel list on the TV, and can be added to favourites from the TV menu (but not from the web app menu). However, they are not broadcast as a normal linear TV channel in the master channel list. Therefore, the name cannot be determined from the profile favourite channel list, and the name appears as "Channel xxxxxx" where xxxxxx is the channelId. To overcome this, add the channelId and the channelName to the channels section in the config as per the examples below.
channelId: The channelId, as defined by the TV provider. Unknown channelIds will appear in the Homebridge log.
channelKeyMacro: The channel key macro (key sequence) to send. If channelKeyMacro is present, channelId is ignored.
channelNames: Allows you to add unknown channel names, names for key macros, or to rename any channel as you wish. Required as some channels (e.g., Netflix) are not published on the master channel list. If a channel displays in the Home app like this: "Channel SV09690", then check your TV to see the channel name, and add it to the config. An example is provided for Netflix. Optional, unknown channels are displayed as "Channel xxxxxxx" where xxxxxxx is the channelId.
Telenet BE:
"channels": [
{
"channelId": "netflix",
"channelName": "Netflix"
}
]
Virgin Media GB:
"channels": [
{
"channelId": "1755",
"channelName": "Netflix"
},
{
"channelId": "2054",
"channelName": "Prime Video"
}
]
Sunrise CH:
"channels": [
{
"channelId": "SVO9690",
"channelName": "Netflix"
}
]
Ziggo NL:
"channels": [
{
"channelId": "NL_000073_019506",
"channelName": "Netflix"
},
{
"channelId": "NL_000210_019505",
"channelName": "Viaplay"
}
]
See the Wiki for a collection of known key event commands that control the set-top box.
The volume and mute commands do not control the set-top box directly, but can be used to control the TV or Receiver volume (network remote control of the TV is required).
You can use View TV Settings to open the set-top box main menu at the PROFILES menu. Usage: in the Home app, tap-and-wait on the set-top box tile to open the channel changer, then tap on the cogwheel to open the settings for the accessory, and scroll down to View TV Settings.
See the Wiki for details on how to control the set-top box with Siri.
See the Wiki for details on how to read and control the set-top box in the Shortcuts app.
ziggonext-python by Rudolf Offereins Rudolf is the best!
My helpers in Belgium: Wesley Liekens† (RIP) and Anthony Dekimpe for helping me get the session code working for Telenet
My helpers in Great Britain and Ireland (you know who you are) for helping me get the session code working for Virgin Media
Liberty Global (previously known as UPC Broadband) for making such a useful Horizon TV platform and lovely set-top boxes