Coder Social home page Coder Social logo

jsiegenthaler / homebridge-eosstb Goto Github PK

View Code? Open in Web Editor NEW
32.0 6.0 4.0 12.29 MB

A homebridge plugin for the EOS set-top box as used by Sunrise, Telenet, Ziggo, Virgin Media and maybe more in various countries on the Horizon Go (HGO) platform

Home Page: https://github.com/jsiegenthaler/homebridge-eosstb

JavaScript 100.00%
upc telenet ziggo virgin-media upc-tv tv-box upc-box tv-accessory virgin eos-box

homebridge-eosstb's Introduction

Sunrise TV Box (ARRIS DCX960)
RoomWithEosstb EosstbControls RemoteControl

homebridge-eosstb

IMPORTANT NOTICE


22 June 2024: Logon method for BE confirmed working again, available from v2.3.2.

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.


npm npm npm EOSSTB Discord verified-by-homebridge GitHub issues

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
EosstbAccessoryTile EosstbAccessoryTileiOS15

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!

Update June 2024

Logon methods for BE should be working again from v2.3.2-beta.1. Use Authentication Method B.

Update February 2024

Logon methods for many providers changed from January 2024 to mid February 2024.

Help Wanted

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.

Readme Applicability

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.

Works in Your Country (If you are with Sunrise / Telenet / UPC SK / Virgin Media / Ziggo)

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.

Made in Switzerland

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.

Why I chose the Name EOSSTB

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.

Disclaimer (The Legal Stuff)

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.

Requirements

  • An Apple iPhone or iPad with iOS/iPadOS 14.0 (or later). Developed on iOS 14.1...17.5, earlier versions not tested.
  • Homebridge v1.1.116 (or later). Developed on Homebridge 1.1.116....1.8.2, earlier versions not tested.
  • A TV subscription from one of the supported countries and TV providers.
  • An online account for viewing TV in the web app (often part of your TV package), see the table above.
  • An ARRIS DCX960 or HUMAX EOS1008R / 2008C / VIP5002W set-top box, provided by your TV provider as part of your TV subscription, called by the system an "EOSSTB", "EOS2STB" or "APLSTB" and marketed under different names in different countries.
  • The set-top box should be set to SYSTEM > Standby power consumption = Fast start to ensure it is always online and can respond to switch-on requests from HomeKit.
  • For GB and IE users: if using an ARRIS DCX960, it must be running the TV 360 software, and not the older TiVo V6 software as found in GB and IE. TiVo V6 is not supported by this plugin, but GB users can upgrade to TV 360 by contacting Virgin Media.

Features

EosstbControls

  • 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 17.5). Hopefully, Apple will add support for these features in the future. You can however use this data in Home Automations or the Shortcuts app.

Installation

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.

Adding the Set-Top Box to the Home App

The set-top box accessory is exposed as a separate external accessory and each set-top box needs to be manually paired as follows:

  1. Open the Home app on your device.
  2. Tap the Home tab, then tap + in the top right corner of the screen and then Add Accessory to start the process of adding a new accessory.
  3. Add Accessory: tap More options... to add the accessory manually.
  4. Select an Accessory to Add to <HomeName>: Select the accessory you want to add. You should see your set-top box here. If not, check your Homebridge config.
  5. Accept the Uncertified Accessory warning by tapping Add Anyway.
  6. Enter HomeKit Setup Code: Enter the HomeKit Setup Code (displayed in Homebridge under the QR code, format XXXX-XXXX), or use the device's camera to scan the QR code in Homebridge and tap Continue.
  7. Set-Top Box Location: Select a room for your new accessory and tap Continue.
  8. Set-Top Box Name: Give your set-top box a different name if you wish (synchronised to your real set-top box, you can change this in the Home app later) and tap Continue.
  9. Name TV Input Sources: Re-name your TV input sources if you wish (you can change these in the Home app later) and tap Continue.
  10. Set-Top Box Automations: Switch on any suggested automations if you wish (you can change these in the Home app later) and tap Continue.
  11. Set-Top Box Added to <HomeName>: Tap Done to finish the setup.

EosstbAccessoryTile

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.

Remote Control Supported Keys

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:

RemoteControl

Key Single Tap Double Tap
Mute (see note) (see note)
Power (see note) (see note)
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: The Mute and Power buttons appear in the Remote Control as of iOS 17.5, however they are disabled. Currently, I do not know how to enable these buttons. If you have any information about these buttons, please get in touch with me.

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.

Using Profiles to Better Manage your Channel List

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.

Sorting the Channel list

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.

Using Key Macros to Access Extra Capabilities

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.

Limitations

Channel Count

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:

  1. Information service (Name, model, serial number of the accessory)
  2. Television service (for controlling the TV accessory)
  3. Speaker service (for the controlling the TV accessory volume)
  4. Input service. The input (TV channels) utilises one service per input. The maximum possible channels (inputs) are thus 100 - 3 = 97. I have limited the inputs to maximum 95, but you can override this in the config (helpful to reduce log entries when debugging). The inputs are hard limited to 95 inputs.

Media State (Play/Pause) Limitations

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 17.5) apart from allow you to read it in Shortcuts or Automations. Hopefully this will improve in the future.

Recording State Limitations

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.

Closed Captions Limitations

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 17.5) apart from allow you to read it in Shortcuts or Automations. Hopefully this will improve in the future.

Configuration

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"
                }
            ]
        }
    ]

Platform Config Items

Unless otherwise stated, all config items are case sensitive.

Mandatory

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.

Optional

  • 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.

Device Config Items

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.

Mandatory

  • deviceId: The unique set-top box physical device id, in Switzerland, Belgium and the Netherlands this is in the format 3C36E4-EOSSTB-001234567890. Other countries are similar. Required to identify the set-top box in your network, as multiple boxes can exist. Review the Homebridge log to see your deviceId, it is displayed shortly after a Homebridge restart. Mandatory for a device configuration.

Optional

Name and Icon
  • 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.

Accessory information
  • 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.

Channel Display
  • 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.

Remote Control Button Mapping
  • 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.

Remote Control Volume Commands
  • 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.

Channel Config Items

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"
        }
    ]

Set-Top Box KeyEvent Commands

See the Wiki for a collection of known key event commands that control the set-top box.

Special Commands

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).

Volume

  • VolumeUp and VolumeDown: When the Apple TV Remote is displayed, the iOS device volume controls can be used to control the volume of your TV. However, this is not done via the set-top box, but instead via a command using a command line interface (CLI) to your TV. Your TV must be capable of being controlled remotely via any machine that can accept a bash command, such as a raspberry pi. The author has a Samsung Home Theater HT-D5500 and runs Homebridge on a raspberry pi, and thus uses samsungctl which allows KEY_VOLUP, KEY_VOLDOWN and KEY_MUTE to be easily sent to the Samsung Home Theater. If you already have volume buttons in Homebridge for your TV, you can control Homebridge via the command line. See the [TV Volume Control Wiki page] (https://github.com/jsiegenthaler/homebridge-eosstb/wiki/TV-Volume-Control) and also the examples in issue 506 in the Homebridge issues log and scroll to the bottom to see some working command lines. Once you know what bash command works, configure it in volUpCommand and volDownCommand.

Mute

  • Mute is not supported natively by the Apple TV Remote, but this plugin adds it with a triple-press detection on the volume down button. Press the button three times within 800ms, and the Mute command will be sent using the command stored in the muteCommand config item.

View TV Settings

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.

Siri

See the Wiki for details on how to control the set-top box with Siri.

Shortcuts

See the Wiki for details on how to read and control the set-top box in the Shortcuts app.

Thanks to

homebridge-eosstb's People

Contributors

dependabot[bot] avatar jsiegenthaler avatar robmarcopolo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

homebridge-eosstb's Issues

Siri

Describe the solution you'd like:

Additional context:

IMG_9557
IMG_9558
IMG_9558
IMG_9559

Step 3 of 7: Unable to login: wrong credentials

After updating to 1.1.16 I get a wrong credentials error
everything works fine under 1.1.14

[10/3/2021, 9:35:21 PM] [EOSSTB] Step 3 of 7: logging in with username w********@icloud.com
[10/3/2021, 9:35:21 PM] [EOSSTB] Step 3 of 7: response: 302
[10/3/2021, 9:35:21 PM] [EOSSTB] Step 3 of 7: Unable to login: wrong credentials

  • Plugin Version:1.1.16
  • Homebridge Version: v1.3.4
  • Node.js Version: v14.18.0
  • NPM Version: v6.14.15
  • Operating System: macOS

Showing media state

Is it possible to show the media state (Play/Pause) in the tile within the Home app? Now it showing 'on' when playing a recording or Netflix. I hoped I could use Siri on the HomePod to play/pause content (same like with AppleTV), but this is not possible (yet?).

Arcadyan HMB2260 and/or Motorola 1853

Is your feature request related to a problem? Please describe:
No, just would like to see this working on a Arcadyan HMB2260 and/or Motorola 1853

Describe the solution you'd like:
Would lik to see this implementation for a Arcadyan HMB2260 and/or with a KPN or XS4ALL account.

Describe alternatives you've considered:
Could not find a alternative, this was the only with the functionality I'm looking for.

For specs see:
https://www.xs4all.nl/service/probleem-oplossen/televisie/specificaties-tv-ontvanger/

Not working anymore for Ziggo mediabox Next

Stopped working for me here are the logs

[3/17/2021, 18:37:14] [eosstb] Refreshing master channel list...
[3/17/2021, 18:37:15] [eosstb] Master channel list refreshed with 152 channels, valid until 3/17/2021, 18:39:29
[3/17/2021, 18:37:15] [eosstb] getProfilesUpdate: error: Error: Request failed with status code 403
at createError (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios/lib/core/createError.js:16:15)
at settle (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios/lib/core/settle.js:17:12)
at /usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/interceptors/response.js:83:25
at new Promise ()
at responseInterceptor (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/interceptors/response.js:82:9)
at /usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/index.js:130:67
at runMicrotasks ()
at processTicksAndRejections (internal/process/task_queues.js:97:5) {
config: {
url: 'https://prod.spark.ziggogo.tv/nld/web/personalization-service/v1/customer/17225485_nl/profiles',
method: 'get',
headers: {
Accept: 'application/json',
'x-cus': '17225485_nl',
'x-oesp-token': 'eyJ0eXAiOiJKV1QiLCJraWQiOiJvZXNwX3Rva2VuX3Byb2RfMjAyMDA4MTkiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxNzIyNTQ4NV9ubCIsImlzcyI6IndlYi1hcGktcHJvZC1vYm8uaG9yaXpvbi50diIsImV4cCI6MTYxNDc5MDI5NywiaWF0IjoxNjE0NzgzMDk3LCJzaWQiOiI4MGQxY2RhZTMwNDdkNTcwNDRlOWI3ZTU4ODcwYzdjOWEyM2E5ZWM0Y2YyN2UxY2VmMTA5MTAwYWM2NTQ5NmI1In0.IoJFMGtLIQFFtpdl3Mfd5a4FuyWOzZttAjbGFp15E5w',
'x-oesp-username': '[email protected]',
'User-Agent': 'axios/0.21.1'
},
transformRequest: [ [Function: transformRequest] ],
transformResponse: [ [Function: transformResponse] ],
timeout: 0,
withCredentials: true,
adapter: [Function: httpAdapter],
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
maxBodyLength: -1,
jar: undefined,
maxRedirects: 0,
data: undefined,
validateStatus: [Function: validateStatus]
},
request: ClientRequest {
_events: [Object: null prototype] {
error: [Function: handleRequestError],
prefinish: [Function: requestOnPrefinish]
},
_eventsCount: 2,
_maxListeners: undefined,
outputData: [],
outputSize: 0,
writable: true,
_last: true,
chunkedEncoding: false,
shouldKeepAlive: false,
useChunkedEncodingByDefault: false,
sendDate: false,
_removedConnection: false,
_removedContLen: false,
_removedTE: false,
_contentLength: 0,
_hasBody: true,
_trailer: '',
finished: true,
_headerSent: true,
socket: TLSSocket {
_tlsOptions: [Object],
_secureEstablished: true,
_securePending: false,
_newSessionPending: false,
_controlReleased: true,
secureConnecting: true,
_SNICallback: null,
servername: 'prod.spark.ziggogo.tv',
alpnProtocol: false,
authorized: true,
authorizationError: null,
encrypted: true,
_events: [Object: null prototype],
_eventsCount: 10,
connecting: false,
_hadError: false,
_parent: null,
_host: 'prod.spark.ziggogo.tv',
_readableState: [ReadableState],
readable: true,
_maxListeners: undefined,
_writableState: [WritableState],
writable: false,
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: undefined,
_server: null,
ssl: [TLSWrap],
_requestCert: true,
_rejectUnauthorized: true,
parser: null,
_httpMessage: [Circular],
[Symbol(res)]: [TLSWrap],
[Symbol(verified)]: true,
[Symbol(pendingSession)]: null,
[Symbol(asyncId)]: 6142093,
[Symbol(kHandle)]: [TLSWrap],
[Symbol(kSetNoDelay)]: false,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(kCapture)]: false,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(connect-options)]: [Object]
},
connection: TLSSocket {
_tlsOptions: [Object],
_secureEstablished: true,
_securePending: false,
_newSessionPending: false,
_controlReleased: true,
secureConnecting: true,
_SNICallback: null,
servername: 'prod.spark.ziggogo.tv',
alpnProtocol: false,
authorized: true,
authorizationError: null,
encrypted: true,
_events: [Object: null prototype],
_eventsCount: 10,
connecting: false,
_hadError: false,
_parent: null,
_host: 'prod.spark.ziggogo.tv',
_readableState: [ReadableState],
readable: true,
_maxListeners: undefined,
_writableState: [WritableState],
writable: false,
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: undefined,
_server: null,
ssl: [TLSWrap],
_requestCert: true,
_rejectUnauthorized: true,
parser: null,
_httpMessage: [Circular],
[Symbol(res)]: [TLSWrap],
[Symbol(verified)]: true,
[Symbol(pendingSession)]: null,
[Symbol(asyncId)]: 6142093,
[Symbol(kHandle)]: [TLSWrap],
[Symbol(kSetNoDelay)]: false,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(kCapture)]: false,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(connect-options)]: [Object]
},
_header: 'GET /nld/web/personalization-service/v1/customer/17225485_nl/profiles HTTP/1.1\r\n' +
'Accept: application/json\r\n' +
'x-cus: 17225485_nl\r\n' +
'x-oesp-token: eyJ0eXAiOiJKV1QiLCJraWQiOiJvZXNwX3Rva2VuX3Byb2RfMjAyMDA4MTkiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxNzIyNTQ4NV9ubCIsImlzcyI6IndlYi1hcGktcHJvZC1vYm8uaG9yaXpvbi50diIsImV4cCI6MTYxNDc5MDI5NywiaWF0IjoxNjE0NzgzMDk3LCJzaWQiOiI4MGQxY2RhZTMwNDdkNTcwNDRlOWI3ZTU4ODcwYzdjOWEyM2E5ZWM0Y2YyN2UxY2VmMTA5MTAwYWM2NTQ5NmI1In0.IoJFMGtLIQFFtpdl3Mfd5a4FuyWOzZttAjbGFp15E5w\r\n' +
'x-oesp-username: [email protected]\r\n' +
'User-Agent: axios/0.21.1\r\n' +
'Host: prod.spark.ziggogo.tv\r\n' +
'Connection: close\r\n' +
'\r\n',
_keepAliveTimeout: 0,
_onPendingData: [Function: noopPendingOutput],
agent: Agent {
_events: [Object: null prototype],
_eventsCount: 2,
_maxListeners: undefined,
defaultPort: 443,
protocol: 'https:',
options: [Object],
requests: {},
sockets: [Object],
freeSockets: {},
keepAliveMsecs: 1000,
keepAlive: false,
maxSockets: Infinity,
maxFreeSockets: 256,
maxTotalSockets: Infinity,
totalSocketCount: 2,
maxCachedSessions: 100,
_sessionCache: [Object],
[Symbol(kCapture)]: false
},
socketPath: undefined,
method: 'GET',
insecureHTTPParser: undefined,
path: '/nld/web/personalization-service/v1/customer/17225485_nl/profiles',
_ended: true,
res: IncomingMessage {
_readableState: [ReadableState],
readable: false,
_events: [Object: null prototype],
_eventsCount: 3,
_maxListeners: undefined,
socket: [TLSSocket],
connection: [TLSSocket],
httpVersionMajor: 1,
httpVersionMinor: 1,
httpVersion: '1.1',
complete: true,
headers: [Object],
rawHeaders: [Array],
trailers: {},
rawTrailers: [],
aborted: false,
upgrade: false,
url: '',
method: null,
statusCode: 403,
statusMessage: 'Forbidden',
client: [TLSSocket],
_consuming: false,
_dumped: false,
req: [Circular],
[Symbol(kCapture)]: false
},
aborted: false,
timeoutCb: null,
upgradeOrConnect: false,
parser: null,
maxHeadersCount: null,
reusedSocket: false,
host: 'prod.spark.ziggogo.tv',
protocol: 'https:',
[Symbol(kCapture)]: false,
[Symbol(kNeedDrain)]: false,
[Symbol(corked)]: 0,
[Symbol(kOutHeaders)]: [Object: null prototype] {
accept: [Array],
'x-cus': [Array],
'x-oesp-token': [Array],
'x-oesp-username': [Array],
'user-agent': [Array],
host: [Array]
}
},
response: {
status: 403,
statusText: 'Forbidden',
headers: {
'content-type': 'text/html',
'content-length': '146',
'access-control-allow-credentials': 'true',
'access-control-allow-methods': 'GET, POST,PUT, OPTIONS, DELETE, HEAD, PATCH',
'access-control-allow-headers': 'Accept-Charset, Accept-Encoding, Access-Control-Request-Headers, Access-Control-Request-Method, Authorization, Cache-Control, Connection, Content-Encoding, Content-Type, Content-Length, DNT, Date, Host, If-Modified-Since, Keep-Alive, Origin, Referer, Server, TokenIssueTime, Transfer-Encoding, User-Agent, Vary, X-CustomHeader, X-Requested-With, password, username, x-request-id, x-ratelimit-app, x-auth-id, x-auth-key, x-guest-token, X-HTTP-Method-Override, x-oesp-username, x-oesp-token, x-cus, x-dev, X-Client-Id, X-Device-Code, X-Language-Code, UserRole, x-session-id, x-entitlements-token, x-go-dev, x-profile, x-api-key, nv-authorizations, X-Viewer-Id',
'x-edgeconnect-midmile-rtt': '0',
'x-edgeconnect-origin-mex-latency': '94',
date: 'Wed, 17 Mar 2021 18:37:15 GMT',
connection: 'close',
'access-control-allow-origin': 'https://www.horizon.tv'
},
config: {
url: 'https://prod.spark.ziggogo.tv/nld/web/personalization-service/v1/customer/17225485_nl/profiles',
method: 'get',
headers: [Object],
transformRequest: [Array],
transformResponse: [Array],
timeout: 0,
withCredentials: true,
adapter: [Function: httpAdapter],
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
maxBodyLength: -1,
jar: undefined,
maxRedirects: 0,
data: undefined,
validateStatus: [Function: validateStatus]
},
request: ClientRequest {
_events: [Object: null prototype],
_eventsCount: 2,
_maxListeners: undefined,
outputData: [],
outputSize: 0,
writable: true,
_last: true,
chunkedEncoding: false,
shouldKeepAlive: false,
useChunkedEncodingByDefault: false,
sendDate: false,
_removedConnection: false,
_removedContLen: false,
_removedTE: false,
_contentLength: 0,
_hasBody: true,
_trailer: '',
finished: true,
_headerSent: true,
socket: [TLSSocket],
connection: [TLSSocket],
_header: 'GET /nld/web/personalization-service/v1/customer/17225485_nl/profiles HTTP/1.1\r\n' +
'Accept: application/json\r\n' +
'x-cus: 17225485_nl\r\n' +
'x-oesp-token: eyJ0eXAiOiJKV1QiLCJraWQiOiJvZXNwX3Rva2VuX3Byb2RfMjAyMDA4MTkiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxNzIyNTQ4NV9ubCIsImlzcyI6IndlYi1hcGktcHJvZC1vYm8uaG9yaXpvbi50diIsImV4cCI6MTYxNDc5MDI5NywiaWF0IjoxNjE0NzgzMDk3LCJzaWQiOiI4MGQxY2RhZTMwNDdkNTcwNDRlOWI3ZTU4ODcwYzdjOWEyM2E5ZWM0Y2YyN2UxY2VmMTA5MTAwYWM2NTQ5NmI1In0.IoJFMGtLIQFFtpdl3Mfd5a4FuyWOzZttAjbGFp15E5w\r\n' +
'x-oesp-username: [email protected]\r\n' +
'User-Agent: axios/0.21.1\r\n' +
'Host: prod.spark.ziggogo.tv\r\n' +
'Connection: close\r\n' +
'\r\n',
_keepAliveTimeout: 0,
_onPendingData: [Function: noopPendingOutput],
agent: [Agent],
socketPath: undefined,
method: 'GET',
insecureHTTPParser: undefined,
path: '/nld/web/personalization-service/v1/customer/17225485_nl/profiles',
_ended: true,
res: [IncomingMessage],
aborted: false,
timeoutCb: null,
upgradeOrConnect: false,
parser: null,
maxHeadersCount: null,
reusedSocket: false,
host: 'prod.spark.ziggogo.tv',
protocol: 'https:',
[Symbol(kCapture)]: false,
[Symbol(kNeedDrain)]: false,
[Symbol(corked)]: 0,
[Symbol(kOutHeaders)]: [Object: null prototype]
},
data: '\r\n' +
'<title>403 Forbidden</title>\r\n' +
'\r\n' +
'

403 Forbidden

\r\n' +
'
nginx\r\n' +
'\r\n' +
'\r\n'
},
isAxiosError: true,
toJSON: [Function: toJSON]

Invalid credentials

[12/4/2020, 2:25:19 PM] [Telenet TV Box] getSession: 400 - [{"type":"state","code":"invalidCredentials","reason":"invalid"}]

We have 5 accounts connected to the mytelenet website
2 admin accounts and 3 useraccounts
None of those are accepted in the config

I know telenet uses another login method as the other countries

Won’t show channels

I’m sorry, couldn’t get the beta to work, but the new version doesn’t work correctly either.
Doesn’t show channels, can’t put in a different room.
Can only turn it on or off.

C0454575-B249-4C62-9238-DEEA2F4E4677

Logging is showing polling info each x minutes

Hi, first many thanks for developing this plug-in!! This plugin is working fine.
I don't know whether it is a bug or intended functionality. The logging is showing the same info each x minutes.
Is this required for a correct working plugin?

For example:
[16/03/2021, 10:03:06] [eosstb] Refreshing master channel list...
[16/03/2021, 10:03:06] [eosstb] Master channel list refreshed with 152 channels, valid until 16/03/2021, 10:17:14
[16/03/2021, 10:03:06] [eosstb] Discovered 1 profiles
[16/03/2021, 10:03:06] [eosstb] Loading profile: 0 Shared Profile
[16/03/2021, 10:03:06] [eosstb] Channel List refreshed from Shared Profile with 90 channels
[16/03/2021, 10:18:06] [eosstb] Refreshing master channel list...
[16/03/2021, 10:18:06] [eosstb] Master channel list refreshed with 152 channels, valid until 16/03/2021, 10:30:46
[16/03/2021, 10:18:07] [eosstb] Discovered 1 profiles
[16/03/2021, 10:18:07] [eosstb] Loading profile: 0 Shared Profile
[16/03/2021, 10:18:07] [eosstb] Channel List refreshed from Shared Profile with 90 channels
[16/03/2021, 10:31:06] [eosstb] Refreshing master channel list...
[16/03/2021, 10:31:06] [eosstb] Master channel list refreshed with 152 channels, valid until 16/03/2021, 10:30:46
[16/03/2021, 10:31:06] [eosstb] Discovered 1 profiles
[16/03/2021, 10:31:06] [eosstb] Loading profile: 0 Shared Profile
[16/03/2021, 10:31:06] [eosstb] Channel List refreshed from Shared Profile with 90 channels
[16/03/2021, 10:32:06] [eosstb] Refreshing master channel list...
[16/03/2021, 10:32:06] [eosstb] Master channel list refreshed with 152 channels, valid until 16/03/2021, 10:44:37
[16/03/2021, 10:32:06] [eosstb] Discovered 1 profiles
[16/03/2021, 10:32:06] [eosstb] Loading profile: 0 Shared Profile
[16/03/2021, 10:32:06] [eosstb] Channel List refreshed from Shared Profile with 90 channels

GB Refuses to acknowledge device

I have successfully set up many devices with homebridge (working correctly) however, this one seems to do nothing. Is there something else that must be installed for this to work?

My homebridge log reads:

...
[ 22/04/2021 , [Virgin] Step 3 of 7: response: 200 OK
[ 22/04/2021 , [Virgin] Step 4 of 7: follow redirect url
[ 22/04/2021 , [Virgin] Step 4 of 7 response: 302 Found
[ 22/04/2021 , [Virgin] Step 5 of 7: extract authorizationCode
[ 22/04/2021 , [Virgin] Step 5 of 7: authorizationCode OK
[ 22/04/2021 , [Virgin] Step 6 of 7: post auth data with valid code
[ 22/04/2021 , [Virgin] Step 6 of 7: response: 200 OK
[ 22/04/2021 , [Virgin] Step 7 of 7: post refreshToken request
[ 22/04/2021 , [Virgin] Step 7 of 7: response: 200 OK
[ 22/04/2021 , [Virgin] Session created

When I then try to add to home it can’t find anything.

A lot of warnings since update to version 1.1.7

Describe The Bug:
After updating to the latest version 1.1.7 there are many error messages in the log. The error messages are updated every 5 minutes.
To Reproduce:

Expected behavior:

Logs:
21.4.2021, 21:08:40 (node:1988) UnhandledPromiseRejectionWarning: TypeError: this.currentChannelId.includes is not a function
21.4.2021, 21:08:40 at stbDevice.updateDeviceState (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:2494:30)
21.4.2021, 21:08:40 at stbPlatform.mqttDeviceStateHandler (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:1495:34)
21.4.2021, 21:08:40 at MqttClient. (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:1440:12)
21.4.2021, 21:08:40 at MqttClient.emit (events.js:315:20)
21.4.2021, 21:08:40 at MqttClient._handlePublish (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:1277:12)
21.4.2021, 21:08:40 at MqttClient._handlePacket (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:410:12)
21.4.2021, 21:08:40 at work (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:321:12)
21.4.2021, 21:08:40 at Writable.writable._write (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:335:5)
21.4.2021, 21:08:40 at doWrite (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:409:139)
21.4.2021, 21:08:40 at writeOrBuffer (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:398:5)
21.4.2021, 21:08:40 at Writable.write (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:307:11)
21.4.2021, 21:08:40 at Duplex.ondata (internal/streams/readable.js:719:22)
21.4.2021, 21:08:40 at Duplex.emit (events.js:315:20)
21.4.2021, 21:08:40 at addChunk (internal/streams/readable.js:309:12)
21.4.2021, 21:08:40 at readableAddChunk (internal/streams/readable.js:284:9)
21.4.2021, 21:08:40 at Duplex.Readable.push (internal/streams/readable.js:223:10)
21.4.2021, 21:08:40 (node:1988) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 5)
21.4.2021, 21:08:40 (node:1988) UnhandledPromiseRejectionWarning: TypeError: this.currentChannelId.includes is not a function
21.4.2021, 21:08:40 at stbDevice.updateDeviceState (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:2494:30)
21.4.2021, 21:08:40 at stbPlatform.mqttDeviceStateHandler (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:1495:34)
21.4.2021, 21:08:40 at MqttClient. (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:1440:12)
21.4.2021, 21:08:40 at MqttClient.emit (events.js:315:20)
21.4.2021, 21:08:40 at MqttClient._handlePublish (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:1277:12)
21.4.2021, 21:08:40 at MqttClient._handlePacket (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:410:12)
21.4.2021, 21:08:40 at work (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:321:12)
21.4.2021, 21:08:40 at Writable.writable._write (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:335:5)
21.4.2021, 21:08:40 at doWrite (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:409:139)
21.4.2021, 21:08:40 at writeOrBuffer (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:398:5)
21.4.2021, 21:08:40 at Writable.write (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:307:11)
21.4.2021, 21:08:40 at Duplex.ondata (internal/streams/readable.js:719:22)
21.4.2021, 21:08:40 at Duplex.emit (events.js:315:20)
21.4.2021, 21:08:40 at addChunk (internal/streams/readable.js:309:12)
21.4.2021, 21:08:40 at readableAddChunk (internal/streams/readable.js:284:9)
21.4.2021, 21:08:40 at Duplex.Readable.push (internal/streams/readable.js:223:10)
21.4.2021, 21:08:40 (node:1988) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 6)
21.4.2021, 21:08:42 (node:1988) UnhandledPromiseRejectionWarning: TypeError: this.currentChannelId.includes is not a function
21.4.2021, 21:08:42 at stbDevice.updateDeviceState (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:2494:30)
21.4.2021, 21:08:42 at stbPlatform.mqttDeviceStateHandler (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:1495:34)
21.4.2021, 21:08:42 at MqttClient. (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:1440:12)
21.4.2021, 21:08:42 at MqttClient.emit (events.js:315:20)
21.4.2021, 21:08:42 at MqttClient._handlePublish (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:1277:12)
21.4.2021, 21:08:42 at MqttClient._handlePacket (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:410:12)
21.4.2021, 21:08:42 at work (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:321:12)
21.4.2021, 21:08:42 at Writable.writable._write (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:335:5)
21.4.2021, 21:08:42 at doWrite (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:409:139)
21.4.2021, 21:08:42 at writeOrBuffer (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:398:5)
21.4.2021, 21:08:42 at Writable.write (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:307:11)
21.4.2021, 21:08:42 at Duplex.ondata (internal/streams/readable.js:719:22)
21.4.2021, 21:08:42 at Duplex.emit (events.js:315:20)
21.4.2021, 21:08:42 at addChunk (internal/streams/readable.js:309:12)
21.4.2021, 21:08:42 at readableAddChunk (internal/streams/readable.js:284:9)
21.4.2021, 21:08:42 at Duplex.Readable.push (internal/streams/readable.js:223:10)
21.4.2021, 21:08:42 (node:1988) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 7)
21.4.2021, 21:08:42 (node:1988) UnhandledPromiseRejectionWarning: TypeError: this.currentChannelId.includes is not a function
21.4.2021, 21:08:42 at stbDevice.updateDeviceState (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:2494:30)
21.4.2021, 21:08:42 at stbPlatform.mqttDeviceStateHandler (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:1495:34)
21.4.2021, 21:08:42 at MqttClient. (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:1440:12)
21.4.2021, 21:08:42 at MqttClient.emit (events.js:315:20)
21.4.2021, 21:08:42 at MqttClient._handlePublish (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:1277:12)
21.4.2021, 21:08:42 at MqttClient._handlePacket (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:410:12)
21.4.2021, 21:08:42 at work (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:321:12)
21.4.2021, 21:08:42 at Writable.writable._write (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:335:5)
21.4.2021, 21:08:42 at doWrite (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:409:139)
21.4.2021, 21:08:42 at writeOrBuffer (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:398:5)
21.4.2021, 21:08:42 at Writable.write (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:307:11)
21.4.2021, 21:08:42 at Duplex.ondata (internal/streams/readable.js:719:22)
21.4.2021, 21:08:42 at Duplex.emit (events.js:315:20)
21.4.2021, 21:08:42 at addChunk (internal/streams/readable.js:309:12)
21.4.2021, 21:08:42 at readableAddChunk (internal/streams/readable.js:284:9)
21.4.2021, 21:08:42 at Duplex.Readable.push (internal/streams/readable.js:223:10)
21.4.2021, 21:08:42 (node:1988) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 8)```
Show the Homebridge logs here, remove any sensitive information.


**Plugin Config:**

```json
Show your Homebridge config.json here, remove any sensitive information.

Screenshots:

Environment:

  • Plugin Version: 1.1.7
  • Homebridge Version: <-- hoobs -V3.3.5 -->
  • Node.js Version: <-- node -v 14.16.0-->
  • NPM Version:
  • Operating System:

Troubleshooting UK (Virgin Media)

Have updated to the latest release and get the following errors in the log:

[2/15/2021, 2:49:20 PM] [Virgin Media Box] Initializing eosstb platform... 
[2/15/2021, 2:49:20 PM] [Virgin Media Box] In eosTvPlatform
[2/15/2021, 2:49:20 PM] [Virgin Media Box] eosTvPlatform physicalDeviceId: 
[2/15/2021, 2:49:20 PM] [Virgin Media Box] In tvAccessory
[2/15/2021, 2:49:20 PM] [Virgin Media Box] tvAccessory physicalDeviceId: 
[2/15/2021, 2:49:20 PM] [Virgin Media Box] clearing inputs and services
[2/15/2021, 2:49:20 PM] [Virgin Media Box] Creating session...
[2/15/2021, 2:49:20 PM] [Virgin Media Box] Calling getSessionBE
[2/15/2021, 2:49:20 PM] [Virgin Media Box] getSessionBE
[2/15/2021, 2:49:20 PM] [Virgin Media Box] Step 1: get authentication details from https://web-api-prod-obo.horizon.tv/oesp/v4/GB/eng/web/authorization
[2/15/2021, 2:49:20 PM] [Virgin Media Box] end of getSessionBE
[2/15/2021, 2:49:20 PM] [Virgin Media Box] Session should be created now
[2/15/2021, 2:49:20 PM] [Virgin Media Box] tvAccessory after session physicalDeviceId: 
[2/15/2021, 2:49:20 PM] [Virgin Media Box] Loading inputs...
[2/15/2021, 2:49:20 PM] [Virgin Media Box] Inputs loaded
[2/15/2021, 2:49:20 PM] Initializing platform accessory 'Virgin Media Box'...
[2/15/2021, 2:49:20 PM] [Virgin Media Box] start of getServices
[2/15/2021, 2:49:20 PM] [Virgin Media Box] start of prepareInformationService, physicalDeviceId 
[2/15/2021, 2:49:20 PM] [Virgin Media Box] end of prepareInformationService, physicalDeviceId 
[2/15/2021, 2:49:20 PM] [Virgin Media Box] getServices: all services have been prepared
[2/15/2021, 2:49:21 PM] [Virgin Media Box] Step 1 got apiAuthorizationUrl response
[2/15/2021, 2:49:21 PM] [Virgin Media Box] Step 1 response.status: 200 OK
[2/15/2021, 2:49:21 PM] [Virgin Media Box] Step 2 get AUTH cookie from https://id.virginmedia.com/oidc/authorize?response_type=code&state=3d6d3c50-2d2c-4bf5-ba58-2b3c3f22b469&nonce=dd1afd6e-7f33-43ab-91df-da7bad3e4747&client_id=9b471ffe-7ff5-497b-9059-8dcb7c0d66f5&redirect_uri=https%3A%2F%2Fvirgintvgo.virginmedia.com%2Fobo_en%2Flogin_success&claims=%7B%22id_token%22%3A%7B%22ukHouseholdId%22%3Anull%7D%7D
[2/15/2021, 2:49:21 PM] [Virgin Media Box] Step 2 Could not get authorizationUri, http error: Error: Cookie not in this host's domain. Cookie:mint.dummydomain Request:id.virginmedia.com
    at CookieJar.setCookie (/usr/lib/node_modules/homebridge-eosstb/node_modules/tough-cookie/lib/cookie.js:1133:15)
    at CookieJar.setCookie (/usr/lib/node_modules/homebridge-eosstb/node_modules/universalify/index.js:5:67)
    at /usr/lib/node_modules/homebridge-eosstb/node_modules/pify/index.js:33:11
    at new Promise (<anonymous>)
    at /usr/lib/node_modules/homebridge-eosstb/node_modules/pify/index.js:6:9
    at Object.apply (/usr/lib/node_modules/homebridge-eosstb/node_modules/pify/index.js:85:19)
    at /usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/interceptors/response.js:38:35
    at Array.forEach (<anonymous>)
    at responseInterceptor (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/interceptors/response.js:37:15)
    at /usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/index.js:130:67
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

Channels not showing in HomeKit

Describe The Bug:
I will start with saying that this used to work, so not sure what happened exactly or if it came with one of the recent updates.
In essence, I noticed that the channels were not being shown in HomeKit, the list was just blank, nor was the current channel shown. So I went to investigate. I am able to control the Mediabox with the AppleTV remote widget.

Plugin Config:

"platform": "eosstb",
"name": "Mediabox",
"country": "nl",
"username": "xxxxxx",
"password": "xxxxxx"

I noticed the following in the logs though:

  • It seems to be picking a random profile instead of the shared profile
  • On every restart it says that the device was not found in the cache and is recreating it
  • No error...

Logs:

3/27/2021, 9:15:04 AM] [Mediabox] Found 1 device
[3/27/2021, 9:15:04 AM] [Mediabox] Discovery completed
[3/27/2021, 9:15:04 AM] [Mediabox] Config tip: Add these lines to your Homebridge eosstb config if you wish to customise your device config: 
"devices": [
 {
   "deviceId": "xxxxxx-xxxxxxx-xxxxxxxxxxxx",
   "deviceNameAtRestart": "Ziggo Mediabox"
 }
]
[3/27/2021, 9:15:04 AM] [Mediabox] Device 1: [Ziggo Mediabox] xxxxxx-xxxxxxx-xxxxxxxxxxxx
[3/27/2021, 9:15:04 AM] [Mediabox] Accessory not found in Homebridge cache, creating new accessory for xxxxxx-xxxxxxx-xxxxxxxxxxxx
[3/27/2021, 9:15:04 AM] [Mediabox] Setting up device 1 of 1: Ziggo Mediabox
[3/27/2021, 9:15:04 AM] [Mediabox] Ziggo Mediabox: Refreshing profile channel list...
[3/27/2021, 9:15:04 AM] [Mediabox] Ziggo Mediabox: Automatic channel list selector chose profile 1 'Dad'
[3/27/2021, 9:15:04 AM] [Mediabox] Ziggo Mediabox: Profile 'Dad' contains 0 channels
[3/27/2021, 9:15:04 AM] [Mediabox] Ziggo Mediabox: Refreshing channels 1 to 0
[3/27/2021, 9:15:04 AM] [Mediabox] Ziggo Mediabox: Hiding     channels 1 to 95
[3/27/2021, 9:15:04 AM] [Mediabox] Ziggo Mediabox: HomeKit channel list refreshed from profile 'Dad' with 0 channels
[3/27/2021, 9:15:04 AM] [Mediabox] Ziggo Mediabox: Initializing accessory...
[3/27/2021, 9:15:04 AM] [Mediabox] Ziggo Mediabox: Set Manufacturer to ARRIS [EOS]
[3/27/2021, 9:15:04 AM] [Mediabox] Ziggo Mediabox: Set Model to DCX960 []
[3/27/2021, 9:15:04 AM] [Mediabox] Ziggo Mediabox: Set Serial Number to xxxxxx-xxxxxxx-xxxxxxxxxxxx
[3/27/2021, 9:15:04 AM] [Mediabox] Ziggo Mediabox: Set Firmware to 1.0.2
[3/27/2021, 9:15:04 AM] [Mediabox] Ziggo Mediabox: Initialization completed
Preparing Advertiser for 'Ziggo Mediabox 6261' using bonjour-hap backend!
Starting to advertise 'Ziggo Mediabox 6261' using bonjour-hap backend!
[3/27/2021, 9:15:04 AM] Ziggo Mediabox 6261 is running on port 44067.
[3/27/2021, 9:15:04 AM] Please add [Ziggo Mediabox 6261] manually in Home app. Setup Code: xxx-xx-xxx
[3/27/2021, 9:15:05 AM] [Mediabox] mqttClient: Connected: true

So I updated the config as per the below to include what it was asking me to add, but despite adding this, the logs still ask me to add it to the configuration. It seems as though all the config that I added was just completely ignored, it’s also still not using the shared profile (maybe I should call it something else). In addition, I still can’t see the channels in HomeKit. The log was unchanged.

Plugin Config:

        {
            "platform": "eosstb",
            "name": "Mediabox",
            "country": "nl",
            "username": "xxxxxx",
            "password": "xxxxxx",
            "devices": [
                {
                    "deviceId": "xxxxxx-xxxxxxx-xxxxxxxxxxxx",
                    "deviceNameAtRestart": "Ziggo Mediabox",
                    "name": "Ziggo Mediabox",
                    "syncName": true,
                    "profile": "Gedeeld",
                    "accessoryCategory": "settopbox",
                    "playPauseButton": "MediaPlayPause"
                }
            ]
        },

Environment:

  • Plugin Version: 1.0.2
  • Homebridge Version: 1.3.4
  • Node.js Version: 14.16.0
  • NPM Version: 6.14.11
  • Operating System: Docker

Radio stations

Do you plan to be able to choose radio stations?
Thank you for your work!

Won’t let me change name

If I change the name of the box in the config to ‘Ziggo Next’ it won’t work if I restart HomeBridge.
I can change the name in HomeKit but after each restart of HomeBridge the name changes back to EOSSTB.
Is this a bug or is this supposed to be like this?

EOST

Describe Your Problem:

Logs:

Show the Homebridge logs here, remove any sensitive information.

Plugin Config:

Show your Homebridge config.json here, remove any sensitive information.

Screenshots:

Environment:

  • Plugin Version:
  • Homebridge Version:
  • Node.js Version:
  • NPM Version:
  • Operating System:

NL - MediaBox doesn't get any inputs, turns off in Home.app

Describe Your Problem:
eosstb receives the inputs (Send key: Power, change channel, etc) perfectly, however my MediaBox (Ziggo, nl) doesn't do anything with them.

[2/19/2021, 3:15:28 PM] [eosstb] Channel list refreshed [2/19/2021, 3:15:32 PM] [eosstb] Send key: Power [2/19/2021, 3:15:38 PM] [eosstb] Send key: Power [2/19/2021, 3:15:41 PM] [eosstb] Send key: Power [2/19/2021, 3:15:46 PM] [eosstb] Channel list refreshed [2/19/2021, 3:16:16 PM] [eosstb] Channel list refreshed [2/19/2021, 3:16:46 PM] [eosstb] Channel list refreshed [2/19/2021, 3:17:16 PM] [eosstb] Channel list refreshed [2/19/2021, 3:17:46 PM] [eosstb] Channel list refreshed [2/19/2021, 3:18:16 PM] [eosstb] Channel list refreshed [2/19/2021, 3:18:46 PM] [eosstb] Channel list refreshed

Plugin Config:

            "platform": "eosstb",
            "devices": [
                {
                    "name": "MediaBox",
                    "country": "nl",
                    "username": "[email protected]",
                    "password": "password",
                    "maxChannels": 25
                }```

Shows up everywhere, but can’t add it

Tried it again, now the logs are correct, the box shows up under accessories in HomeBridge, but I can’t add it to HomeKit.
I’ve tried reinstalling the plugin, reboot, restarted. Nothing works.

3650E676-44ED-4A6B-A88E-DBAD2C88FA5C
5E763FA2-6483-4B65-BC68-11895E60C60B

Persist edited channel names to file

Is your feature request related to a problem? Please describe:

Currently, any user-defined channel names do not get saved to disc
They are lost between Homebridge restarts

A user-defined channel name is one edited directly in the home app

Describe the solution you'd like:

Any channel names edited by the user in the home app must be persisted and remembered between Homebridge restarts

Volume control

I have some problems trying to make the Volume control work.

The plugin settings I use:
"volUpCommand": "http://192.168.1.20:5005/XXXX/volume/+2",
"volDownCommand": "http://192.168.1.20:5005/XXXX/volume/-2",

The http command uses the sonos-http-api and does work from all computers when started from a browser or from the command prompt ("start http://192.168.1.20:5005/XXXX/volume/-2")

The errors I get, when I use the Volume up/down on the iPhone:
[ZiggoTV] Ziggo Mediabox: Volume commands not configured

Any idea's what could cause this error?

cant intergrate with homekit

Describe Your Problem:
I have set up the plugin and from homebridge it works, i can turn it on or of. but when i wanted to add in homekit i cant see the settop box. yesterday I succeeded but because I didn't get it in home assistant I removed the accessoire and can't get it back now.
Logs:

Environment:

  • Plugin Version: homebridge-eosstb v1.0.2
  • Homebridge Version: v1.3.4
  • Node.js Version: 14:16
  • Operating System: Raspbian 3b+

Cant install plugin

I tried to install the plugin but cant find it via homebridge ui x.
I then tried to install via SSH but i get the following error.

npm ERR! code E404
npm ERR! 404 Not Found - GET https://registry.npmjs.org/homebridge-eosstb - Not found
npm ERR! 404
npm ERR! 404 'homebridge-eosstb@latest' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.

npm ERR! A complete log of this run can be found in:
npm ERR! /home/pi/.npm/_logs/2021-02-16T09_38_25_823Z-debug.log

install problem

I cannot install eosstb.


C:\WINDOWS\system32>npm install -g https://github.com/jsiegenthaler/eosstb/
npm ERR! code ENOENT
npm ERR! syscall spawn git
npm ERR! path git
npm ERR! errno -4058
npm ERR! enoent Error while executing:
npm ERR! enoent undefined ls-remote -h -t https://github.com/jsiegenthaler/eosstb.git
npm ERR! enoent
npm ERR! enoent
npm ERR! enoent spawn git ENOENT
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent

npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\XXXXX\AppData\Roaming\npm-cache_logs\2021-01-08T23_02_09_292Z-debug.log)

Same error when I use
npm install -g homebridge-eosstb

Is this something that I can fix?

Fastest starting up option required?

Is it correct that the mediabox should be set to the fastest starting up option? I had this set to eco and also the middle option did not work.
Maybe you could add this to the readme?

Google Home Smart

Until version 1.1.l the box was showing in Google Home in combination with the GSH plugin.
It’s only the on and off state, but it was working well for me.
1.1.2 deletes it from Google.

Issue with GB Virgin Media boxes

Describe Your Problem:
I have two boxes, and they appear to be not working as expected. See below; I may have configured something incorrectly.

Logs:

 [Living Room TiVo] Step 1 of 7 response: 200 OK
[22/03/2021, 09:20:50] [Living Room TiVo] Step 2 of 7 get AUTH cookie
[22/03/2021, 09:20:50] [Living Room TiVo] Step 2 of 7 response: 200 OK
[22/03/2021, 09:20:50] [Living Room TiVo] Step 3 of 7 logging in with username [email protected]
[22/03/2021, 09:20:50] [Living Room TiVo] Step 3 of 7 response: 200 OK
[22/03/2021, 09:20:50] [Living Room TiVo] Step 4 of 7 follow redirect url
[22/03/2021, 09:20:51] [Living Room TiVo] Step 4 of 7 response: 302 Found
[22/03/2021, 09:20:51] [Living Room TiVo] Step 5 of 7 extract authorizationCode
[22/03/2021, 09:20:51] [Living Room TiVo] Step 5 of 7 authorizationCode OK
[22/03/2021, 09:20:51] [Living Room TiVo] Step 6 of 7 post auth data with valid code
[22/03/2021, 09:20:51] [Living Room TiVo] Step 6 of 7 response: 200 OK
[22/03/2021, 09:20:51] [Living Room TiVo] Step 7 of 7 post refreshToken request
[22/03/2021, 09:20:52] [Living Room TiVo] Step 7 of 7 response: 200 OK
[22/03/2021, 09:20:52] [Living Room TiVo] Session created
[22/03/2021, 09:21:00] [Living Room TiVo] Discovery started
[22/03/2021, 09:21:00] [Living Room TiVo] Found customer data: XXXXXXXXX CHRIS 
[22/03/2021, 09:21:00] [Living Room TiVo] getPersonalizationData: error: Error: Request failed with status code 404
    at createError (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios/lib/core/settle.js:17:12)
    at /usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/interceptors/response.js:83:25
    at new Promise (<anonymous>)
    at responseInterceptor (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/interceptors/response.js:82:9)
    at /usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/index.js:130:67
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  config: {
    url: 'https://prod.spark.virginmedia.com/eng/web/personalization-service/v1/customer/125576637_gb/devices',
    method: 'get',
    headers: {
      Accept: 'application/json, text/plain, */*',
      'x-cus': '125576637_gb',
      'x-oesp-token': 'eyJ0eXAiOiJKV1QiLCJraWQiOiJvZXNwX3Rva2VuX3Byb2RfMjAyMDA4MTkiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjU1NzY2MzdfZ2IiLCJpc3MiOiJ3ZWItYXBpLXByb2Qtb2JvLmhvcml6b24udHYiLCJleHAiOjE2MTY0MTIwNTIsImlhdCI6MTYxNjQwNDg1Miwic2lkIjoiNmY4ZTMzNDcyYWNiMTVkMGM5ZDY4YjQ4Y2UxNmQ3OTdkMjllOTJjYWY3ZTI4YTdkYzg2NjRiMDhlYWZiODI2ZCJ9.NwKwsXLwWLRNnKSVcLbkiVkX75DO_6tYbJFQbfYiJAo',
      'x-oesp-username': '125576637',
      'User-Agent': 'axios/0.21.1'
    },
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    withCredentials: true,
    adapter: [Function: httpAdapter],
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    jar: undefined,
    maxRedirects: 0,
    data: undefined,
    validateStatus: [Function: validateStatus]
  },
  request: <ref *1> ClientRequest {
    _events: [Object: null prototype] {
      error: [Function: handleRequestError],
      prefinish: [Function: requestOnPrefinish]
    },
    _eventsCount: 2,
    _maxListeners: undefined,
    outputData: [],
    outputSize: 0,
    writable: true,
    destroyed: false,
    _last: true,
    chunkedEncoding: false,
    shouldKeepAlive: false,
    _defaultKeepAlive: true,
    useChunkedEncodingByDefault: false,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    _contentLength: 0,
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    socket: TLSSocket {
      _tlsOptions: [Object],
      _secureEstablished: true,
      _securePending: false,
      _newSessionPending: false,
      _controlReleased: true,
      secureConnecting: false,
      _SNICallback: null,
      servername: 'prod.spark.virginmedia.com',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 10,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'prod.spark.virginmedia.com',
      _readableState: [ReadableState],
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: false,
      _sockname: null,
      _pendingData: null,
      _pendingEncoding: '',
      server: undefined,
      _server: null,
      ssl: [TLSWrap],
      _requestCert: true,
      _rejectUnauthorized: true,
      parser: null,
      _httpMessage: [Circular *1],
      [Symbol(res)]: [TLSWrap],
      [Symbol(verified)]: true,
      [Symbol(pendingSession)]: null,
      [Symbol(async_id_symbol)]: 1272,
      [Symbol(kHandle)]: [TLSWrap],
      [Symbol(kSetNoDelay)]: false,
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: null,
      [Symbol(kBuffer)]: null,
      [Symbol(kBufferCb)]: null,
      [Symbol(kBufferGen)]: null,
      [Symbol(kCapture)]: false,
      [Symbol(kBytesRead)]: 0,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(connect-options)]: [Object],
      [Symbol(RequestTimeout)]: undefined
    },
    _header: 'GET /eng/web/personalization-service/v1/customer/125576637_gb/devices HTTP/1.1\r\n' +
      'Accept: application/json, text/plain, */*\r\n' +
      'x-cus: 125576637_gb\r\n' +
      'x-oesp-token: eyJ0eXAiOiJKV1QiLCJraWQiOiJvZXNwX3Rva2VuX3Byb2RfMjAyMDA4MTkiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjU1NzY2MzdfZ2IiLCJpc3MiOiJ3ZWItYXBpLXByb2Qtb2JvLmhvcml6b24udHYiLCJleHAiOjE2MTY0MTIwNTIsImlhdCI6MTYxNjQwNDg1Miwic2lkIjoiNmY4ZTMzNDcyYWNiMTVkMGM5ZDY4YjQ4Y2UxNmQ3OTdkMjllOTJjYWY3ZTI4YTdkYzg2NjRiMDhlYWZiODI2ZCJ9.NwKwsXLwWLRNnKSVcLbkiVkX75DO_6tYbJFQbfYiJAo\r\n' +
      'x-oesp-username: 125576637\r\n' +
      'User-Agent: axios/0.21.1\r\n' +
      'Host: prod.spark.virginmedia.com\r\n' +
      'Connection: close\r\n' +
      '\r\n',
    _keepAliveTimeout: 0,
    _onPendingData: [Function: noopPendingOutput],
    agent: Agent {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object],
      requests: {},
      sockets: [Object],
      freeSockets: {},
      keepAliveMsecs: 1000,
      keepAlive: false,
      maxSockets: Infinity,
      maxFreeSockets: 256,
      scheduling: 'fifo',
      maxTotalSockets: Infinity,
      totalSocketCount: 3,
      maxCachedSessions: 100,
      _sessionCache: [Object],
      [Symbol(kCapture)]: false
    },
    socketPath: undefined,
    method: 'GET',
    maxHeaderSize: undefined,
    insecureHTTPParser: undefined,
    path: '/eng/web/personalization-service/v1/customer/125576637_gb/devices',
    _ended: true,
    res: IncomingMessage {
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 3,
      _maxListeners: undefined,
      socket: [TLSSocket],
      httpVersionMajor: 1,
      httpVersionMinor: 1,
      httpVersion: '1.1',
      complete: true,
      headers: [Object],
      rawHeaders: [Array],
      trailers: {},
      rawTrailers: [],
      aborted: false,
      upgrade: false,
      url: '',
      method: null,
      statusCode: 404,
      statusMessage: 'Not Found',
      client: [TLSSocket],
      _consuming: false,
      _dumped: false,
      req: [Circular *1],
      [Symbol(kCapture)]: false,
      [Symbol(RequestTimeout)]: undefined
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    reusedSocket: false,
    host: 'prod.spark.virginmedia.com',
    protocol: 'https:',
    [Symbol(kCapture)]: false,
    [Symbol(kNeedDrain)]: false,
    [Symbol(corked)]: 0,
    [Symbol(kOutHeaders)]: [Object: null prototype] {
      accept: [Array],
      'x-cus': [Array],
      'x-oesp-token': [Array],
      'x-oesp-username': [Array],
      'user-agent': [Array],
      host: [Array]
    }
  },
  response: {
    status: 404,
    statusText: 'Not Found',
    headers: {
      'content-type': 'application/json',
      'content-length': '236',
      'x-request-id': 'b2d7b508e2ffde9989e88133f1921954',
      'access-control-allow-credentials': 'true',
      'access-control-allow-methods': 'GET, POST,PUT, OPTIONS, DELETE, HEAD, PATCH',
      'access-control-allow-headers': 'Accept-Charset, Accept-Encoding, Access-Control-Request-Headers, Access-Control-Request-Method, Authorization, Cache-Control, Connection, Content-Encoding, Content-Type, Content-Length, DNT, Date, Host, If-Modified-Since, Keep-Alive, Origin, Referer, Server, TokenIssueTime, Transfer-Encoding, User-Agent, Vary, X-CustomHeader, X-Requested-With, password, username, x-request-id, x-ratelimit-app, x-auth-id, x-auth-key, x-guest-token, X-HTTP-Method-Override, x-oesp-username, x-oesp-token, x-cus, x-dev, X-Client-Id, X-Device-Code, X-Language-Code, UserRole, x-session-id, x-entitlements-token, x-go-dev, x-profile, x-api-key, nv-authorizations, X-Viewer-Id',
      'x-edgeconnect-midmile-rtt': '8',
      'x-edgeconnect-origin-mex-latency': '12',
      date: 'Mon, 22 Mar 2021 09:21:00 GMT',
      connection: 'close',
      'access-control-allow-origin': 'https://www.horizon.tv'
    },
    config: {
      url: 'https://prod.spark.virginmedia.com/eng/web/personalization-service/v1/customer/125576637_gb/devices',
      method: 'get',
      headers: [Object],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      withCredentials: true,
      adapter: [Function: httpAdapter],
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      jar: undefined,
      maxRedirects: 0,
      data: undefined,
      validateStatus: [Function: validateStatus]
    },
    request: <ref *1> ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: false,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: false,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      _contentLength: 0,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      socket: [TLSSocket],
      _header: 'GET /eng/web/personalization-service/v1/customer/125576637_gb/devices HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        'x-cus: 125576637_gb\r\n' +
        'x-oesp-token: eyJ0eXAiOiJKV1QiLCJraWQiOiJvZXNwX3Rva2VuX3Byb2RfMjAyMDA4MTkiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjU1NzY2MzdfZ2IiLCJpc3MiOiJ3ZWItYXBpLXByb2Qtb2JvLmhvcml6b24udHYiLCJleHAiOjE2MTY0MTIwNTIsImlhdCI6MTYxNjQwNDg1Miwic2lkIjoiNmY4ZTMzNDcyYWNiMTVkMGM5ZDY4YjQ4Y2UxNmQ3OTdkMjllOTJjYWY3ZTI4YTdkYzg2NjRiMDhlYWZiODI2ZCJ9.NwKwsXLwWLRNnKSVcLbkiVkX75DO_6tYbJFQbfYiJAo\r\n' +
        'x-oesp-username: 125576637\r\n' +
        'User-Agent: axios/0.21.1\r\n' +
        'Host: prod.spark.virginmedia.com\r\n' +
        'Connection: close\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: noopPendingOutput],
      agent: [Agent],
      socketPath: undefined,
      method: 'GET',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      path: '/eng/web/personalization-service/v1/customer/125576637_gb/devices',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'prod.spark.virginmedia.com',
      protocol: 'https:',
      [Symbol(kCapture)]: false,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kOutHeaders)]: [Object: null prototype]
    },
    data: { error: [Object] }
  },
  isAxiosError: true,
  toJSON: [Function: toJSON]
}
[22/03/2021, 09:21:00] [Living Room TiVo] getPersonalizationData: error: Error: Request failed with status code 404
    at createError (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios/lib/core/settle.js:17:12)
    at /usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/interceptors/response.js:83:25
    at new Promise (<anonymous>)
    at responseInterceptor (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/interceptors/response.js:82:9)
    at /usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/index.js:130:67
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  config: {
    url: 'https://prod.spark.virginmedia.com/eng/web/personalization-service/v1/customer/125576637_gb/profiles',
    method: 'get',
    headers: {
      Accept: 'application/json, text/plain, */*',
      'x-cus': '125576637_gb',
      'x-oesp-token': 'eyJ0eXAiOiJKV1QiLCJraWQiOiJvZXNwX3Rva2VuX3Byb2RfMjAyMDA4MTkiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjU1NzY2MzdfZ2IiLCJpc3MiOiJ3ZWItYXBpLXByb2Qtb2JvLmhvcml6b24udHYiLCJleHAiOjE2MTY0MTIwNTIsImlhdCI6MTYxNjQwNDg1Miwic2lkIjoiNmY4ZTMzNDcyYWNiMTVkMGM5ZDY4YjQ4Y2UxNmQ3OTdkMjllOTJjYWY3ZTI4YTdkYzg2NjRiMDhlYWZiODI2ZCJ9.NwKwsXLwWLRNnKSVcLbkiVkX75DO_6tYbJFQbfYiJAo',
      'x-oesp-username': '125576637',
      'User-Agent': 'axios/0.21.1'
    },
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    withCredentials: true,
    adapter: [Function: httpAdapter],
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    jar: undefined,
    maxRedirects: 0,
    data: undefined,
    validateStatus: [Function: validateStatus]
  },
  request: <ref *1> ClientRequest {
    _events: [Object: null prototype] {
      error: [Function: handleRequestError],
      prefinish: [Function: requestOnPrefinish]
    },
    _eventsCount: 2,
    _maxListeners: undefined,
    outputData: [],
    outputSize: 0,
    writable: true,
    destroyed: false,
    _last: true,
    chunkedEncoding: false,
    shouldKeepAlive: false,
    _defaultKeepAlive: true,
    useChunkedEncodingByDefault: false,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    _contentLength: 0,
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    socket: TLSSocket {
      _tlsOptions: [Object],
      _secureEstablished: true,
      _securePending: false,
      _newSessionPending: false,
      _controlReleased: true,
      secureConnecting: false,
      _SNICallback: null,
      servername: 'prod.spark.virginmedia.com',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 10,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'prod.spark.virginmedia.com',
      _readableState: [ReadableState],
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: false,
      _sockname: null,
      _pendingData: null,
      _pendingEncoding: '',
      server: undefined,
      _server: null,
      ssl: [TLSWrap],
      _requestCert: true,
      _rejectUnauthorized: true,
      parser: null,
      _httpMessage: [Circular *1],
      [Symbol(res)]: [TLSWrap],
      [Symbol(verified)]: true,
      [Symbol(pendingSession)]: null,
      [Symbol(async_id_symbol)]: 1267,
      [Symbol(kHandle)]: [TLSWrap],
      [Symbol(kSetNoDelay)]: false,
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: null,
      [Symbol(kBuffer)]: null,
      [Symbol(kBufferCb)]: null,
      [Symbol(kBufferGen)]: null,
      [Symbol(kCapture)]: false,
      [Symbol(kBytesRead)]: 0,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(connect-options)]: [Object],
      [Symbol(RequestTimeout)]: undefined
    },
    _header: 'GET /eng/web/personalization-service/v1/customer/125576637_gb/profiles HTTP/1.1\r\n' +
      'Accept: application/json, text/plain, */*\r\n' +
      'x-cus: 125576637_gb\r\n' +
      'x-oesp-token: eyJ0eXAiOiJKV1QiLCJraWQiOiJvZXNwX3Rva2VuX3Byb2RfMjAyMDA4MTkiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjU1NzY2MzdfZ2IiLCJpc3MiOiJ3ZWItYXBpLXByb2Qtb2JvLmhvcml6b24udHYiLCJleHAiOjE2MTY0MTIwNTIsImlhdCI6MTYxNjQwNDg1Miwic2lkIjoiNmY4ZTMzNDcyYWNiMTVkMGM5ZDY4YjQ4Y2UxNmQ3OTdkMjllOTJjYWY3ZTI4YTdkYzg2NjRiMDhlYWZiODI2ZCJ9.NwKwsXLwWLRNnKSVcLbkiVkX75DO_6tYbJFQbfYiJAo\r\n' +
      'x-oesp-username: 125576637\r\n' +
      'User-Agent: axios/0.21.1\r\n' +
      'Host: prod.spark.virginmedia.com\r\n' +
      'Connection: close\r\n' +
      '\r\n',
    _keepAliveTimeout: 0,
    _onPendingData: [Function: noopPendingOutput],
    agent: Agent {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object],
      requests: {},
      sockets: [Object],
      freeSockets: {},
      keepAliveMsecs: 1000,
      keepAlive: false,
      maxSockets: Infinity,
      maxFreeSockets: 256,
      scheduling: 'fifo',
      maxTotalSockets: Infinity,
      totalSocketCount: 2,
      maxCachedSessions: 100,
      _sessionCache: [Object],
      [Symbol(kCapture)]: false
    },
    socketPath: undefined,
    method: 'GET',
    maxHeaderSize: undefined,
    insecureHTTPParser: undefined,
    path: '/eng/web/personalization-service/v1/customer/125576637_gb/profiles',
    _ended: true,
    res: IncomingMessage {
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 3,
      _maxListeners: undefined,
      socket: [TLSSocket],
      httpVersionMajor: 1,
      httpVersionMinor: 1,
      httpVersion: '1.1',
      complete: true,
      headers: [Object],
      rawHeaders: [Array],
      trailers: {},
      rawTrailers: [],
      aborted: false,
      upgrade: false,
      url: '',
      method: null,
      statusCode: 404,
      statusMessage: 'Not Found',
      client: [TLSSocket],
      _consuming: false,
      _dumped: false,
      req: [Circular *1],
      [Symbol(kCapture)]: false,
      [Symbol(RequestTimeout)]: undefined
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    reusedSocket: false,
    host: 'prod.spark.virginmedia.com',
    protocol: 'https:',
    [Symbol(kCapture)]: false,
    [Symbol(kNeedDrain)]: false,
    [Symbol(corked)]: 0,
    [Symbol(kOutHeaders)]: [Object: null prototype] {
      accept: [Array],
      'x-cus': [Array],
      'x-oesp-token': [Array],
      'x-oesp-username': [Array],
      'user-agent': [Array],
      host: [Array]
    }
  },
  response: {
    status: 404,
    statusText: 'Not Found',
    headers: {
      'content-type': 'application/json',
      'content-length': '236',
      'x-request-id': 'e9a9250b128d013eff7a1dc02efccd3f',
      'access-control-allow-credentials': 'true',
      'access-control-allow-methods': 'GET, POST,PUT, OPTIONS, DELETE, HEAD, PATCH',
      'access-control-allow-headers': 'Accept-Charset, Accept-Encoding, Access-Control-Request-Headers, Access-Control-Request-Method, Authorization, Cache-Control, Connection, Content-Encoding, Content-Type, Content-Length, DNT, Date, Host, If-Modified-Since, Keep-Alive, Origin, Referer, Server, TokenIssueTime, Transfer-Encoding, User-Agent, Vary, X-CustomHeader, X-Requested-With, password, username, x-request-id, x-ratelimit-app, x-auth-id, x-auth-key, x-guest-token, X-HTTP-Method-Override, x-oesp-username, x-oesp-token, x-cus, x-dev, X-Client-Id, X-Device-Code, X-Language-Code, UserRole, x-session-id, x-entitlements-token, x-go-dev, x-profile, x-api-key, nv-authorizations, X-Viewer-Id',
      'x-edgeconnect-midmile-rtt': '3',
      'x-edgeconnect-origin-mex-latency': '12',
      date: 'Mon, 22 Mar 2021 09:21:00 GMT',
      connection: 'close',
      'access-control-allow-origin': 'https://www.horizon.tv'
    },
    config: {
      url: 'https://prod.spark.virginmedia.com/eng/web/personalization-service/v1/customer/125576637_gb/profiles',
      method: 'get',
      headers: [Object],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      withCredentials: true,
      adapter: [Function: httpAdapter],
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      jar: undefined,
      maxRedirects: 0,
      data: undefined,
      validateStatus: [Function: validateStatus]
    },
    request: <ref *1> ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: false,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: false,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      _contentLength: 0,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      socket: [TLSSocket],
      _header: 'GET /eng/web/personalization-service/v1/customer/125576637_gb/profiles HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        'x-cus: 125576637_gb\r\n' +
        'x-oesp-token: eyJ0eXAiOiJKV1QiLCJraWQiOiJvZXNwX3Rva2VuX3Byb2RfMjAyMDA4MTkiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjU1NzY2MzdfZ2IiLCJpc3MiOiJ3ZWItYXBpLXByb2Qtb2JvLmhvcml6b24udHYiLCJleHAiOjE2MTY0MTIwNTIsImlhdCI6MTYxNjQwNDg1Miwic2lkIjoiNmY4ZTMzNDcyYWNiMTVkMGM5ZDY4YjQ4Y2UxNmQ3OTdkMjllOTJjYWY3ZTI4YTdkYzg2NjRiMDhlYWZiODI2ZCJ9.NwKwsXLwWLRNnKSVcLbkiVkX75DO_6tYbJFQbfYiJAo\r\n' +
        'x-oesp-username: 125576637\r\n' +
        'User-Agent: axios/0.21.1\r\n' +
        'Host: prod.spark.virginmedia.com\r\n' +
        'Connection: close\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: noopPendingOutput],
      agent: [Agent],
      socketPath: undefined,
      method: 'GET',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      path: '/eng/web/personalization-service/v1/customer/125576637_gb/profiles',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'prod.spark.virginmedia.com',
      protocol: 'https:',
      [Symbol(kCapture)]: false,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kOutHeaders)]: [Object: null prototype]
    },
    data: { error: [Object] }
  },
  isAxiosError: true,
  toJSON: [Function: toJSON]
}
(node:44181) UnhandledPromiseRejectionWarning: TypeError: Cannot read property '0' of undefined
    at /usr/lib/node_modules/homebridge-eosstb/index.js:257:24
(Use `node --trace-warnings ...` to show where the warning was created)
(node:44181) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 5)
(node:44181) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Plugin Config:

{
    "platform": "eosstb",
    "name": "Living Room TiVo",
    "country": "gb",
    "username": "[email protected]",
    "password": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "devices": [
        {
            "deviceId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "deviceNameAtRestart": "Living Room TV",
            "accessoryCategory": "settopbox",
            "playPauseButton": "MediaPlayPause",
            "showChannelNumbers": false,
            "maxChannels": 50,
            "channelNames": [
                {
                    "channelId": "1755",
                    "channelName": "Netflix"
                }
            ]
        }
    ]
}

Environment:

  • Plugin Version:
  • Homebridge Version: v1.3.4
  • Node.js Version: v14.16.0
  • NPM Version: v6.14.11
  • Operating System: CentOS Stream v8

Selection of profile

Describe Your Problem:

I have no profile set in the device config.

In log I see that no valid profile is found and best fitting is selected.

I had some shortcuts programmed that were suddenly not working.

Observed that for some reason the profile selection seems to have changed from the Shared profile to my personal Profile.

Logs:

Show the Homebridge logs here, remove any sensitive information.

Plugin Config:

Show your Homebridge config.json here, remove any sensitive information.

Screenshots:

Environment:

  • Plugin Version:
    V1.1.4
  • Homebridge Version:
  • Node.js Version:
  • NPM Version:
  • Operating System:

Add "Last TV channel" option to channel list

Is your feature request related to a problem? Please describe:

Some users would like to have a capability to return to the last used TV channel, similar to the [TV] button on the physical remote.

Describe the solution you'd like:

A dummy TV channel named "Last TV channel" or similar. Selecting the channel triggers the [TV] button press and the set-top box returns to the last used TV channel.
The dummy channel should be optional (controlled via config) and default disabled
A user can choose to use it.
If enabled, it would appear as the first available channel in the channel list. Thus channel list preparation and sorting would be affected.

Additional context:

The TV button key event is "TV"

EOSSTB in HOOBS

Describe Your Problem:
<I am installing the EOSSTB plugin in HOOBS.
The logs show both my (ZIGGO) media next boxes are visible and also indicates how to configure them in Apple Homekit.
I am using HOOBS to link supported plugins to Google home instead (using the GSH plugin on HOOBS), such as NetAtmo that out of the box only supports Apple Homekit.
I want to do the same with the EOSSTB plugin.
I am not sure if this is ever tried and is possible. What I find interesting is the EOSSTB, once installed at my HOOBS does not show up as an accessory. Maybe that is what it should be, i do not know.
Can you advise or enlighten me?

Logs:

2/07/2021, 23:33:04 [EOSSTB] Finding devices in cache...
02/07/2021, 23:33:04 [EOSSTB] Device 1: Mediabox 1 3C36E4-EOSSTB-00378879XXXX
02/07/2021, 23:33:04 [EOSSTB] Device not found in cache, creating new accessory for 3C36E4-EOSSTB-00378879XXXX
02/07/2021, 23:33:04 [EOSSTB] Setting up device 1 of 2: Mediabox 1
02/07/2021, 23:33:04 [EOSSTB] ZIGGO: Refreshing channel list...
02/07/2021, 23:33:04 [EOSSTB] ZIGGO: No valid profile found in config. Selecting best-fitting profile
02/07/2021, 23:33:04 [EOSSTB] ZIGGO: Using profile 0 'Shared Profile'
02/07/2021, 23:33:04 [EOSSTB] ZIGGO: Profile 'Shared Profile' contains 131 channels
02/07/2021, 23:33:04 [EOSSTB] ZIGGO: Refreshing channels 1 to 95
02/07/2021, 23:33:04 [EOSSTB] ZIGGO: Channel list refreshed from profile 'Shared Profile' with 95 channels
02/07/2021, 23:33:04 [EOSSTB] Device 2: Mediabox 2 3C36E4-EOSSTB-00377679YYYY
02/07/2021, 23:33:04 [EOSSTB] Device not found in cache, creating new accessory for 3C36E4-EOSSTB-00377679YYYY
02/07/2021, 23:33:04 [EOSSTB] Setting up device 2 of 2: Mediabox 2
02/07/2021, 23:33:04 [EOSSTB] Mediabox 2: Refreshing channel list...
02/07/2021, 23:33:04 [EOSSTB] Mediabox 2: No valid profile found in config. Selecting best-fitting profile
02/07/2021, 23:33:04 [EOSSTB] Mediabox 2: Using profile 0 'Shared Profile'
02/07/2021, 23:33:04 [EOSSTB] Mediabox 2: Profile 'Shared Profile' contains 131 channels
02/07/2021, 23:33:04 [EOSSTB] Mediabox 2: Refreshing channels 1 to 95
02/07/2021, 23:33:04 [EOSSTB] Mediabox 2: Channel list refreshed from profile 'Shared Profile' with 95 channels
02/07/2021, 23:33:07 [EOSSTB] ZIGGO: Initializing accessory...
02/07/2021, 23:33:07 [EOSSTB] ZIGGO: Set Manufacturer to ARRIS [EOS]
02/07/2021, 23:33:07 [EOSSTB] ZIGGO: Set Model to DCX960 []
02/07/2021, 23:33:07 [EOSSTB] ZIGGO: Set Serial Number to 3C36E4-EOSSTB-00378879XXXX
02/07/2021, 23:33:07 [EOSSTB] ZIGGO: Set Firmware to 1.1.11
02/07/2021, 23:33:08 [EOSSTB] ZIGGO: Initialization completed
02/07/2021, 23:33:09 Preparing Advertiser for 'ZIGGO 7426' using bonjour-hap backend!
02/07/2021, 23:33:09 Starting to advertise 'ZIGGO 7426' using bonjour-hap backend!
02/07/2021, 23:33:09 ZIGGO 7426 is running on port 39631.
02/07/2021, 23:33:09 Please add [ZIGGO 7426] manually in Home app. Setup Code: 031-45-154
02/07/2021, 23:33:09 [EOSSTB] Mediabox 2: Initializing accessory...
02/07/2021, 23:33:09 [EOSSTB] Mediabox 2: Set Manufacturer to ARRIS [EOS]
02/07/2021, 23:33:09 [EOSSTB] Mediabox 2: Set Model to DCX960 []
02/07/2021, 23:33:09 [EOSSTB] Mediabox 2: Set Serial Number to 3C36E4-EOSSTB-00377679YYYY
02/07/2021, 23:33:09 [EOSSTB] Mediabox 2: Set Firmware to 1.1.11
02/07/2021, 23:33:09 [EOSSTB] Mediabox 2: Initialization completed
02/07/2021, 23:33:10 Preparing Advertiser for 'Mediabox 2 734B' using bonjour-hap backend!
02/07/2021, 23:33:10 Starting to advertise 'Mediabox 2 734B' using bonjour-hap backend!
02/07/2021, 23:33:10 Mediabox 2 734B is running on port 38913.
02/07/2021, 23:33:10 Please add [Mediabox 2 734B] manually in Home app. Setup Code: 031-45-154
02/07/2021, 23:33:12 [Google Smart Home] Sending Sync Request
02/07/2021, 23:33:13 [Google Smart Home] Received SYNC intent
02/07/2021, 23:33:13 [EOSSTB] mqttClient: Connected: true
02/07/2021, 23:33:13 [EOSSTB] Refreshing recording state
02/07/2021, 23:33:13 [EOSSTB] Mediabox 2: Closed Captions state changed from 0 [DISABLED] to 1 [ENABLED]
02/07/2021, 23:33:13 [EOSSTB] ZIGGO: Closed Captions state changed from 0 [DISABLED] to 1 [ENABLED]

Plugin Config:

Show your Homebridge config.json here, remove any sensitive information.

Screenshots:

Environment:

  • Plugin Version:
  • Homebridge Version:
  • Node.js Version:
  • NPM Version:
  • Operating System:

Persist visibility state to disc

Is your feature request related to a problem? Please describe:

Currently, a user can edit the visibility state of a channel in the channel list.
This is very useful.
However, the visibility state is not saved to disc, and is lost between Homebridge restarts

Describe the solution you'd like:

Save the visibility state to disc between Homebridge restarts so that the user config is never lost

Example Siri command to switch to specific Mediabox channel

Describe Your Problem:

Don't know how to instruct Siri to switch to specific Mediabox channel

Logs:

Show the Homebridge logs here, remove any sensitive information.

Plugin Config:

Show your Homebridge config.json here, remove any sensitive information.

Screenshots:

Environment:

  • Plugin Version:
  • Homebridge Version:
  • Node.js Version:
  • NPM Version:
  • Operating System:

Plugin not loading after update 1.0.0.

After updating the plugin to v1.0.0 the plugin doesn't load anymore with the error,
"[eosstb] homebridge-eosstb config incomplete: "country" missing. Initialization aborted."

Going back to v0.1.13 and everything is working great again.

this is my config:

{
            "platform": "eosstb",
            "devices": [
                {
                    "name": "Ziggo Next",
                    "country": "nl",
                    "username": “XXXXXXXX”,
                    "password": “XXXXXXXX”
                }
            ]
        }
    ],

Thanks and keep up this great job!!

Auto-profile selector confuses some users

Describe The Bug:
The auto-profile selector confuses some users who use minimum config

To Reproduce:

  1. Create a scenario with multiple profiles, eg Child, Dad, Mum
  2. Ensure each profile has <95 channels
  3. Configure EOSSTB with minimum config
  4. Assume role of Mum
  5. Restart Homebridge
  6. Observe how the auto-profile selector takes the first found profile and uses it
  7. Observe that you have no control over the selected profile, and the selected profile is not what you want

Expected behavior:
Users that use the plugin with the absolute minimum config expect to be using the Shared Profile
If a user wants to use any other profile, then he will configure it himself.

Proposed solution:
Disable the auto-profile selector or make disabling configurable

Environment:

  • Plugin Version:
    homebridge-eosstb v1.1.0 and later

Update available while on latest release

Homebridge is showing an update is available for eosstb plug-in. However I am running the latest release (1.1.9).
When clicking on update the release notes of 1.1.9 are shown, but it will update to the latest beta. I assume this is not correct?

Device not found in cache.

Describe Your Problem:

Message in log device not found in cache.

Can I change config to make use of cache?

Logs:

Show the Homebridge logs here, remove any sensitive information.

Plugin Config:

Show your Homebridge config.json here, remove any sensitive information.

Screenshots:

Environment:

  • Plugin Version:
  • Homebridge Version:
  • Node.js Version:
  • NPM Version:
  • Operating System:

Error Messages

Describe The Bug:
After the update to version 1.1.9, error messages appeared in the log again

To Reproduce:

Expected behavior:

Logs:
26.4.2021, 18:15:15 (node:628) UnhandledPromiseRejectionWarning: TypeError: (this.currentChannelId || {}).includes is not a function
26.4.2021, 18:15:15 at stbDevice.updateDeviceState (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:2494:38)
26.4.2021, 18:15:15 at stbPlatform.mqttDeviceStateHandler (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:1495:34)
26.4.2021, 18:15:15 at MqttClient. (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:1440:12)
26.4.2021, 18:15:15 at MqttClient.emit (events.js:315:20)
26.4.2021, 18:15:15 at MqttClient._handlePublish (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:1277:12)
26.4.2021, 18:15:15 at MqttClient._handlePacket (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:410:12)
26.4.2021, 18:15:15 at work (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:321:12)
26.4.2021, 18:15:15 at Writable.writable._write (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:335:5)
26.4.2021, 18:15:15 at doWrite (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:409:139)
26.4.2021, 18:15:15 at writeOrBuffer (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:398:5)
26.4.2021, 18:15:15 at Writable.write (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:307:11)
26.4.2021, 18:15:15 at Duplex.ondata (internal/streams/readable.js:719:22)
26.4.2021, 18:15:15 at Duplex.emit (events.js:315:20)
26.4.2021, 18:15:15 at addChunk (internal/streams/readable.js:309:12)
26.4.2021, 18:15:15 at readableAddChunk (internal/streams/readable.js:284:9)
26.4.2021, 18:15:15 at Duplex.Readable.push (internal/streams/readable.js:223:10)
26.4.2021, 18:15:15 (node:628) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 409)
26.4.2021, 18:15:15 (node:628) UnhandledPromiseRejectionWarning: TypeError: (this.currentChannelId || {}).includes is not a function
26.4.2021, 18:15:15 at stbDevice.updateDeviceState (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:2494:38)
26.4.2021, 18:15:15 at stbPlatform.mqttDeviceStateHandler (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:1495:34)
26.4.2021, 18:15:15 at MqttClient. (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/index.js:1440:12)
26.4.2021, 18:15:15 at MqttClient.emit (events.js:315:20)
26.4.2021, 18:15:15 at MqttClient._handlePublish (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:1277:12)
26.4.2021, 18:15:15 at MqttClient._handlePacket (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:410:12)
26.4.2021, 18:15:15 at work (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:321:12)
26.4.2021, 18:15:15 at Writable.writable._write (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/mqtt/lib/client.js:335:5)
26.4.2021, 18:15:15 at doWrite (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:409:139)
26.4.2021, 18:15:15 at writeOrBuffer (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:398:5)
26.4.2021, 18:15:15 at Writable.write (/home/hoobs/.hoobs/node_modules/homebridge-eosstb/node_modules/readable-stream/lib/_stream_writable.js:307:11)
26.4.2021, 18:15:15 at Duplex.ondata (internal/streams/readable.js:719:22)
26.4.2021, 18:15:15 at Duplex.emit (events.js:315:20)
26.4.2021, 18:15:15 at addChunk (internal/streams/readable.js:309:12)
26.4.2021, 18:15:15 at readableAddChunk (internal/streams/readable.js:284:9)
26.4.2021, 18:15:15 at Duplex.Readable.push (internal/streams/readable.js:223:10)
26.4.2021, 18:15:15 (node:628) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 410)```


**Plugin Config:**

```json
Show your Homebridge config.json here, remove any sensitive information.

Screenshots:

Environment:

  • Plugin Version:
  • Homebridge Version:
  • Node.js Version:
  • NPM Version:
  • Operating System:

Netflix does not display as channel name once Netflix is running

Describe The Bug:

Netflix does not display as channel name once Netflix is running

To Reproduce:

  1. Setup a profile which includes Netflix
  2. Ensure the Netflix channelId and channelName are added to your channels config
  3. Select Netflix from the channel list
  4. Observe that the channel on the set-top box changes successfully to Netflix
  5. Observe that the TV platform now reports that Netflix app is running with a different app id
  6. Observe that the Netflix name is no longer displayed in the Home tile

Expected behavior:

Users expect Netflix to remain visible as the selected channel, as a user sees Netflix as a normal channel like other channels.
Even though it is an app.

Logs:

Netflix is properly detected and added to the master channel list

[14/04/2021, 07:02:33] [EOSSTB] UPC TV_DEV: Found SV09690 in config channels, setting name to Netflix
[14/04/2021, 07:02:33] [EOSSTB] UPC TV_DEV: Unknown channel SV09690 [Netflix] discovered. Adding to the master channel list
[14/04/2021, 07:02:33] [EOSSTB] UPC TV_DEV: Channel list refreshed from profile 'Dad' with 30 channels

Here you see the Netflix app and its id once it is running

[13/04/2021, 18:40:45] [EOSSTB] mqttClient: mqttMessage.status.uiStatus: apps
[13/04/2021, 18:40:45] [EOSSTB] mqttClient: CPE.uiStatus: cpeUiStatus: {
  uiStatus: 'apps',
  appsState: {
    id: 'com.libertyglobal.app.netflix',
    appName: 'Netflix',
    logoPath: '//cdn.metrological.com/s/apps/com.libertyglobal.app.netflix/0.0.1-de02568/Image/1920x1080/icon.png',
    state: {}
  }
}
[13/04/2021, 18:40:45] [EOSSTB] mqttClient: CPE.uiStatus: cpeUiStatus.uiStatus: apps
[13/04/2021, 18:40:45] [EOSSTB] UPC TV_DEV: updateDeviceState: powerState undefined, mediaState undefined [undefined], , recordingState undefined [undefined], channelId com.libertyglobal.app.netflix, sourceType undefined, profileDataChanged undefined
[13/04/2021, 18:40:45] [EOSSTB] UPC TV_DEV: updateDeviceState: currentPowerState 1, currentMediaState 0 [PLAY], currentRecordingState 0 [IDLE], currentChannelId com.libertyglobal.app.netflix [Netflix], currentSourceType linear, currentClosedCaptionsState 0 [DISABLED], currentPictureMode 1 [STANDARD], profileDataChanged false

[13/04/2021, 18:45:44] [EOSSTB] UPC TV_DEV: getInput currentChannelId com.libertyglobal.app.netflix

Plugin Config:

            "channels": [
                {
                    "channelId": "SV09690",
                    "channelName": "Netflix"
                }
            ],
  • Plugin Version:
    homebridge-eosstb v1.1.5 and later

No channels (master list) with 1.1.0

After updating to 1.1.0 the master channel list is not loaded. The channels are not available in HomeKit anymore.

See error log below.

[28/03/2021, 14:38:39] [eosstb] Mediabox: Refreshing channel list...
(node:28516) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'favoriteChannels' of undefined
at stbDevice.refreshChannelList (/usr/local/lib/node_modules/homebridge-eosstb/index.js:2330:69)
at new stbDevice (/usr/local/lib/node_modules/homebridge-eosstb/index.js:1774:8)
at /usr/local/lib/node_modules/homebridge-eosstb/index.js:434:27
(Use node --trace-warnings ... to show where the warning was created)
(node:28516) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:28516) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

My config:
{
"platform": "eosstb",
"country": "nl",
"username": "xxxx",
"password": "xxxx"
}

No channels with 1.1.1

You're too quick with fixing. ;-)
The channels are still not shown in HomeKit.

Log:
[28/03/2021, 18:55:14] [eosstb] Mediabox: Refreshing channel list...
[28/03/2021, 18:55:14] [eosstb] Mediabox: No valid profile found in config. Selecting best-fitting profile
[28/03/2021, 18:55:14] [eosstb] Mediabox: Using profile 0 'Shared Profile'
[28/03/2021, 18:55:14] [eosstb] Mediabox: Profile 'Shared Profile' contains 0 channels
[28/03/2021, 18:55:14] [eosstb] Mediabox: Refreshing channels 1 to 0
[28/03/2021, 18:55:14] [eosstb] Mediabox: Hiding channels 1 to 95
[28/03/2021, 18:55:14] [eosstb] Mediabox: Channel list refreshed from profile 'Shared Profile' with 0 channels

Received warning for the plugin 'homebridge-eosstb'

[1/2/2021, 10:32:56 AM] Received warning for the plugin 'homebridge-eosstb' from the characteristic 'Configured Name': SET handler returned write response value, though the characteristic doesn't support write response!
[Configured Name@Hoekstraat 6 6976] SET handler returned write response value, though the characteristic doesn't support write response!

Config for Dutch Ziggo Netflix channel (150)

Describe Your Problem:

Struggeling to find the correct settings.

Logs:

Show the Homebridge logs here, remove any sensitive information.

Plugin Config:

Show your Homebridge config.json here, remove any sensitive information.

Screenshots:

Environment:

  • Plugin Version:
  • Homebridge Version:
  • Node.js Version:
  • NPM Version:
  • Operating System:

sessionWatchdog doesn't load device

Describe Your Problem:
Plugin fails to load properly. Once the session is created it doesn't start to load the device. It seems like the initial watchdog is stuck; as it's noted as "still working" on the intervals.

I assume this is because the session takes over 15s to load (slow device I guess).
On line 437 I see a return case the session isn't ready but sessionWatchdogRunning is never set to false. This might be part of the problem.

Logs:

Click to see logs
[30/08/2021, 08:33:17] [HB Supervisor] Homebridge Process Ended. Code: 143, Signal: null
[30/08/2021, 08:33:22] [HB Supervisor] Restarting Homebridge...
[30/08/2021, 08:33:22] [HB Supervisor] Starting Homebridge with extra flags: -I -D
[30/08/2021, 08:33:22] [HB Supervisor] Started Homebridge v1.3.4 with PID: 1971
[30/08/2021, 08:33:41] Loaded config.json with 0 accessories and 5 platforms.
[30/08/2021, 08:33:42] Loaded 2 cached accessories from cachedAccessories.
[30/08/2021, 08:34:34] Loading 5 platforms...
[30/08/2021, 08:34:34] [Config] Initializing config platform...
[30/08/2021, 08:34:35] [Config] Running in Service Mode
[30/08/2021, 08:34:35] [EOSSTB] Initializing eosstb platform...
[30/08/2021, 08:34:35] [EOSSTB] API event: didFinishLaunching
[30/08/2021, 08:34:35] [EOSSTB] homebridge-eosstb v1.1.11
[30/08/2021, 08:34:38] Homebridge v1.3.4 (Homebridge 8D6D) is running on port 51640.
[30/08/2021, 08:34:52] [EOSSTB] sessionWatchdog: sessionState 0, sessionConnected false, mqttClientConnected false, mqttClientConnecting false. Session not connected and mqtt not connected, continuing...
[30/08/2021, 08:34:52] [EOSSTB] Session is not connected, starting session reconnect...
[30/08/2021, 08:34:52] [EOSSTB] Creating eosstb BE session...
[30/08/2021, 08:34:52] [EOSSTB] Step 1 of 7: get authentication details
[30/08/2021, 08:34:52] [EOSSTB] Step 1 of 7: get authentication details from https://web-api-prod-obo.horizon.tv/oesp/v4/BE/nld/web/authorization
[30/08/2021, 08:34:55] [EOSSTB] Step 1 of 7: response: 200 OK
[30/08/2021, 08:34:55] [EOSSTB] Step 2 of 7: get AUTH cookie
[30/08/2021, 08:34:55] [EOSSTB] Step 2 of 7: get AUTH cookie from https://login.prd.telenet.be/openid/oauth/authorize?<oauth>
[30/08/2021, 08:35:03] [EOSSTB] Step 2 of 7: response: 200 
[30/08/2021, 08:35:03] [EOSSTB] Step 3 of 7: logging in with username <username>
[30/08/2021, 08:35:03] [EOSSTB] Step 3 of 7: post login to https://login.prd.telenet.be/openid/login.do
[30/08/2021, 08:35:05] [EOSSTB] Step 3 of 7: response: 302 
[30/08/2021, 08:35:05] [EOSSTB] Step 4 of 7: follow redirect url
[30/08/2021, 08:35:06] [EOSSTB] Step 4 of 7: response: 302 
[30/08/2021, 08:35:06] [EOSSTB] Step 5 of 7: extract authorizationCode
[30/08/2021, 08:35:06] [EOSSTB] Step 5 of 7: authorizationCode OK
[30/08/2021, 08:35:06] [EOSSTB] Step 5 of 7: authorizationCode: <authorizationCode>
[30/08/2021, 08:35:06] [EOSSTB] Step 6 of 7: post auth data
[30/08/2021, 08:35:06] [EOSSTB] Step 6 of 7: post auth data to https://web-api-prod-obo.horizon.tv/oesp/v4/BE/nld/web/authorization
[30/08/2021, 08:35:07] [EOSSTB] Step 6 of 7: response: 200 OK
[30/08/2021, 08:35:07] [EOSSTB] Step 7 of 7: post refreshToken request
[30/08/2021, 08:35:07] [EOSSTB] Step 7 of 7: post refreshToken request to https://web-api-prod-obo.horizon.tv/oesp/v4/BE/nld/web/authorization
[30/08/2021, 08:35:08] [EOSSTB] sessionWatchdog: a previous watchdog is still working, exiting without action
[30/08/2021, 08:35:09] [EOSSTB] Step 7 of 7: response: 200 OK
[30/08/2021, 08:35:09] [EOSSTB] Session created
[30/08/2021, 08:35:23] [EOSSTB] sessionWatchdog: a previous watchdog is still working, exiting without action
[30/08/2021, 08:35:38] [EOSSTB] sessionWatchdog: a previous watchdog is still working, exiting without action
[30/08/2021, 08:35:53] [EOSSTB] sessionWatchdog: a previous watchdog is still working, exiting without action
[30/08/2021, 08:36:08] [EOSSTB] sessionWatchdog: a previous watchdog is still working, exiting without action
[30/08/2021, 08:36:23] [EOSSTB] sessionWatchdog: a previous watchdog is still working, exiting without action
[30/08/2021, 08:36:35] [EOSSTB] refreshMasterChannelList: Refreshing master channel list...
[30/08/2021, 08:36:35] [EOSSTB] refreshMasterChannelList: loading inputs from https://web-api-prod-obo.horizon.tv/oesp/v4/BE/nld/web/channels?byLocationId=28001&includeInvisible=true&includeNotEntitled=true&personalised=true&sort=channelNumber
[30/08/2021, 08:36:36] [EOSSTB] refreshMasterChannelList: Processing 151 channels...
[30/08/2021, 08:36:36] [EOSSTB] refreshMasterChannelList: Master channel list refreshed with 151 channels, valid until 30/08/2021, 08:51:35
[30/08/2021, 08:36:38] [EOSSTB] sessionWatchdog: a previous watchdog is still working, exiting without action

Plugin Config:

        {
            "name": "EOSSTB",
            "country": "be-nl",
            "username": "<username>",
            "password": "<pwd>",
            "debugLevel": 3,
            "devices": [
                {
                    "deviceId": "<deviceId>",
                    "syncName": true,
                    "accessoryCategory": "settopbox",
                    "showChannelNumbers": true,
                    "maxChannels": 95,
                    "playPauseButton": "MediaPlayPause",
                    "backButton": "Escape",
                    "infoButton": "MediaTopMenu"
                }
            ],
            "platform": "eosstb"
        }

Environment:

  • Plugin Version: 1.1.11
  • Homebridge Version: 1.3.4
  • Node.js Version: 14.17.5
  • NPM Version: 6.14.14
  • Operating System: Raspbian GNU/Linux Buster (10)

During startup/restart homebridge: no country code

Describe The Bug:
During restart of homebridge the countryside is not recognized in the config, although it is there.

To Reproduce:
After update to version 1.1.1 it seems like the config.json is misinterpreted

Expected behavior:
Earlier version the plugin worked as expected.

Logs:

[01/04/2021, 11:40:23] [HomeWizard] Automatic refresh every 1 mn
[01/04/2021, 11:40:23] [SensiboAC] Initializing SensiboAC platform...
[01/04/2021, 11:40:23] [eosstb] Initializing eosstb platform...
[01/04/2021, 11:40:23] [eosstb] homebridge-eosstb config incomplete: "country" missing. Initialization aborted.
[01/04/2021, 11:40:23] [HomeWizard] Running : homebridge-homewizard 0.1.0
[01/04/2021, 11:40:30] [HomeWizard] Successfully retrieved accessories from HomeWizard
Show the Homebridge logs here, remove any sensitive information.

Plugin Config:
{
"platform": "eosstb",
"devices": [
{
"name": "EOSSTB",
"country": "NL",
"username": "[email protected]",
"password": "Mypassword"
}
]
}

Show your Homebridge config.json here, remove any sensitive information.

Screenshots:

Environment:

  • Plugin Version:
  • Homebridge Version: homebridge-config-ui-x v4.41.0
  • Node.js Version:
  • NPM Version:
  • Operating System:

Failing to complete the login process on Virginmedia

Describe Your Problem:
I subscribe to VirginMedia in the UK and have two TiVo boxes installed both of which are connected to the internal network. I found your HB plugin and thought I'd give it a try but looking in the HB logs the plugin is not completing the login process at Step 3. I can see in the logs an HTTP Status code of 405 (line 143) which suggests the method being called is not allowed.

Your plugin looks very promising with more functionality over channels, volume level and integration with the guide.

Full Disclosure
I do have other plugins running on the Homebridge server (Camera UI, Tuya, Denon TV, Bravia and Rpi) but as far as I can tell, there are no conflicts. If needed I can setup eosstb on a docker instance and run it in isolation to be sure though.

I have inserted the filtered HB log file containing just the log lines that pertain to the Plugin below.

Logs:

[20/02/2021, 16:19:26] [Virginmedia TiVo Service] Creating eosstb GB session...
[20/02/2021, 16:19:26] [Virginmedia TiVo Service] Step 1: get authentication details from https://web-api-prod-obo.horizon.tv/oesp/v4/GB/eng/web/authorization
[20/02/2021, 16:19:26] [Virginmedia TiVo Service] end of getSessionGB, no session created
[20/02/2021, 16:19:26] [Virginmedia TiVo Service] +++INTERCEPTOR HTTP REQUEST: 
Method: get 
URL: https://web-api-prod-obo.horizon.tv/oesp/v4/GB/eng/web/authorization 
BaseURL: undefined 
Headers: {
  common: { Accept: 'application/json, text/plain, */*' },
  delete: {},
  get: {},
  head: {},
  post: { 'Content-Type': 'application/x-www-form-urlencoded' },
  put: { 'Content-Type': 'application/x-www-form-urlencoded' },
  patch: { 'Content-Type': 'application/x-www-form-urlencoded' }
} 
WithCredentials: true
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] +++INTERCEPTED SESSION COOKIEJAR:
 Promise { [] }
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] +++INTERCEPTED HTTP RESPONSE: 200 OK 
Headers: {
  'access-control-allow-credentials': 'true',
  'access-control-expose-headers': 'X-DRM-Device-ID,X-OESP-Version,X-OESP-Session-Response,Warning',
  'content-type': 'application/json;charset=UTF-8',
  server: 'openresty',
  'x-cache-debug': 'MISS',
  'x-oesp-version': '232.0.2.22',
  'x-request-id': '/GB/eng/web/authorization - 1b00a63e-8844-4b17-a058-d98326b0c632',
  'x-edgeconnect-midmile-rtt': '0',
  'x-edgeconnect-origin-mex-latency': '15',
  date: 'Sat, 20 Feb 2021 16:19:27 GMT',
  'content-length': '1495',
  connection: 'close',
  'access-control-allow-origin': 'https://www.horizon.tv'
}
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] +++INTERCEPTED SESSION COOKIEJAR:
 Promise { [] }
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] Step 1 got apiAuthorizationUrl response
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] Step 1 results: authState 86e329ee-c664-49d3-babf-28aad91032e6
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] Step 1 results: authAuthorizationUri https://id.virginmedia.com/oidc/authorize?response_type=code&state=86e329ee-c664-49d3-babf-28aad91032e6&nonce=170a1d3d-aa59-4b10-b2eb-8846cffa5d7e&client_id=9b471ffe-7ff5-497b-9059-8dcb7c0d66f5&redirect_uri=https%3A%2F%2Fvirgintvgo.virginmedia.com%2Fobo_en%2Flogin_success&claims=%7B%22id_token%22%3A%7B%22ukHouseholdId%22%3Anull%7D%7D
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] Step 1 response.status: 200 OK
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] Step 1 results: authValidtyToken eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJvZXNwYXBpIiwiZXhwIjoiMTYxMzgzODE0NzMxMSIsImxnaTpub25jZSI6IjE3MGExZDNkLWFhNTktNGIxMC1iMmViLTg4NDZjZmZhNWQ3ZSIsImxnaTpzdGF0ZSI6Ijg2ZTMyOWVlLWM2NjQtNDlkMy1iYWJmLTI4YWFkOTEwMzJlNiJ9.2JK5ADg83Gb-9XM3xgADBBb6bkif1px4Lv9WJX6DCPM
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] Step 2 get AUTH cookie from https://id.virginmedia.com/oidc/authorize?response_type=code&state=86e329ee-c664-49d3-babf-28aad91032e6&nonce=170a1d3d-aa59-4b10-b2eb-8846cffa5d7e&client_id=9b471ffe-7ff5-497b-9059-8dcb7c0d66f5&redirect_uri=https%3A%2F%2Fvirgintvgo.virginmedia.com%2Fobo_en%2Flogin_success&claims=%7B%22id_token%22%3A%7B%22ukHouseholdId%22%3Anull%7D%7D
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] +++INTERCEPTOR HTTP REQUEST: 
Method: get 
URL: https://id.virginmedia.com/oidc/authorize?response_type=code&state=86e329ee-c664-49d3-babf-28aad91032e6&nonce=170a1d3d-aa59-4b10-b2eb-8846cffa5d7e&client_id=9b471ffe-7ff5-497b-9059-8dcb7c0d66f5&redirect_uri=https%3A%2F%2Fvirgintvgo.virginmedia.com%2Fobo_en%2Flogin_success&claims=%7B%22id_token%22%3A%7B%22ukHouseholdId%22%3Anull%7D%7D 
BaseURL: undefined 
Headers: {
  common: { Accept: 'application/json, text/plain, */*' },
  delete: {},
  get: {},
  head: {},
  post: { 'Content-Type': 'application/x-www-form-urlencoded' },
  put: { 'Content-Type': 'application/x-www-form-urlencoded' },
  patch: { 'Content-Type': 'application/x-www-form-urlencoded' }
} 
WithCredentials: true
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] +++INTERCEPTED SESSION COOKIEJAR:
 Promise { [] }
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] +++INTERCEPTOR HTTP REQUEST: 
Method: get 
URL: https://id.virginmedia.com/sign-in/?protocol=oidc 
BaseURL: undefined 
Headers: {
  common: { Accept: 'application/json, text/plain, */*' },
  delete: {},
  get: {},
  head: {},
  post: { 'Content-Type': 'application/x-www-form-urlencoded' },
  put: { 'Content-Type': 'application/x-www-form-urlencoded' },
  patch: { 'Content-Type': 'application/x-www-form-urlencoded' },
  Accept: 'application/json, text/plain, */*',
  'User-Agent': 'axios/0.21.1'
} 
WithCredentials: true
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] Step 3 post login to https://id.virginmedia.com/sign-in/?protocol=oidc
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] +++INTERCEPTOR HTTP REQUEST: 
Method: post 
URL: https://id.virginmedia.com/sign-in/?protocol=oidc 
BaseURL: undefined 
Headers: {
  common: { Accept: 'application/json, text/plain, */*' },
  delete: {},
  get: {},
  head: {},
  post: { 'Content-Type': 'application/x-www-form-urlencoded' },
  put: { 'Content-Type': 'application/x-www-form-urlencoded' },
  patch: { 'Content-Type': 'application/x-www-form-urlencoded' }
} 
WithCredentials: true
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] Step 3 Unable to login, http error: Error: Request failed with status code 405
    at createError (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios/lib/core/settle.js:17:12)
    at /usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/interceptors/response.js:83:25
    at new Promise (<anonymous>)
    at responseInterceptor (/usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/interceptors/response.js:82:9)
    at /usr/lib/node_modules/homebridge-eosstb/node_modules/axios-cookiejar-support/lib/index.js:130:67
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  config: {
    url: 'https://id.virginmedia.com/sign-in/?protocol=oidc',
    method: 'post',
    data: '[XXXXXXX%40XXXXXXXXXXX.co.uk]&credential=[XXXXXXXXXXX]',
    headers: {
      Accept: 'application/json, text/plain, */*',
      'Content-Type': 'application/x-www-form-urlencoded',
      Cookie: 'ULM-JSESSIONID=9C70A57B0040B74880F4747C5D7D7841',
      'User-Agent': 'axios/0.21.1',
      'Content-Length': 54
    },
    params: 'protocol=oidc&rememberme=true',
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    withCredentials: true,
    adapter: [Function: httpAdapter],
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    maxRedirects: 0,
    jar: CookieJar {
      rejectPublicSuffixes: true,
      enableLooseMode: false,
      allowSpecialUseDomain: false,
      store: { idx: {
        'virginmedia.com': {
          '/': {
            'ULM-JSESSIONID': Cookie="ULM-JSESSIONID=9C70A57B0040B74880F4747C5D7D7841; Domain=virginmedia.com; Path=/; Secure; HttpOnly; hostOnly=false; aAge=107ms; cAge=318ms"
          }
        }
      } },
      prefixSecurity: 'silent',
      _cloneSync: [Function (anonymous)],
      _importCookiesSync: [Function (anonymous)],
      getCookiesSync: [Function (anonymous)],
      getCookieStringSync: [Function (anonymous)],
      getSetCookieStringsSync: [Function (anonymous)],
      removeAllCookiesSync: [Function (anonymous)],
      setCookieSync: [Function (anonymous)],
      serializeSync: [Function (anonymous)]
    },
    ignoreCookieErrors: true,
    validateStatus: [Function: validateStatus]
  },
  request: <ref *1> ClientRequest {
    _events: [Object: null prototype] {
      error: [Function: handleRequestError],
      prefinish: [Function: requestOnPrefinish]
    },
    _eventsCount: 2,
    _maxListeners: undefined,
    outputData: [],
    outputSize: 0,
    writable: true,
    destroyed: false,
    _last: true,
    chunkedEncoding: false,
    shouldKeepAlive: false,
    _defaultKeepAlive: true,
    useChunkedEncodingByDefault: true,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    _contentLength: 54,
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    socket: TLSSocket {
      _tlsOptions: [Object],
      _secureEstablished: true,
      _securePending: false,
      _newSessionPending: false,
      _controlReleased: true,
      secureConnecting: false,
      _SNICallback: null,
      servername: 'id.virginmedia.com',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 10,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'id.virginmedia.com',
      _readableState: [ReadableState],
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: false,
      _sockname: null,
      _pendingData: null,
      _pendingEncoding: '',
      server: undefined,
      _server: null,
      ssl: [TLSWrap],
      _requestCert: true,
      _rejectUnauthorized: true,
      parser: null,
      _httpMessage: [Circular *1],
      [Symbol(res)]: [TLSWrap],
      [Symbol(verified)]: true,
      [Symbol(pendingSession)]: null,
      [Symbol(async_id_symbol)]: 544,
      [Symbol(kHandle)]: [TLSWrap],
      [Symbol(kSetNoDelay)]: false,
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: null,
      [Symbol(kBuffer)]: null,
      [Symbol(kBufferCb)]: null,
      [Symbol(kBufferGen)]: null,
      [Symbol(kCapture)]: false,
      [Symbol(kBytesRead)]: 0,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(connect-options)]: [Object],
      [Symbol(RequestTimeout)]: undefined
    },
    _header: 'POST /sign-in/?protocol=oidc&0=protocol%3Doidc%26rememberme%3Dtrue HTTP/1.1\r\n' +
      'Accept: application/json, text/plain, */*\r\n' +
      'Content-Type: application/x-www-form-urlencoded\r\n' +
      'Cookie: ULM-JSESSIONID=9C70A57B0040B74880F4747C5D7D7841\r\n' +
      'User-Agent: axios/0.21.1\r\n' +
      'Content-Length: 54\r\n' +
      'Host: id.virginmedia.com\r\n' +
      'Connection: close\r\n' +
      '\r\n',
    _keepAliveTimeout: 0,
    _onPendingData: [Function: noopPendingOutput],
    agent: Agent {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object],
      requests: {},
      sockets: [Object],
      freeSockets: {},
      keepAliveMsecs: 1000,
      keepAlive: false,
      maxSockets: Infinity,
      maxFreeSockets: 256,
      scheduling: 'fifo',
      maxTotalSockets: Infinity,
      totalSocketCount: 1,
      maxCachedSessions: 100,
      _sessionCache: [Object],
      [Symbol(kCapture)]: false
    },
    socketPath: undefined,
    method: 'POST',
    maxHeaderSize: undefined,
    insecureHTTPParser: undefined,
    path: '/sign-in/?protocol=oidc&0=protocol%3Doidc%26rememberme%3Dtrue',
    _ended: true,
    res: IncomingMessage {
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 3,
      _maxListeners: undefined,
      socket: [TLSSocket],
      httpVersionMajor: 1,
      httpVersionMinor: 1,
      httpVersion: '1.1',
      complete: true,
      headers: [Object],
      rawHeaders: [Array],
      trailers: {},
      rawTrailers: [],
      aborted: false,
      upgrade: false,
      url: '',
      method: null,
      statusCode: 405,
      statusMessage: 'Not Allowed',
      client: [TLSSocket],
      _consuming: false,
      _dumped: false,
      req: [Circular *1],
      [Symbol(kCapture)]: false,
      [Symbol(RequestTimeout)]: undefined
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    reusedSocket: false,
    host: 'id.virginmedia.com',
    protocol: 'https:',
    [Symbol(kCapture)]: false,
    [Symbol(kNeedDrain)]: false,
    [Symbol(corked)]: 0,
    [Symbol(kOutHeaders)]: [Object: null prototype] {
      accept: [Array],
      'content-type': [Array],
      cookie: [Array],
      'user-agent': [Array],
      'content-length': [Array],
      host: [Array]
    }
  },
  response: {
    status: 405,
    statusText: 'Not Allowed',
    headers: {
      server: 'openresty',
      date: 'Sat, 20 Feb 2021 16:19:27 GMT',
      'content-type': 'text/html',
      'content-length': '166',
      connection: 'close'
    },
    config: {
      url: 'https://id.virginmedia.com/sign-in/?protocol=oidc',
      method: 'post',
      data: 'username=[XXXXXXX%40XXXXXXXXXXX.co.uk]&credential=[XXXXXXXXXXX]',
      headers: [Object],
      params: 'protocol=oidc&rememberme=true',
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      withCredentials: true,
      adapter: [Function: httpAdapter],
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      maxRedirects: 0,
      jar: [CookieJar],
      ignoreCookieErrors: true,
      validateStatus: [Function: validateStatus]
    },
    request: <ref *1> ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: false,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: true,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      _contentLength: 54,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      socket: [TLSSocket],
      _header: 'POST /sign-in/?protocol=oidc&0=protocol%3Doidc%26rememberme%3Dtrue HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        'Content-Type: application/x-www-form-urlencoded\r\n' +
        'Cookie: ULM-JSESSIONID=9C70A57B0040B74880F4747C5D7D7841\r\n' +
        'User-Agent: axios/0.21.1\r\n' +
        'Content-Length: 54\r\n' +
        'Host: id.virginmedia.com\r\n' +
        'Connection: close\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: noopPendingOutput],
      agent: [Agent],
      socketPath: undefined,
      method: 'POST',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      path: '/sign-in/?protocol=oidc&0=protocol%3Doidc%26rememberme%3Dtrue',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'id.virginmedia.com',
      protocol: 'https:',
      [Symbol(kCapture)]: false,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kOutHeaders)]: [Object: null prototype]
    },
    data: '<html>\r\n' +
      '<head><title>405 Not Allowed</title></head>\r\n' +
      '<body bgcolor="white">\r\n' +
      '<center><h1>405 Not Allowed</h1></center>\r\n' +
      '<hr><center>nginx</center>\r\n' +
      '</body>\r\n' +
      '</html>\r\n'
  },
  isAxiosError: true,
  toJSON: [Function: toJSON]
}
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] +++INTERCEPTED SESSION COOKIEJAR:
 Promise {
  [
    Cookie="ULM-JSESSIONID=9C70A57B0040B74880F4747C5D7D7841; Domain=virginmedia.com; Path=/; Secure; HttpOnly; hostOnly=false; aAge=0ms; cAge=35ms"
  ]
}
[20/02/2021, 16:19:27] [Virginmedia TiVo Service] +++INTERCEPTED HTTP RESPONSE: 200 OK 
Headers: {
  server: 'openresty',
  date: 'Sat, 20 Feb 2021 16:19:27 GMT',
  'content-type': 'text/html',
  'content-length': '30339',
  'last-modified': 'Fri, 21 Sep 2018 12:13:04 GMT',
  connection: 'close',
  vary: 'Accept-Encoding',
  etag: '"5ba4e050-7683"',
  expires: 'Sat, 20 Feb 2021 16:24:27 GMT',
  'cache-control': 'max-age=300',
  'accept-ranges': 'bytes'
}

homebridge.log

Plugin Config:
eosstb-config.json.txt

homebridge-config.json.txt

Environment:
Running HomeBridge on a Raspberry Pi 4 4GB connected via Ethernet

  • Plugin Version: v0.1.7
  • Homebridge Version: v.1.30
  • Node.js Version: v14.15.5
  • NPM Version: v.6.14.11
  • Operating System: Raspbian GNU/Linux Buster (10)

Not responsive if it’s playing a long time

Like the title says. If you’ve been watching for a long time it’s not responsive anymore. The remote app won’t work either.
Doesn’t show anything in the log. It does show that I’ve tried to switch channels, but nothing happens.

Enhance Remote Control with double-tap and triple-tap for extra functions

The Apple TV Remote Control is very limited in it's buttons, and does not provide any button mappings for key functions like the HOME and the TV buttons.

One way the Apple Remote Control could be enhanced is with configurable double-tap and triple-tap functions.
Each function should be configurable in the Homebridge config to allow the user to map to any key he wishes.

location url empty! for Telenet (BE NL)

Describe The Bug:

When configuring Telenet BE NL I get the following error: the location url is empty
To Reproduce:

Install latest version of the plugin (v1.1.11) on homebridge
Expected behavior:

We're able to login and the digicorder shows up
Logs:

Show the Homebridge logs here, remove any sensitive information.

[8/4/2021, 9:26:48 AM] [EOSSTB] Session is not connected, starting session reconnect...
[8/4/2021, 9:26:48 AM] [EOSSTB] Creating eosstb BE session...
[8/4/2021, 9:26:48 AM] [EOSSTB] Step 1 of 7: get authentication details
[8/4/2021, 9:26:48 AM] [EOSSTB] Step 1 of 7: response: 200 OK
[8/4/2021, 9:26:48 AM] [EOSSTB] Step 2 of 7: get AUTH cookie
[8/4/2021, 9:26:48 AM] [EOSSTB] Step 2 of 7: response: 200
[8/4/2021, 9:26:48 AM] [EOSSTB] Step 3 of 7: logging in with username xxx
[8/4/2021, 9:26:49 AM] [EOSSTB] Step 3 of 7: response: 302
[8/4/2021, 9:26:49 AM] [EOSSTB] Step 4 of 7: follow redirect url
[8/4/2021, 9:26:49 AM] [EOSSTB] Step 4 of 7: response: 200
[8/4/2021, 9:26:49 AM] [EOSSTB] Step 4 of 7: location url empty!

Plugin Config:

Show your Homebridge config.json here, remove any sensitive information.

{
"bridge": {
"name": "Homebridge 647C",
"username": "0E:0A:E7:93:64:7C",
"port": 52978,
"pin": "031-45-154"
},
"accessories": [],
"platforms": [
{
"name": "Config",
"port": 8581,
"platform": "config"
},
{
"name": "EOSSTB",
"country": "be-nl",
"username": "user",
"password": "psswd",
"devices": [
{
"syncName": true,
"accessoryCategory": "settopbox",
"showChannelNumbers": false,
"maxChannels": 95,
"playPauseButton": "MediaPlayPause",
"backButton": "Escape",
"infoButton": "MediaTopMenu"
}
],
"platform": "eosstb"
}
]
}
~
Screenshots:

Environment:

  • Plugin Version: v1.1.11
  • Homebridge Version: v1.3.4
  • Node.js Version: v14.17.4
  • NPM Version: v6.14.14
  • Operating System: Docker

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.