If you are using the same Nvidia shield as a server and a client, then this is a known issue I coded for (disabling the controls) and documented. In this scenario, the local client doesn’t get a real IP address (gets a loopback address) so all API calls fail. Maybe I can get around that by using the address of the server and calling the commands via url. Let me know if this is your circumstance.
Another update coming soon regarding the shield: In my testing:
- remote client (ex. iPhone) streaming from shield PMS: controls display and work fine
- local client (ex. playing directly on the shield or casting to the shield) streaming from shield PMS: controls disabled (by me) since they don’t work (because the client does not have a registered IP address and can’t be controlled via the web api)
- local client (ex. playing directly on the shield) streaming from another PMS: controls display and work mostly fine: Errors display whenever volume is lowered below 2. I also disable mute because of this.
Yes, that is my use case exactly. PMS runs in the background and the client is a separate app.
I guess that’s why it works when I point it to my old PC server. But I am planning on decommissioning that as that was the whole reason I bought the Shield. I’m hoping to turn the old PMS into a Linux box to run HA.
To be honest, if you can’t find a way around control from the HA UI it wouldn’t be the end of this for me as long as I could still access the controls from within an automation somehow. I really don’t use the UI for control that often.
(But I’d be happier if you can make it work, of course! )
Whatever I can do to help, testing, documenting things like this - I stand at the ready!
Update posted (Nvidia shield fix)
Testing now.
OK, I cleared my cache, deleted the pycache and installed the new code. I’m not running the Shield at the moment and this is what I see.
I’m going to go and run Plex on the Shield and then capture the screen when it’s running…
Same as before…
Error log:
17-02-16 22:08:24 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/srv/hass/hass_venv/lib/python3.4/site-packages/requests/packages/urllib3/connection.py", line 141, in _new_conn
(self.host, self.port), self.timeout, **extra_kw)
File "/srv/hass/hass_venv/lib/python3.4/site-packages/requests/packages/urllib3/util/connection.py", line 83, in create_connection
raise err
File "/srv/hass/hass_venv/lib/python3.4/site-packages/requests/packages/urllib3/util/connection.py", line 73, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/srv/hass/hass_venv/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py", line 600, in urlopen
chunked=chunked)
File "/srv/hass/hass_venv/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py", line 356, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/usr/lib/python3.4/http/client.py", line 1090, in request
self._send_request(method, url, body, headers)
File "/usr/lib/python3.4/http/client.py", line 1128, in _send_request
self.endheaders(body)
File "/usr/lib/python3.4/http/client.py", line 1086, in endheaders
self._send_output(message_body)
File "/usr/lib/python3.4/http/client.py", line 924, in _send_output
self.send(msg)
File "/usr/lib/python3.4/http/client.py", line 859, in send
self.connect()
File "/srv/hass/hass_venv/lib/python3.4/site-packages/requests/packages/urllib3/connection.py", line 166, in connect
conn = self._new_conn()
File "/srv/hass/hass_venv/lib/python3.4/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.HTTPConnection object at 0x6476e810>: Failed to establish a new connection: [Errno 111] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/srv/hass/hass_venv/lib/python3.4/site-packages/requests/adapters.py", line 423, in send
timeout=timeout
File "/srv/hass/hass_venv/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py", line 649, in urlopen
_stacktrace=sys.exc_info()[2])
File "/srv/hass/hass_venv/lib/python3.4/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: HTTPConnectionPool(host='127.0.0.1', port=32500): Max retries exceeded with url: /player/playback/pause?commandID=1&type=video (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x6476e810>: Failed to establish a new connection: [Errno 111] Connection refused',))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3.4/asyncio/tasks.py", line 233, in _step
result = coro.throw(exc)
File "/srv/hass/hass_venv/lib/python3.4/site-packages/homeassistant/core.py", line 1018, in _event_to_service_call
yield from service_handler.func(service_call)
File "/srv/hass/hass_venv/lib/python3.4/site-packages/homeassistant/components/media_player/__init__.py", line 364, in async_service_handler
yield from getattr(player, method['method'])(**params)
File "/usr/lib/python3.4/asyncio/futures.py", line 388, in __iter__
yield self # This tells Task to wait for completion.
File "/usr/lib/python3.4/asyncio/tasks.py", line 286, in _wakeup
value = future.result()
File "/usr/lib/python3.4/asyncio/futures.py", line 277, in result
raise self._exception
File "/usr/lib/python3.4/concurrent/futures/thread.py", line 54, in run
result = self.fn(*self.args, **self.kwargs)
File "/home/hass/custom_components/media_player/plexdevices.py", line 623, in media_pause
self.device.pause(self._active_media_plexapi_type)
File "/home/hass/deps/plexapi/client.py", line 126, in pause
def pause(self, mtype): self.sendCommand('playback/pause', type=mtype)
File "/home/hass/deps/plexapi/client.py", line 85, in sendCommand
return self.query(path, headers=headers)
File "/home/hass/deps/plexapi/client.py", line 66, in query
response = method(url, headers=headers, timeout=TIMEOUT, **kwargs)
File "/srv/hass/hass_venv/lib/python3.4/site-packages/requests/sessions.py", line 501, in get
return self.request('GET', url, **kwargs)
File "/srv/hass/hass_venv/lib/python3.4/site-packages/requests/sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "/srv/hass/hass_venv/lib/python3.4/site-packages/requests/sessions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "/srv/hass/hass_venv/lib/python3.4/site-packages/requests/adapters.py", line 487, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=32500): Max retries exceeded with url: /player/playback/pause?commandID=1&type=video (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x6476e810>: Failed to establish a new connection: [Errno 111] Connection refused',))
Hey @JesseWebDotCom - not running a shield (client or server) but receiving this still:
Traceback (most recent call last):
File "uvloop/future.pyx", line 372, in uvloop.loop.BaseTask._fast_step (uvloop/loop.c:112669)
File "/usr/src/app/homeassistant/helpers/entity_component.py", line 336, in _async_process_entity
new_entity, self, update_before_add=update_before_add
File "/usr/src/app/homeassistant/helpers/entity_component.py", line 205, in async_add_entity
yield from entity.async_update_ha_state()
File "/usr/src/app/homeassistant/helpers/entity.py", line 240, in async_update_ha_state
attr)
File "/usr/src/app/homeassistant/helpers/entity.py", line 306, in _attr_setter
value = getattr(self, name)
File "/config/custom_components/media_player/plexdevices.py", line 573, in supported_features
if "127.0.0.1" in self._convert_na_to_none(self.device.baseurl):
AttributeError: 'NoneType' object has no attribute 'baseurl'
I have started a thread in the Plex forum:
Maybe Plex team could help us out.
So I just tried it out with 38.3 and plexdevices using Plex on an AppleTV. It works and seems to give all information. Though volume control does not work with this client it seems and Im not surprised at that.
What I would have hoped would start working with your improvements was channels and playing movies from there, but they don’t seem to be represented anywhere in Plex context.
Also noticed that media_season: is still shown even when no media is playing. Small bug perhaps?
I would still like you to reconsider also using the web hooks, since the same issue with slow updates as with the original plugin still exists. Even though I increase polling frequency it is still annoying that it is not instant now that Plex enables the possibility of getting notifications.
But don’t take too much on my grind with web hooks, still an awesome job you’ve done!
/R
May be a bit OT but important to anyone considering the ShieldTV as a Plex Media Server:
Well, the Shield PMS issues may not even be worth sorting out at the moment. I thought I did proper research before buying my Shield 16GB, but as it turns out, I didn’t do enough.
Plex Media Server will only store it’s metadata on the internal storage, even if you have added adoptable storage. With a large collection, you can quickly eat up all your internal storage leaving you with performance issues (which fortunately I am not experiencing yet).
Plex blames nVidia, but this is BS because Kodi is able to store its data anywhere. Plex decided to use a secure location and changing this is totally on them. As a lifetime PlexPass member, I feel cheated and lied to. They’ve known about this for months now and have released new PMS versions but no fix.
I may end up moving to kodi if I can’t find a way around this or it is fixed. In the meantime, I’ll probably be moving my music libraries off the Shield in order to conserve space.
Here’s a post explaining this in the nVidia forums:
https://forums.geforce.com/default/topic/976481/shield-tv/when-will-we-be-able-to-save-plex-data-and-settings-/1/
Wouldn’t it be possible to redirect the folder on a system level to point to an external or event remote drive?
Are you using the latest version as I believe I fixed that issue? You should see the following code:
@property
def supported_features(self):
"""Flag media player features that are supported."""
# Disable controls if player is local (127.0.0.1)
# Like when running client and server on a single Nvidia shield
# or when casting to an Nvidia shield running a plex server
if self.local:
return None
# No mute since Shield only supports volume 2-100
elif self.make == "SHIELD Android TV":
return SUPPORT_PLEX
elif self.device:
return SUPPORT_PLEX | SUPPORT_VOLUME_MUTE
else:
return None
No, unfortunately Plex decided to put their metadata library in a secure location instead the standard data location off of root, so there’s no way to redirect this with a symlink or anything.
They pushed this through advertisements constantly but never let on about this limitation. I just sent them a nice tweet about it.
As a lifetime PlexPass subscriber, I’d want to take advantage of Webhooks as well. Does anyone with a PlexPass subscriber know how to take advantage of that?
Fix posted to address the season issue
@rpitera, have you tried using Plex DVR to record TV shows to a writable Samba share? Have a look at Storage Limitation section in Plex’s website:
Plex relies in the list of storage devices directly from NVIDIA Shield. Kodi does not. I’m not sure if there’s a file manager for Kodi, but in NVIDIA Shield, Android TV does not allow write access to Samba shares unless it’s classified as an “internal volume” similar to USB hard drives connected to the Shield. If you connect your external USB hard drive to Shield as a Media Storage, Android TV won’t allow write access to it unless you classify it as internal volume.
This is even with a Media Optimizer feature. Plex can’t write transcoded movie to a Samba share.
Honestly, I don’t think you’ve been cheated by Plex. I’m not sure if it’s a limitation only in NVIDIA Shield or if it’s a limitation for Android TV as a whole, which includes Nexus Player and other Android TV devices.
Again, sorry for going OT and will gladly move this to a PM if anyone objects.
@GraysonPeddie I think your missing the point here; it’s not about storing media and I don’t use DVR. This is about the metadata for your collections; all the movie/tv posters, ratings info, banners, thumbnails etc. All the stuff that makes Plex really useful in cataloging your collection. For PlexPass members this also includes all the information in the enhanced music libraries as well. None of this can be stored anywhere on the Shield except for the Shield devices internal memory, even if you increase that space by using adoptable storage as Plex decided to use a secure location.
This isn’t an OS issue or even a Shield issue, this is solely due to Plex programming. Kodi uses the standard data location in Android, so when you adopt a USB drive as internal storage, your metadata is stored there.
It’s not about the collections or DVR or samba shares. It’s all about where your metadata is stored. Even with a moderately large collection, you can quickly eat up your internal storage space and some have even reported their Shield’s crashing as a result. Plex advertised the Shield as the “ultimate media server” and pushed it hard, but never let on about these limitations until months later. The article you referenced - which I already saw - was only added when users started complaining about the multiple issues. Things like the inability to use PlexMix on the Shield wasn’t even added to that page until a couple of weeks ago.
So yeah, I feel cheated. And the limitation is not for Android TV as a whole, only Plex Media Server on the Shield, since that’s the only Android TV device currently supported to run PMS.
Okay. My apologies for going off-topic.
I don’t know if it’s possible to store metadata in another storage device, such as a Samba share, though, but I get your point.
When browsing your server in the web client go in to your account and you should find web hooks.
Plex has posted a node.js example on how to do home automation with web hooks
/R
I got that, but what URL do I put in it for Webhooks? Do I put in something like http:\\localhost:1250
(I used “\” instead of “//” so Discourse does not convert the localhost address into links; otherwise, I’ll get a “Popular Link” badge…)?