diff --git a/homeassistant/components/mqtt/__init__.py b/homeassistant/components/mqtt/__init__.py index e3605cb8664..119c9b520d7 100644 --- a/homeassistant/components/mqtt/__init__.py +++ b/homeassistant/components/mqtt/__init__.py @@ -1,5 +1,6 @@ """Support for MQTT message handling.""" import asyncio +import sys from functools import partial, wraps import inspect from itertools import groupby @@ -15,6 +16,8 @@ from typing import Any, Callable, List, Optional, Union import attr import requests.certs import voluptuous as vol +import paho.mqtt.client as mqtt +from paho.mqtt.matcher import MQTTMatcher from homeassistant import config_entries from homeassistant.components import websocket_api @@ -36,6 +39,7 @@ from homeassistant.exceptions import ( ConfigEntryNotReady, ) from homeassistant.helpers import config_validation as cv, template +from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity import Entity from homeassistant.helpers.typing import ConfigType, HomeAssistantType, ServiceDataType from homeassistant.loader import bind_hass @@ -50,7 +54,12 @@ from .const import ( DEFAULT_DISCOVERY, CONF_STATE_TOPIC, ATTR_DISCOVERY_HASH, + PROTOCOL_311, + DEFAULT_QOS, ) +from .discovery import MQTT_DISCOVERY_UPDATED, clear_discovery_hash +from .models import PublishPayloadType, Message, MessageCallbackType +from .subscription import async_subscribe_topics, async_unsubscribe_topics _LOGGER = logging.getLogger(__name__) @@ -95,11 +104,9 @@ CONF_VIA_DEVICE = "via_device" CONF_DEPRECATED_VIA_HUB = "via_hub" PROTOCOL_31 = "3.1" -PROTOCOL_311 = "3.1.1" DEFAULT_PORT = 1883 DEFAULT_KEEPALIVE = 60 -DEFAULT_QOS = 0 DEFAULT_RETAIN = False DEFAULT_PROTOCOL = PROTOCOL_311 DEFAULT_DISCOVERY_PREFIX = "homeassistant" @@ -329,23 +336,9 @@ MQTT_PUBLISH_SCHEMA = vol.Schema( # pylint: disable=invalid-name -PublishPayloadType = Union[str, bytes, int, float, None] SubscribePayloadType = Union[str, bytes] # Only bytes if encoding is None -@attr.s(slots=True, frozen=True) -class Message: - """MQTT Message.""" - - topic = attr.ib(type=str) - payload = attr.ib(type=PublishPayloadType) - qos = attr.ib(type=int) - retain = attr.ib(type=bool) - - -MessageCallbackType = Callable[[Message], None] - - def _build_publish_data(topic: Any, qos: int, retain: bool) -> ServiceDataType: """Build the arguments for the publish service without the payload.""" data = {ATTR_TOPIC: topic} @@ -629,8 +622,6 @@ async def async_setup_entry(hass, entry): elif conf_tls_version == "1.0": tls_version = ssl.PROTOCOL_TLSv1 else: - import sys - # Python3.6 supports automatic negotiation of highest TLS version if sys.hexversion >= 0x03060000: tls_version = ssl.PROTOCOL_TLS # pylint: disable=no-member @@ -735,8 +726,6 @@ class MQTT: tls_version: Optional[int], ) -> None: """Initialize Home Assistant MQTT client.""" - import paho.mqtt.client as mqtt - self.hass = hass self.broker = broker self.port = port @@ -808,8 +797,6 @@ class MQTT: return CONNECTION_FAILED_RECOVERABLE if result != 0: - import paho.mqtt.client as mqtt - _LOGGER.error("Failed to connect: %s", mqtt.error_string(result)) return CONNECTION_FAILED @@ -891,8 +878,6 @@ class MQTT: Resubscribe to all topics we were subscribed to and publish birth message. """ - import paho.mqtt.client as mqtt - if result_code != mqtt.CONNACK_ACCEPTED: _LOGGER.error( "Unable to connect to the MQTT broker: %s", @@ -984,8 +969,6 @@ class MQTT: def _raise_on_error(result_code: int) -> None: """Raise error if error result.""" if result_code != 0: - import paho.mqtt.client as mqtt - raise HomeAssistantError( "Error talking to MQTT: {}".format(mqtt.error_string(result_code)) ) @@ -993,8 +976,6 @@ def _raise_on_error(result_code: int) -> None: def _match_topic(subscription: str, topic: str) -> bool: """Test if topic matches subscription.""" - from paho.mqtt.matcher import MQTTMatcher - matcher = MQTTMatcher() matcher[subscription] = True try: @@ -1028,8 +1009,6 @@ class MqttAttributes(Entity): async def _attributes_subscribe_topics(self): """(Re)Subscribe to topics.""" - from .subscription import async_subscribe_topics - attr_tpl = self._attributes_config.get(CONF_JSON_ATTRS_TEMPLATE) if attr_tpl is not None: attr_tpl.hass = self.hass @@ -1065,8 +1044,6 @@ class MqttAttributes(Entity): async def async_will_remove_from_hass(self): """Unsubscribe when removed.""" - from .subscription import async_unsubscribe_topics - self._attributes_sub_state = await async_unsubscribe_topics( self.hass, self._attributes_sub_state ) @@ -1102,7 +1079,6 @@ class MqttAvailability(Entity): async def _availability_subscribe_topics(self): """(Re)Subscribe to topics.""" - from .subscription import async_subscribe_topics @callback def availability_message_received(msg: Message) -> None: @@ -1128,8 +1104,6 @@ class MqttAvailability(Entity): async def async_will_remove_from_hass(self): """Unsubscribe when removed.""" - from .subscription import async_unsubscribe_topics - self._availability_sub_state = await async_unsubscribe_topics( self.hass, self._availability_sub_state ) @@ -1154,9 +1128,6 @@ class MqttDiscoveryUpdate(Entity): """Subscribe to discovery updates.""" await super().async_added_to_hass() - from homeassistant.helpers.dispatcher import async_dispatcher_connect - from .discovery import MQTT_DISCOVERY_UPDATED, clear_discovery_hash - @callback def discovery_callback(payload): """Handle discovery update.""" diff --git a/homeassistant/components/mqtt/config_flow.py b/homeassistant/components/mqtt/config_flow.py index d3c6ee819b5..a8a378e723c 100644 --- a/homeassistant/components/mqtt/config_flow.py +++ b/homeassistant/components/mqtt/config_flow.py @@ -3,6 +3,7 @@ from collections import OrderedDict import queue import voluptuous as vol +import paho.mqtt.client as mqtt from homeassistant import config_entries from homeassistant.const import ( @@ -125,8 +126,6 @@ class FlowHandler(config_entries.ConfigFlow): def try_connection(broker, port, username, password, protocol="3.1"): """Test if we can connect to an MQTT broker.""" - import paho.mqtt.client as mqtt - if protocol == "3.1": proto = mqtt.MQTTv31 else: diff --git a/homeassistant/components/mqtt/const.py b/homeassistant/components/mqtt/const.py index b365ee9d33e..3234bebbfc1 100644 --- a/homeassistant/components/mqtt/const.py +++ b/homeassistant/components/mqtt/const.py @@ -5,3 +5,5 @@ DEFAULT_DISCOVERY = False ATTR_DISCOVERY_HASH = "discovery_hash" CONF_STATE_TOPIC = "state_topic" +PROTOCOL_311 = "3.1.1" +DEFAULT_QOS = 0 diff --git a/homeassistant/components/mqtt/light/__init__.py b/homeassistant/components/mqtt/light/__init__.py index 688cef03467..95a850fb9e8 100644 --- a/homeassistant/components/mqtt/light/__init__.py +++ b/homeassistant/components/mqtt/light/__init__.py @@ -16,34 +16,24 @@ from homeassistant.components.mqtt.discovery import ( ) from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.typing import HomeAssistantType, ConfigType +from .schema import CONF_SCHEMA, MQTT_LIGHT_SCHEMA_SCHEMA +from .schema_basic import PLATFORM_SCHEMA_BASIC, async_setup_entity_basic +from .schema_json import PLATFORM_SCHEMA_JSON, async_setup_entity_json +from .schema_template import PLATFORM_SCHEMA_TEMPLATE, async_setup_entity_template _LOGGER = logging.getLogger(__name__) -CONF_SCHEMA = "schema" - def validate_mqtt_light(value): """Validate MQTT light schema.""" - from . import schema_basic - from . import schema_json - from . import schema_template - schemas = { - "basic": schema_basic.PLATFORM_SCHEMA_BASIC, - "json": schema_json.PLATFORM_SCHEMA_JSON, - "template": schema_template.PLATFORM_SCHEMA_TEMPLATE, + "basic": PLATFORM_SCHEMA_BASIC, + "json": PLATFORM_SCHEMA_JSON, + "template": PLATFORM_SCHEMA_TEMPLATE, } return schemas[value[CONF_SCHEMA]](value) -MQTT_LIGHT_SCHEMA_SCHEMA = vol.Schema( - { - vol.Optional(CONF_SCHEMA, default="basic"): vol.All( - vol.Lower, vol.Any("basic", "json", "template") - ) - } -) - PLATFORM_SCHEMA = vol.All( MQTT_LIGHT_SCHEMA_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA), validate_mqtt_light ) @@ -81,14 +71,10 @@ async def _async_setup_entity( config, async_add_entities, config_entry=None, discovery_hash=None ): """Set up a MQTT Light.""" - from . import schema_basic - from . import schema_json - from . import schema_template - setup_entity = { - "basic": schema_basic.async_setup_entity_basic, - "json": schema_json.async_setup_entity_json, - "template": schema_template.async_setup_entity_template, + "basic": async_setup_entity_basic, + "json": async_setup_entity_json, + "template": async_setup_entity_template, } await setup_entity[config[CONF_SCHEMA]]( config, async_add_entities, config_entry, discovery_hash diff --git a/homeassistant/components/mqtt/light/schema.py b/homeassistant/components/mqtt/light/schema.py new file mode 100644 index 00000000000..a7ab5e986a7 --- /dev/null +++ b/homeassistant/components/mqtt/light/schema.py @@ -0,0 +1,12 @@ +"""Shared schema code.""" +import voluptuous as vol + +CONF_SCHEMA = "schema" + +MQTT_LIGHT_SCHEMA_SCHEMA = vol.Schema( + { + vol.Optional(CONF_SCHEMA, default="basic"): vol.All( + vol.Lower, vol.Any("basic", "json", "template") + ) + } +) diff --git a/homeassistant/components/mqtt/light/schema_basic.py b/homeassistant/components/mqtt/light/schema_basic.py index 216762f9b2b..829809dd9c3 100644 --- a/homeassistant/components/mqtt/light/schema_basic.py +++ b/homeassistant/components/mqtt/light/schema_basic.py @@ -56,7 +56,7 @@ from homeassistant.helpers.restore_state import RestoreEntity import homeassistant.helpers.config_validation as cv import homeassistant.util.color as color_util -from . import MQTT_LIGHT_SCHEMA_SCHEMA +from .schema import MQTT_LIGHT_SCHEMA_SCHEMA _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/mqtt/light/schema_json.py b/homeassistant/components/mqtt/light/schema_json.py index 1e8114a48e6..c4de1edbc3c 100644 --- a/homeassistant/components/mqtt/light/schema_json.py +++ b/homeassistant/components/mqtt/light/schema_json.py @@ -59,7 +59,7 @@ from homeassistant.helpers.restore_state import RestoreEntity from homeassistant.helpers.typing import ConfigType import homeassistant.util.color as color_util -from . import MQTT_LIGHT_SCHEMA_SCHEMA +from .schema import MQTT_LIGHT_SCHEMA_SCHEMA from .schema_basic import CONF_BRIGHTNESS_SCALE _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/mqtt/light/schema_template.py b/homeassistant/components/mqtt/light/schema_template.py index 410eff6143f..c80ab2f95a7 100644 --- a/homeassistant/components/mqtt/light/schema_template.py +++ b/homeassistant/components/mqtt/light/schema_template.py @@ -49,7 +49,7 @@ import homeassistant.helpers.config_validation as cv import homeassistant.util.color as color_util from homeassistant.helpers.restore_state import RestoreEntity -from . import MQTT_LIGHT_SCHEMA_SCHEMA +from .schema import MQTT_LIGHT_SCHEMA_SCHEMA _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/mqtt/models.py b/homeassistant/components/mqtt/models.py new file mode 100644 index 00000000000..5f014aadd08 --- /dev/null +++ b/homeassistant/components/mqtt/models.py @@ -0,0 +1,20 @@ +"""Modesl used by multiple MQTT modules.""" +from typing import Union, Callable + +import attr + +# pylint: disable=invalid-name +PublishPayloadType = Union[str, bytes, int, float, None] + + +@attr.s(slots=True, frozen=True) +class Message: + """MQTT Message.""" + + topic = attr.ib(type=str) + payload = attr.ib(type=PublishPayloadType) + qos = attr.ib(type=int) + retain = attr.ib(type=bool) + + +MessageCallbackType = Callable[[Message], None] diff --git a/homeassistant/components/mqtt/server.py b/homeassistant/components/mqtt/server.py index 2c70d18d772..f5d369a75c7 100644 --- a/homeassistant/components/mqtt/server.py +++ b/homeassistant/components/mqtt/server.py @@ -4,10 +4,14 @@ import logging import tempfile import voluptuous as vol +from hbmqtt.broker import Broker, BrokerException +from passlib.apps import custom_app_context from homeassistant.const import EVENT_HOMEASSISTANT_STOP import homeassistant.helpers.config_validation as cv +from .const import PROTOCOL_311 + _LOGGER = logging.getLogger(__name__) # None allows custom config to be created through generate_config @@ -33,8 +37,6 @@ def async_start(hass, password, server_config): This method is a coroutine. """ - from hbmqtt.broker import Broker, BrokerException - passwd = tempfile.NamedTemporaryFile() gen_server_config, client_config = generate_config(hass, passwd, password) @@ -63,8 +65,6 @@ def async_start(hass, password, server_config): def generate_config(hass, passwd, password): """Generate a configuration based on current Home Assistant instance.""" - from . import PROTOCOL_311 - config = { "listeners": { "default": { @@ -83,8 +83,6 @@ def generate_config(hass, passwd, password): username = "homeassistant" # Encrypt with what hbmqtt uses to verify - from passlib.apps import custom_app_context - passwd.write( "homeassistant:{}\n".format(custom_app_context.encrypt(password)).encode( "utf-8" diff --git a/homeassistant/components/mqtt/subscription.py b/homeassistant/components/mqtt/subscription.py index d85399b5dcb..be48a769a23 100644 --- a/homeassistant/components/mqtt/subscription.py +++ b/homeassistant/components/mqtt/subscription.py @@ -8,7 +8,8 @@ from homeassistant.components import mqtt from homeassistant.helpers.typing import HomeAssistantType from homeassistant.loader import bind_hass -from . import DEFAULT_QOS, MessageCallbackType +from .const import DEFAULT_QOS +from .models import MessageCallbackType _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/mqtt/vacuum/__init__.py b/homeassistant/components/mqtt/vacuum/__init__.py index 5fdaa744ca9..12fd4c51693 100644 --- a/homeassistant/components/mqtt/vacuum/__init__.py +++ b/homeassistant/components/mqtt/vacuum/__init__.py @@ -15,51 +15,19 @@ from homeassistant.components.mqtt.discovery import ( clear_discovery_hash, ) from homeassistant.helpers.dispatcher import async_dispatcher_connect +from .schema import CONF_SCHEMA, LEGACY, STATE, MQTT_VACUUM_SCHEMA +from .schema_legacy import PLATFORM_SCHEMA_LEGACY, async_setup_entity_legacy +from .schema_state import PLATFORM_SCHEMA_STATE, async_setup_entity_state _LOGGER = logging.getLogger(__name__) -CONF_SCHEMA = "schema" -LEGACY = "legacy" -STATE = "state" - def validate_mqtt_vacuum(value): """Validate MQTT vacuum schema.""" - from . import schema_legacy - from . import schema_state - - schemas = { - LEGACY: schema_legacy.PLATFORM_SCHEMA_LEGACY, - STATE: schema_state.PLATFORM_SCHEMA_STATE, - } + schemas = {LEGACY: PLATFORM_SCHEMA_LEGACY, STATE: PLATFORM_SCHEMA_STATE} return schemas[value[CONF_SCHEMA]](value) -def services_to_strings(services, service_to_string): - """Convert SUPPORT_* service bitmask to list of service strings.""" - strings = [] - for service in service_to_string: - if service & services: - strings.append(service_to_string[service]) - return strings - - -def strings_to_services(strings, string_to_service): - """Convert service strings to SUPPORT_* service bitmask.""" - services = 0 - for string in strings: - services |= string_to_service[string] - return services - - -MQTT_VACUUM_SCHEMA = vol.Schema( - { - vol.Optional(CONF_SCHEMA, default=LEGACY): vol.All( - vol.Lower, vol.Any(LEGACY, STATE) - ) - } -) - PLATFORM_SCHEMA = vol.All( MQTT_VACUUM_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA), validate_mqtt_vacuum ) @@ -95,13 +63,7 @@ async def _async_setup_entity( config, async_add_entities, config_entry, discovery_hash=None ): """Set up the MQTT vacuum.""" - from . import schema_legacy - from . import schema_state - - setup_entity = { - LEGACY: schema_legacy.async_setup_entity_legacy, - STATE: schema_state.async_setup_entity_state, - } + setup_entity = {LEGACY: async_setup_entity_legacy, STATE: async_setup_entity_state} await setup_entity[config[CONF_SCHEMA]]( config, async_add_entities, config_entry, discovery_hash ) diff --git a/homeassistant/components/mqtt/vacuum/schema.py b/homeassistant/components/mqtt/vacuum/schema.py new file mode 100644 index 00000000000..949b5cede9c --- /dev/null +++ b/homeassistant/components/mqtt/vacuum/schema.py @@ -0,0 +1,31 @@ +"""Shared schema code.""" +import voluptuous as vol + +CONF_SCHEMA = "schema" +LEGACY = "legacy" +STATE = "state" + +MQTT_VACUUM_SCHEMA = vol.Schema( + { + vol.Optional(CONF_SCHEMA, default=LEGACY): vol.All( + vol.Lower, vol.Any(LEGACY, STATE) + ) + } +) + + +def services_to_strings(services, service_to_string): + """Convert SUPPORT_* service bitmask to list of service strings.""" + strings = [] + for service in service_to_string: + if service & services: + strings.append(service_to_string[service]) + return strings + + +def strings_to_services(strings, string_to_service): + """Convert service strings to SUPPORT_* service bitmask.""" + services = 0 + for string in strings: + services |= string_to_service[string] + return services diff --git a/homeassistant/components/mqtt/vacuum/schema_legacy.py b/homeassistant/components/mqtt/vacuum/schema_legacy.py index f2fa8f8da66..d770cfbb7f8 100644 --- a/homeassistant/components/mqtt/vacuum/schema_legacy.py +++ b/homeassistant/components/mqtt/vacuum/schema_legacy.py @@ -33,7 +33,7 @@ from homeassistant.components.mqtt import ( subscription, ) -from . import MQTT_VACUUM_SCHEMA, services_to_strings, strings_to_services +from .schema import MQTT_VACUUM_SCHEMA, services_to_strings, strings_to_services _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/mqtt/vacuum/schema_state.py b/homeassistant/components/mqtt/vacuum/schema_state.py index 1ab415aef7b..40b3eeb752c 100644 --- a/homeassistant/components/mqtt/vacuum/schema_state.py +++ b/homeassistant/components/mqtt/vacuum/schema_state.py @@ -46,7 +46,7 @@ from homeassistant.components.mqtt import ( CONF_QOS, ) -from . import MQTT_VACUUM_SCHEMA, services_to_strings, strings_to_services +from .schema import MQTT_VACUUM_SCHEMA, services_to_strings, strings_to_services _LOGGER = logging.getLogger(__name__) diff --git a/tests/common.py b/tests/common.py index 40e02842146..5532e6ccb5c 100644 --- a/tests/common.py +++ b/tests/common.py @@ -27,6 +27,7 @@ from homeassistant.auth import ( ) from homeassistant.auth.permissions import system_policies from homeassistant.components import mqtt, recorder +from homeassistant.components.mqtt.models import Message from homeassistant.config import async_process_component_config from homeassistant.const import ( ATTR_DISCOVERED, @@ -271,7 +272,7 @@ def async_fire_mqtt_message(hass, topic, payload, qos=0, retain=False): """Fire the MQTT message.""" if isinstance(payload, str): payload = payload.encode("utf-8") - msg = mqtt.Message(topic, payload, qos, retain) + msg = Message(topic, payload, qos, retain) hass.data["mqtt"]._mqtt_handle_message(msg) diff --git a/tests/components/mqtt/test_legacy_vacuum.py b/tests/components/mqtt/test_legacy_vacuum.py index add27bebdeb..c35740407c7 100644 --- a/tests/components/mqtt/test_legacy_vacuum.py +++ b/tests/components/mqtt/test_legacy_vacuum.py @@ -5,10 +5,8 @@ import json from homeassistant.components import mqtt, vacuum from homeassistant.components.mqtt import CONF_COMMAND_TOPIC from homeassistant.components.mqtt.discovery import async_start -from homeassistant.components.mqtt.vacuum import ( - schema_legacy as mqttvacuum, - services_to_strings, -) +from homeassistant.components.mqtt.vacuum import schema_legacy as mqttvacuum +from homeassistant.components.mqtt.vacuum.schema import services_to_strings from homeassistant.components.mqtt.vacuum.schema_legacy import ( ALL_SERVICES, SERVICE_TO_STRING, @@ -80,7 +78,7 @@ async def test_default_supported_features(hass, mqtt_mock): async def test_all_commands(hass, mqtt_mock): """Test simple commands to the vacuum.""" config = deepcopy(DEFAULT_CONFIG) - config[mqttvacuum.CONF_SUPPORTED_FEATURES] = mqttvacuum.services_to_strings( + config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings( ALL_SERVICES, SERVICE_TO_STRING ) @@ -221,7 +219,7 @@ async def test_attributes_without_supported_features(hass, mqtt_mock): async def test_status(hass, mqtt_mock): """Test status updates from the vacuum.""" config = deepcopy(DEFAULT_CONFIG) - config[mqttvacuum.CONF_SUPPORTED_FEATURES] = mqttvacuum.services_to_strings( + config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings( ALL_SERVICES, SERVICE_TO_STRING ) @@ -260,7 +258,7 @@ async def test_status(hass, mqtt_mock): async def test_status_battery(hass, mqtt_mock): """Test status updates from the vacuum.""" config = deepcopy(DEFAULT_CONFIG) - config[mqttvacuum.CONF_SUPPORTED_FEATURES] = mqttvacuum.services_to_strings( + config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings( ALL_SERVICES, SERVICE_TO_STRING ) @@ -277,7 +275,7 @@ async def test_status_battery(hass, mqtt_mock): async def test_status_cleaning(hass, mqtt_mock): """Test status updates from the vacuum.""" config = deepcopy(DEFAULT_CONFIG) - config[mqttvacuum.CONF_SUPPORTED_FEATURES] = mqttvacuum.services_to_strings( + config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings( ALL_SERVICES, SERVICE_TO_STRING ) @@ -294,7 +292,7 @@ async def test_status_cleaning(hass, mqtt_mock): async def test_status_docked(hass, mqtt_mock): """Test status updates from the vacuum.""" config = deepcopy(DEFAULT_CONFIG) - config[mqttvacuum.CONF_SUPPORTED_FEATURES] = mqttvacuum.services_to_strings( + config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings( ALL_SERVICES, SERVICE_TO_STRING ) @@ -311,7 +309,7 @@ async def test_status_docked(hass, mqtt_mock): async def test_status_charging(hass, mqtt_mock): """Test status updates from the vacuum.""" config = deepcopy(DEFAULT_CONFIG) - config[mqttvacuum.CONF_SUPPORTED_FEATURES] = mqttvacuum.services_to_strings( + config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings( ALL_SERVICES, SERVICE_TO_STRING ) @@ -328,7 +326,7 @@ async def test_status_charging(hass, mqtt_mock): async def test_status_fan_speed(hass, mqtt_mock): """Test status updates from the vacuum.""" config = deepcopy(DEFAULT_CONFIG) - config[mqttvacuum.CONF_SUPPORTED_FEATURES] = mqttvacuum.services_to_strings( + config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings( ALL_SERVICES, SERVICE_TO_STRING ) @@ -345,7 +343,7 @@ async def test_status_fan_speed(hass, mqtt_mock): async def test_status_error(hass, mqtt_mock): """Test status updates from the vacuum.""" config = deepcopy(DEFAULT_CONFIG) - config[mqttvacuum.CONF_SUPPORTED_FEATURES] = mqttvacuum.services_to_strings( + config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings( ALL_SERVICES, SERVICE_TO_STRING ) @@ -371,7 +369,7 @@ async def test_battery_template(hass, mqtt_mock): config = deepcopy(DEFAULT_CONFIG) config.update( { - mqttvacuum.CONF_SUPPORTED_FEATURES: mqttvacuum.services_to_strings( + mqttvacuum.CONF_SUPPORTED_FEATURES: services_to_strings( ALL_SERVICES, SERVICE_TO_STRING ), mqttvacuum.CONF_BATTERY_LEVEL_TOPIC: "retroroomba/battery_level", @@ -390,7 +388,7 @@ async def test_battery_template(hass, mqtt_mock): async def test_status_invalid_json(hass, mqtt_mock): """Test to make sure nothing breaks if the vacuum sends bad JSON.""" config = deepcopy(DEFAULT_CONFIG) - config[mqttvacuum.CONF_SUPPORTED_FEATURES] = mqttvacuum.services_to_strings( + config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings( ALL_SERVICES, SERVICE_TO_STRING ) diff --git a/tests/components/mqtt/test_server.py b/tests/components/mqtt/test_server.py index 3627c95040e..71dff7ef3ac 100644 --- a/tests/components/mqtt/test_server.py +++ b/tests/components/mqtt/test_server.py @@ -19,9 +19,13 @@ class TestMQTT: """Stop everything that was started.""" self.hass.stop() - @patch("passlib.apps.custom_app_context", Mock(return_value="")) + @patch( + "homeassistant.components.mqtt.server.custom_app_context", Mock(return_value="") + ) @patch("tempfile.NamedTemporaryFile", Mock(return_value=MagicMock())) - @patch("hbmqtt.broker.Broker", Mock(return_value=MagicMock())) + @patch( + "homeassistant.components.mqtt.server.Broker", Mock(return_value=MagicMock()) + ) @patch("hbmqtt.broker.Broker.start", Mock(return_value=mock_coro())) @patch("homeassistant.components.mqtt.MQTT") def test_creating_config_with_pass_and_no_http_pass(self, mock_mqtt): @@ -41,9 +45,13 @@ class TestMQTT: assert mock_mqtt.mock_calls[1][2]["username"] == "homeassistant" assert mock_mqtt.mock_calls[1][2]["password"] == password - @patch("passlib.apps.custom_app_context", Mock(return_value="")) + @patch( + "homeassistant.components.mqtt.server.custom_app_context", Mock(return_value="") + ) @patch("tempfile.NamedTemporaryFile", Mock(return_value=MagicMock())) - @patch("hbmqtt.broker.Broker", Mock(return_value=MagicMock())) + @patch( + "homeassistant.components.mqtt.server.Broker", Mock(return_value=MagicMock()) + ) @patch("hbmqtt.broker.Broker.start", Mock(return_value=mock_coro())) @patch("homeassistant.components.mqtt.MQTT") def test_creating_config_with_pass_and_http_pass(self, mock_mqtt): diff --git a/tests/components/mqtt/test_state_vacuum.py b/tests/components/mqtt/test_state_vacuum.py index fe100bdcb6e..572c3b05752 100644 --- a/tests/components/mqtt/test_state_vacuum.py +++ b/tests/components/mqtt/test_state_vacuum.py @@ -5,11 +5,8 @@ import json from homeassistant.components import mqtt, vacuum from homeassistant.components.mqtt import CONF_COMMAND_TOPIC, CONF_STATE_TOPIC from homeassistant.components.mqtt.discovery import async_start -from homeassistant.components.mqtt.vacuum import ( - CONF_SCHEMA, - schema_state as mqttvacuum, - services_to_strings, -) +from homeassistant.components.mqtt.vacuum import CONF_SCHEMA, schema_state as mqttvacuum +from homeassistant.components.mqtt.vacuum.schema import services_to_strings from homeassistant.components.mqtt.vacuum.schema_state import SERVICE_TO_STRING from homeassistant.components.vacuum import ( ATTR_BATTERY_ICON, @@ -259,7 +256,7 @@ async def test_no_fan_vacuum(hass, mqtt_mock): async def test_status_invalid_json(hass, mqtt_mock): """Test to make sure nothing breaks if the vacuum sends bad JSON.""" config = deepcopy(DEFAULT_CONFIG) - config[mqttvacuum.CONF_SUPPORTED_FEATURES] = mqttvacuum.services_to_strings( + config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings( mqttvacuum.ALL_SERVICES, SERVICE_TO_STRING )