Philips Android TV component

Hey guys,

Thank you everyone for contributing to this component!

The one thing that I really hated about my Philips TV is that I had to go deep into the menu to turn on/off ‘Ambilight + hue’ (the one that syncs hue lights and TV’s ambilight), which made it almost impossible to automate. While Philips mobile apps can toggle this setting, I’ve never seen anybody successfully changing this setting through the exposed API.

So, I’ve decided to sniff the traffic between the mobile app and the TV using a simple man-in-the-middle attack and BINGO, now I can actually get the status and toggle ‘Ambilight + hue’. I need to run some more tests, but it definitely works!

I have 2 questions for the community:
1) Is this ‘Ambilight + hue’ setting useful for anyone besides me?
I can add it to the component, but I want to make sure that this would not be a useless change.
2) Is there any other functionality in the iOS/Android app that has not been discovered in the API yet?
I can sniff the traffic and hopefully add the missing functions.

Cheers guys!

2 Likes

This is very usefull. I almost never use Ambilight because of the hidden menu.

@Nutti85 Thanks for the reply, glad to hear I am not the only one who hates this menu… Which TV model do you have? Would you be willing to test the updated component if I prepare one? (it works on my TV, but I want to test it on other models before making it public…)

@nstrelow Would you be open to accepting a Pull Request with “Ambilight + hue” toggle added? If yes, I’ll prepare one once everything is tested and ready to go.

This looks like it is not working for your TV model OR your username password or some other setting is wrong.

I think it becomes very clear that I need a good Readme in my Github repo.
I will try to add one soon and link it back here.

Not sure, I did go through all know APIs and the app itself, and I don’t think there is something especially useful not already discovered in an API. A way to switch between HDMI devices, that would be awesome.

I am super happy to get PRs. But I am unsure if this fits into this media component.

Actually there is an Ambilight component Philips Android TV Ambilights (Light) component

Check that out, it supports a lot of different modes. Maybe your change is already built in or it fits better there.

Ideally we should built a python module for the Philips TV. It should support everything from media player, app switching and amiblight stuff, so everything the API supports.
This python module should then be used for both Ambilight and media player.

1 Like

Very much appreciated

Thank you

Thanks, that’s a good idea, I’ll give it a go.

Not sure if there is a way through API (I’ll check), but it’s super easy through ADB: you can send any keypresses through it and function keys (F1, F2, etc) switch input on my Philips TV.

1 Like

I finally added a meaningful Readme. Tell me if there is something missing.

1 Like

The Philips TV API also supports sending keys. But it would be a hacky workaround to automate a multiple key presses to switch HDMI input. But if there is a single key to switch to one HDMI source.

Exactly, but with adb you can switch with a single key press - e.g., F1 switches to HDMI-1, F2 - to HDMI-2, etc. I don’t remember the buttons exactly (could be F4-F8, for example), but you can easily test it with any USB keyboard plugged into the TV set.

An ambilight+hue toggle would be great! I would happily test an updated component with my PUS7101/12 :slight_smile:

Glad to test this too on a POS9002.

I have a 9002. Would love to have it in home assistant.

Does anyone here have a 9002 and the a working ambilight component.

I would be glad to test.

Hey guys, I’ve decided to document all API endpoints and to create a better python tool to control Philips TVs. You can find an unofficial API reference and the tool (both are ‘work-in-progress’) here: https://github.com/eslavnov/Pylips (comments are welcome!)

It’s far from being done and it’s not a home assistant component (yet), but it already supports turning ‘Ambilight + Hue’ on and off:
python pylips.py --host %ip_address% --user %username% --pass %password% --command ambihue_on
python pylips.py --host %ip_address% --user %username% --pass %password% --command ambihue_off

You can use it through a script/switch entity in Home Assistant…

If this works for you, please share your TV model! Thank you in advance!

4 Likes

great module, reminds me a lot of the one from suborb, just cleaner and with more amilight options.
When I find the time I will build a python module, which can be extended on for ambilight and media player components.

@nstrelow i get this error:
python3 philips_2016.py --host 192.168.1.28 pair
Traceback (most recent call last):
File “philips_2016.py”, line 2, in
import homeassistant.helpers.config_validation as cv
ModuleNotFoundError: No module named ‘homeassistant’
tilen-4:~ tilenmatejcervek$ python3 philips.py --host 192.168.1.28 pair
Starting pairing request
Traceback (most recent call last):
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/packages/urllib3/connection.py”, line 141, in _new_conn
(self.host, self.port), self.timeout, **extra_kw)
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/packages/urllib3/util/connection.py”, line 83, in create_connection
raise err
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/packages/urllib3/util/connection.py”, line 73, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 61] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/packages/urllib3/connectionpool.py”, line 600, in urlopen
chunked=chunked)
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/packages/urllib3/connectionpool.py”, line 345, in _make_request
self._validate_conn(conn)
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/packages/urllib3/connectionpool.py”, line 844, in _validate_conn
conn.connect()
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/packages/urllib3/connection.py”, line 284, in connect
conn = self._new_conn()
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/packages/urllib3/connection.py”, line 150, in _new_conn
self, “Failed to establish a new connection: %s” % e)
requests.packages.urllib3.exceptions.NewConnectionError: <requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x10631fa90>: Failed to establish a new connection: [Errno 61] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/adapters.py”, line 423, in send
timeout=timeout
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/packages/urllib3/connectionpool.py”, line 649, in urlopen
_stacktrace=sys.exc_info()[2])
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/packages/urllib3/util/retry.py”, line 376, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
requests.packages.urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host=‘192.168.1.28’, port=1926): Max retries exceeded with url: /6/pair/request (Caused by NewConnectionError(’<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x10631fa90>: Failed to establish a new connection: [Errno 61] Connection refused’))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “philips.py”, line 123, in
main()
File “philips.py”, line 90, in main
pair(config)
File “philips.py”, line 41, in pair
r = requests.post(“https://” + config[‘address’] + “:1926/6/pair/request”, json=data, verify=False)
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/api.py”, line 110, in post
return request(‘post’, url, data=data, json=json, **kwargs)
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/api.py”, line 56, in request
return session.request(method=method, url=url, **kwargs)
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/sessions.py”, line 488, in request
resp = self.send(prep, **send_kwargs)
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/sessions.py”, line 609, in send
r = adapter.send(request, **kwargs)
File “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/adapters.py”, line 487, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host=‘192.168.1.28’, port=1926): Max retries exceeded with url: /6/pair/request (Caused by NewConnectionError(’<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x10631fa90>: Failed to establish a new connection: [Errno 61] Connection refused’))

or this in hassio:
core-ssh:~# /config/custom_components/media_player/philips_2016.py --host 192.168.1.28 pair

/config/custom_components/media_player/philips_2016.py: line 1: Philips TV: command not found

/config/custom_components/media_player/philips_2016.py: line 2: import: command not found

/config/custom_components/media_player/philips_2016.py: line 3: import: command not found

/config/custom_components/media_player/philips_2016.py: line 4: import: command not found

/config/custom_components/media_player/philips_2016.py: line 5: import: command not found

/config/custom_components/media_player/philips_2016.py: line 6: import: command not found

/config/custom_components/media_player/philips_2016.py: line 7: import: command not found

/config/custom_components/media_player/philips_2016.py: line 8: import: command not found

/config/custom_components/media_player/philips_2016.py: line 9: import: command not found

/config/custom_components/media_player/philips_2016.py: line 10: import: command not found

/config/custom_components/media_player/philips_2016.py: line 11: import: command not found

/config/custom_components/media_player/philips_2016.py: line 13: from: command not found

/config/custom_components/media_player/philips_2016.py: line 14: from: command not found

/config/custom_components/media_player/philips_2016.py: line 15: syntax error near unexpected token `(’

/config/custom_components/media_player/philips_2016.py: line 15: `from homeassistant.components.media_player import (SUPPORT_STOP, SUPPORT_PLAY, SUPPORT_NEXT_TRACK, SUPPORT_PAUSE,’

core-ssh:~# /config/custom_components/media_player/philips.py --host 192.168.1.28 pair

/config/custom_components/media_player/philips.py: line 1: from: command not found

/config/custom_components/media_player/philips.py: line 2: from: command not found

/config/custom_components/media_player/philips.py: line 3: from: command not found

/config/custom_components/media_player/philips.py: line 4: import: command not found

/config/custom_components/media_player/philips.py: line 5: import: command not found

/config/custom_components/media_player/philips.py: line 6: import: command not found

/config/custom_components/media_player/philips.py: line 7: import: command not found

/config/custom_components/media_player/philips.py: line 8: import: command not found

/config/custom_components/media_player/philips.py: line 9: from: command not found

/config/custom_components/media_player/philips.py: line 10: from: command not found

/config/custom_components/media_player/philips.py: line 11: import: command not found

/config/custom_components/media_player/philips.py: line 20: syntax error near unexpected token `def’

/config/custom_components/media_player/philips.py: line 20: `def createDeviceId():’

core-ssh:~#

Since the API does not support switching input sources anymore, I’ve made a small script that utilizes ADB to do it: https://github.com/eslavnov/android-tv-remote

python3 pylips.py --host 192.168.1.28

Would you like to pair with your TV? [Y/n]y

Starting pairing request

resending pair request

resending pair request

resending pair request

resending pair request

resending pair request

resending pair request

resending pair request

resending pair request

resending pair request

The API is unreachable. Try restarting your TV and pairing again

Can you please copy and paste what you see if you go to https://192.168.1.28:1926/6/system in your browser?

If you don’t see anything in the browser then either the ip address is wrong or your TV does not support this API. What’s your TV model?