Panasonic Viera TV upgrade to allow compatibility with more TVs (panasonic_viera 0.3.4, currently 0.3.2)

Tags: #<Tag:0x00007f739a6e2fe8>

Hi all,

I am trying to update the Panasonic Viera Component to work with panasonic_viera=0.4.3 because 0.4.2 does not have support for encrypted TV. But if I run the code inside HomeAssistant I get the following error:

de gen. 13 18:36:29 raspberrypi hass[26388]: 2020-01-13 18:36:29 ERROR (MainThread) [homeassistant.components.websocket_api.http.connection.1668440368] HTTP Error 500: Internal Server Error
de gen. 13 18:36:29 raspberrypi hass[26388]: Traceback (most recent call last):
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/srv/homeassistant/lib/python3.7/site-packages/homeassistant/components/websocket_api/commands.py", line 133, in handle_call_service
de gen. 13 18:36:29 raspberrypi hass[26388]:     connection.context(msg),
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/srv/homeassistant/lib/python3.7/site-packages/homeassistant/core.py", line 1235, in async_call
de gen. 13 18:36:29 raspberrypi hass[26388]:     await asyncio.shield(self._execute_service(handler, service_call))
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/srv/homeassistant/lib/python3.7/site-packages/homeassistant/core.py", line 1260, in _execute_service
de gen. 13 18:36:29 raspberrypi hass[26388]:     await handler.func(service_call)
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/srv/homeassistant/lib/python3.7/site-packages/homeassistant/helpers/entity_component.py", line 205, in handle_service
de gen. 13 18:36:29 raspberrypi hass[26388]:     self._platforms.values(), func, call, service_name, required_features
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/srv/homeassistant/lib/python3.7/site-packages/homeassistant/helpers/service.py", line 336, in entity_service_call
de gen. 13 18:36:29 raspberrypi hass[26388]:     future.result()  # pop exception if have
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/srv/homeassistant/lib/python3.7/site-packages/homeassistant/helpers/service.py", line 358, in _handle_service_platform_call
de gen. 13 18:36:29 raspberrypi hass[26388]:     await getattr(entity, func)(**data)
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/usr/lib/python3.7/concurrent/futures/thread.py", line 57, in run
de gen. 13 18:36:29 raspberrypi hass[26388]:     result = self.fn(*self.args, **self.kwargs)
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/srv/homeassistant/lib/python3.7/site-packages/homeassistant/components/panasonic_viera/media_player.py", line 190, in turn_off
de gen. 13 18:36:29 raspberrypi hass[26388]:     self._state = STATE_OFF
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/srv/homeassistant/lib/python3.7/site-packages/panasonic_viera/__init__.py", line 554, in turn_off
de gen. 13 18:36:29 raspberrypi hass[26388]:     self.send_key(Keys.power)
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/srv/homeassistant/lib/python3.7/site-packages/panasonic_viera/__init__.py", line 538, in send_key
de gen. 13 18:36:29 raspberrypi hass[26388]:     'X_SendKey', params)
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/srv/homeassistant/lib/python3.7/site-packages/panasonic_viera/__init__.py", line 242, in soap_request
de gen. 13 18:36:29 raspberrypi hass[26388]:     raise e # Pass to the next handler
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/srv/homeassistant/lib/python3.7/site-packages/panasonic_viera/__init__.py", line 238, in soap_request
de gen. 13 18:36:29 raspberrypi hass[26388]:     res = urlopen(req, timeout=5).read()
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/usr/lib/python3.7/urllib/request.py", line 222, in urlopen
de gen. 13 18:36:29 raspberrypi hass[26388]:     return opener.open(url, data, timeout)
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/usr/lib/python3.7/urllib/request.py", line 531, in open
de gen. 13 18:36:29 raspberrypi hass[26388]:     response = meth(req, response)
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/usr/lib/python3.7/urllib/request.py", line 641, in http_response
de gen. 13 18:36:29 raspberrypi hass[26388]:     'http', request, response, code, msg, hdrs)
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/usr/lib/python3.7/urllib/request.py", line 569, in error
de gen. 13 18:36:29 raspberrypi hass[26388]:     return self._call_chain(*args)
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/usr/lib/python3.7/urllib/request.py", line 503, in _call_chain
de gen. 13 18:36:29 raspberrypi hass[26388]:     result = func(*args)
de gen. 13 18:36:29 raspberrypi hass[26388]:   File "/usr/lib/python3.7/urllib/request.py", line 649, in http_error_default
de gen. 13 18:36:29 raspberrypi hass[26388]:     raise HTTPError(req.full_url, code, msg, hdrs, fp)
de gen. 13 18:36:29 raspberrypi hass[26388]: urllib.error.HTTPError: HTTP Error 500: Internal Server Error

but if I run the code the component is running outside homeassistant:

import panasonic_viera
rc = panasonic_viera.RemoteControl("<HOST>", app_id="BSkeeKuuwakd9Q==", encryption_key="EarvNQodKYlj5zTEIhZoXQ==")
# We can now start communicating with our TV
rc.turn_off()

everything works as expected and TV turns off.

Any knowledge why inside home assistant I get the error? It works only with the first command I run. After that any command raised the error mentioned above

PD: component is edited as expected and loads app_id and encryption_key:

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
    {
        vol.Required(CONF_HOST): cv.string,
        vol.Optional(CONF_MAC): cv.string,
        vol.Optional(
            CONF_BROADCAST_ADDRESS, default=DEFAULT_BROADCAST_ADDRESS
        ): cv.string,
        vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
        vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
        vol.Optional(CONF_APP_POWER, default=DEFAULT_APP_POWER): cv.boolean,
        vol.Optional(CONF_APP_ID): cv.string,
        vol.Optional(CONF_ENCRYPTION_KEY): cv.string
    }
)


def setup_platform(hass, config, add_entities, discovery_info=None):
    """Set up the Panasonic Viera TV platform."""
    mac = config.get(CONF_MAC)
    broadcast = config.get(CONF_BROADCAST_ADDRESS)
    name = config.get(CONF_NAME)
    port = config.get(CONF_PORT)
    app_power = config.get(CONF_APP_POWER)
    app_id = config.get(CONF_APP_ID, None)
    encryption_key = config.get(CONF_ENCRYPTION_KEY, None)

    if discovery_info:
        _LOGGER.debug("%s", discovery_info)
        name = discovery_info.get("name")
        host = discovery_info.get("host")
        port = discovery_info.get("port")
        udn = discovery_info.get("udn")
        if udn and udn.startswith("uuid:"):
            uuid = udn[len("uuid:") :]
        else:
            uuid = None
        remote = RemoteControl(host, port)
        add_entities([PanasonicVieraTVDevice(mac, name, remote, host, app_power, uuid)])
        return True

    host = config.get(CONF_HOST)
    remote = RemoteControl(host, port, app_id=app_id, encryption_key=encryption_key)

    add_entities(
        [PanasonicVieraTVDevice(mac, name, remote, host, broadcast, app_power)]
    )
    return True

Thanks,
ttecles