Resolving Home Assistant upgrade errors in custom Python Components

Resolving Home Assistant upgrade errors in custom Python Components

Upgrading to Home Assistant v0.69.0 broke some of my custom components that use the MQTT Python module. The reason for this is a small change in the module API. This post explains how to fix your custom components to work with the latest version of Home Assistant!

The error I received is shown below for searchability:

2018-07-17T09:47:48.877623459Z 2018-07-17 09:47:48 ERROR (MainThread) [homeassistant.setup] Error during setup of component mqtt_interpreter
2018-07-17T09:47:48.878074501Z Traceback (most recent call last):
2018-07-17T09:47:48.878298824Z   File "/usr/lib/python3.6/site-packages/homeassistant/setup.py", line 146, in _async_setup_component
2018-07-17T09:47:48.878375699Z     component.setup, hass, processed_config)  # type: ignore
2018-07-17T09:47:48.878439396Z   File "/usr/lib/python3.6/concurrent/futures/thread.py", line 56, in run
2018-07-17T09:47:48.878566792Z     result = self.fn(*self.args, **self.kwargs)
2018-07-17T09:47:48.879028980Z   File "/config/custom_components/mqtt_interpreter.py", line 20, in setup
2018-07-17T09:47:48.879485750Z     mqtt = loader.get_component('mqtt')
2018-07-17T09:47:48.879743979Z TypeError: get_component() missing 1 required positional argument: 'comp_or_platform'

It indicates there is a problem with the mqtt import statement.

mqtt = loader.get_component('mqtt')

Change that line to:

mqtt = hass.components.mqtt

This requires an additinal change. We no longer have to pass hass as the first parameter into our calls to mqtt.subscribe and mqtt.publish.

mqtt.subscribe(topic_string, callback_function)
mqtt.publish(topic_string, payload_string)

If you don’t update your method calls you might get a homeassistant.exceptions.HomeAssistantError: topic needs to be a string! error as shown below:

2018-07-17T09:52:03.297486025Z 2018-07-17 09:52:03 ERROR (MainThread) [homeassistant.setup] Error during setup of component mqtt_interpreter
2018-07-17T09:52:03.297672535Z Traceback (most recent call last):
2018-07-17T09:52:03.297740295Z   File "/usr/lib/python3.6/site-packages/homeassistant/setup.py", line 146, in _async_setup_component
2018-07-17T09:52:03.297805035Z     component.setup, hass, processed_config)  # type: ignore
2018-07-17T09:52:03.297866181Z   File "/usr/lib/python3.6/concurrent/futures/thread.py", line 56, in run
2018-07-17T09:52:03.298022222Z     result = self.fn(*self.args, **self.kwargs)
2018-07-17T09:52:03.298085972Z   File "/config/custom_components/mqtt_interpreter.py", line 65, in setup
2018-07-17T09:52:03.298148629Z     mqtt.subscribe(hass, topic, message_received)
2018-07-17T09:52:03.298208576Z   File "/usr/lib/python3.6/site-packages/homeassistant/components/mqtt/__init__.py", line 283, in subscribe
2018-07-17T09:52:03.298271285Z     async_subscribe(hass, topic, msg_callback, qos, encoding), hass.loop
2018-07-17T09:52:03.298331285Z   File "/usr/lib/python3.6/concurrent/futures/_base.py", line 432, in result
2018-07-17T09:52:03.298392587Z     return self.__get_result()
2018-07-17T09:52:03.298451285Z   File "/usr/lib/python3.6/concurrent/futures/_base.py", line 384, in __get_result
2018-07-17T09:52:03.298512170Z     raise self._exception
2018-07-17T09:52:03.298570868Z   File "/usr/lib/python3.6/site-packages/homeassistant/components/mqtt/__init__.py", line 273, in async_subscribe
2018-07-17T09:52:03.298633264Z     topic, msg_callback, qos, encoding)
2018-07-17T09:52:03.298692378Z   File "/usr/lib/python3.6/site-packages/homeassistant/components/mqtt/__init__.py", line 586, in async_subscribe
2018-07-17T09:52:03.298754826Z     raise HomeAssistantError("topic needs to be a string!")
2018-07-17T09:52:03.298814826Z homeassistant.exceptions.HomeAssistantError: topic needs to be a string!