Skip to content
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
41963ef
Processing yaml config through entry setup
jbouwh May 11, 2022
b95abc3
Setup all platforms
jbouwh May 11, 2022
fea7183
Update homeassistant/components/mqtt/__init__.py
jbouwh May 12, 2022
f5f1ff9
adjust mock_mqtt - reference config from cache
jbouwh May 12, 2022
a7da58c
Fix test config entry override
jbouwh May 12, 2022
84b30ed
Add tests yaml setup
jbouwh May 13, 2022
0dacd33
additional tests
jbouwh May 13, 2022
91ada97
Introduce PLATFORM_SCHEMA_MODERN
jbouwh May 16, 2022
5acbec1
recover temporary MQTT_BASE_PLATFORM_SCHEMA
jbouwh May 16, 2022
6d56d48
Allow extra key in light base schema, restore test
jbouwh May 16, 2022
4447887
Fix test for exception on platform key
jbouwh May 16, 2022
95e316c
One deprecation message per platform
jbouwh May 17, 2022
4b7855a
Remove deprecation checks from modern schema
jbouwh May 17, 2022
25caa55
Update homeassistant/components/mqtt/fan.py
jbouwh May 18, 2022
b9c1cbf
Update homeassistant/components/mqtt/fan.py
jbouwh May 18, 2022
a2aeb35
Update homeassistant/components/mqtt/light/__init__.py
jbouwh May 18, 2022
8a5c436
Update homeassistant/components/mqtt/light/__init__.py
jbouwh May 18, 2022
f2b3763
Update homeassistant/components/mqtt/light/schema_json.py
jbouwh May 18, 2022
183b032
Update homeassistant/components/mqtt/light/schema_template.py
jbouwh May 18, 2022
aac9ba2
Update homeassistant/components/mqtt/mixins.py
jbouwh May 18, 2022
4a5ccf8
rename validate_modern_schema
jbouwh May 18, 2022
a48ebbb
Do not fail platform if a single config is broken
jbouwh May 18, 2022
7d4cc03
Update homeassistant/components/mqtt/__init__.py
jbouwh May 18, 2022
17bf635
Fix tests on asserting log
jbouwh May 18, 2022
717aeae
Update log. Make helper transparant, remove patch
jbouwh May 19, 2022
911c934
Perform parallel processing
jbouwh May 19, 2022
b948ad2
Update tests/components/mqtt/test_init.py
jbouwh May 19, 2022
52bcc23
Apply suggestions from code review
jbouwh May 19, 2022
c08eed5
Update homeassistant/components/mqtt/mixins.py
jbouwh May 19, 2022
94e1c60
black
jbouwh May 19, 2022
a9f7ae8
Fix tests and add #new_format anchor
jbouwh May 19, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 43 additions & 4 deletions homeassistant/components/mqtt/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@
CONF_TLS_VERSION,
CONF_TOPIC,
CONF_WILL_MESSAGE,
CONFIG_ENTRY_IS_SETUP,
DATA_CONFIG_ENTRY_LOCK,
DATA_MQTT_CONFIG,
DATA_MQTT_RELOAD_NEEDED,
DEFAULT_BIRTH,
Expand Down Expand Up @@ -171,7 +173,6 @@
Platform.VACUUM,
]


CLIENT_KEY_AUTH_MSG = (
"client_key and client_cert must both be present in "
"the MQTT broker configuration"
Expand All @@ -187,7 +188,14 @@
required=True,
)

CONFIG_SCHEMA_BASE = vol.Schema(
PLATFORM_CONFIG_SCHEMA_BASE = vol.Schema(
{
vol.Optional(Platform.FAN.value): cv.ensure_list,
vol.Optional(Platform.LIGHT.value): cv.ensure_list,
}
)

CONFIG_SCHEMA_BASE = PLATFORM_CONFIG_SCHEMA_BASE.extend(
{
vol.Optional(CONF_CLIENT_ID): cv.string,
vol.Optional(CONF_KEEPALIVE, default=DEFAULT_KEEPALIVE): vol.All(
Expand Down Expand Up @@ -253,18 +261,36 @@
vol.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): cv.string,
}

MQTT_BASE_SCHEMA = vol.Schema(SCHEMA_BASE)

# Will be removed when all platforms support a modern platform schema
MQTT_BASE_PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend(SCHEMA_BASE)
# Will be removed when all platforms support a modern platform schema
MQTT_RO_PLATFORM_SCHEMA = MQTT_BASE_PLATFORM_SCHEMA.extend(
{
vol.Required(CONF_STATE_TOPIC): valid_subscribe_topic,
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
}
)
# Will be removed when all platforms support a modern platform schema
MQTT_RW_PLATFORM_SCHEMA = MQTT_BASE_PLATFORM_SCHEMA.extend(
{
vol.Required(CONF_COMMAND_TOPIC): valid_publish_topic,
vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean,
vol.Optional(CONF_STATE_TOPIC): valid_subscribe_topic,
}
)

# Sensor type platforms subscribe to MQTT events
MQTT_RO_PLATFORM_SCHEMA = MQTT_BASE_PLATFORM_SCHEMA.extend(
MQTT_RO_SCHEMA = MQTT_BASE_SCHEMA.extend(
{
vol.Required(CONF_STATE_TOPIC): valid_subscribe_topic,
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
}
)

# Switch type platforms publish to MQTT and may subscribe
MQTT_RW_PLATFORM_SCHEMA = MQTT_BASE_PLATFORM_SCHEMA.extend(
MQTT_RW_SCHEMA = MQTT_BASE_SCHEMA.extend(
{
vol.Required(CONF_COMMAND_TOPIC): valid_publish_topic,
vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean,
Expand Down Expand Up @@ -774,6 +800,19 @@ async def finish_dump(_):
),
)

# setup platforms and discovery
hass.data[DATA_CONFIG_ENTRY_LOCK] = asyncio.Lock()
Comment thread
jbouwh marked this conversation as resolved.
hass.data[CONFIG_ENTRY_IS_SETUP] = set()

async with hass.data[DATA_CONFIG_ENTRY_LOCK]:
Comment thread
jbouwh marked this conversation as resolved.
Outdated
for component in PLATFORMS:
config_entries_key = f"{component}.mqtt"
if config_entries_key not in hass.data[CONFIG_ENTRY_IS_SETUP]:
hass.data[CONFIG_ENTRY_IS_SETUP].add(config_entries_key)
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(entry, component)
)

if conf.get(CONF_DISCOVERY):
await _async_setup_discovery(hass, conf, entry)

Expand Down
2 changes: 2 additions & 0 deletions homeassistant/components/mqtt/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
CONF_TLS_INSECURE = "tls_insecure"
CONF_TLS_VERSION = "tls_version"

CONFIG_ENTRY_IS_SETUP = "mqtt_config_entry_is_setup"
DATA_CONFIG_ENTRY_LOCK = "mqtt_config_entry_lock"
DATA_MQTT_CONFIG = "mqtt_config"
DATA_MQTT_RELOAD_NEEDED = "mqtt_reload_needed"

Expand Down
6 changes: 2 additions & 4 deletions homeassistant/components/mqtt/discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
ATTR_DISCOVERY_TOPIC,
CONF_AVAILABILITY,
CONF_TOPIC,
CONFIG_ENTRY_IS_SETUP,
DATA_CONFIG_ENTRY_LOCK,
DOMAIN,
)

Expand Down Expand Up @@ -62,8 +64,6 @@

ALREADY_DISCOVERED = "mqtt_discovered_components"
PENDING_DISCOVERED = "mqtt_pending_components"
CONFIG_ENTRY_IS_SETUP = "mqtt_config_entry_is_setup"
DATA_CONFIG_ENTRY_LOCK = "mqtt_config_entry_lock"
DATA_CONFIG_FLOW_LOCK = "mqtt_discovery_config_flow_lock"
DISCOVERY_UNSUBSCRIBE = "mqtt_discovery_unsubscribe"
INTEGRATION_UNSUBSCRIBE = "mqtt_integration_discovery_unsubscribe"
Expand Down Expand Up @@ -258,9 +258,7 @@ async def discovery_done(_):
hass, MQTT_DISCOVERY_DONE.format(discovery_hash), None
)

hass.data[DATA_CONFIG_ENTRY_LOCK] = asyncio.Lock()
hass.data[DATA_CONFIG_FLOW_LOCK] = asyncio.Lock()
hass.data[CONFIG_ENTRY_IS_SETUP] = set()

hass.data[ALREADY_DISCOVERED] = {}
hass.data[PENDING_DISCOVERED] = {}
Expand Down
23 changes: 20 additions & 3 deletions homeassistant/components/mqtt/fan.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,10 @@
from .mixins import (
MQTT_ENTITY_COMMON_SCHEMA,
MqttEntity,
async_get_platform_config_from_yaml,
async_setup_entry_helper,
async_setup_platform_helper,
warn_for_legacy_schema,
)

CONF_PERCENTAGE_STATE_TOPIC = "percentage_state_topic"
Expand Down Expand Up @@ -122,7 +124,7 @@ def valid_preset_mode_configuration(config):
return config


_PLATFORM_SCHEMA_BASE = mqtt.MQTT_RW_PLATFORM_SCHEMA.extend(
_PLATFORM_SCHEMA_BASE = mqtt.MQTT_RW_SCHEMA.extend(
{
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean,
Expand Down Expand Up @@ -172,7 +174,15 @@ def valid_preset_mode_configuration(config):
}
).extend(MQTT_ENTITY_COMMON_SCHEMA.schema)

# Configuring MQTT Fans under the fan platform key is deprecated in HA Core 2022.6
PLATFORM_SCHEMA = vol.All(
cv.PLATFORM_SCHEMA.extend(_PLATFORM_SCHEMA_BASE.schema),
valid_speed_range_configuration,
valid_preset_mode_configuration,
warn_for_legacy_schema(fan.DOMAIN),
)

PLATFORM_SCHEMA_MODERN = vol.All(
_PLATFORM_SCHEMA_BASE,
valid_speed_range_configuration,
valid_preset_mode_configuration,
Expand Down Expand Up @@ -201,7 +211,8 @@ async def async_setup_platform(
async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None:
"""Set up MQTT fan through configuration.yaml."""
"""Set up MQTT fans configured under the fan platform key (deprecated)."""
# Deprecated in HA Core 2022.6
await async_setup_platform_helper(
hass, fan.DOMAIN, config, async_add_entities, _async_setup_entity
)
Expand All @@ -212,7 +223,13 @@ async def async_setup_entry(
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up MQTT fan dynamically through MQTT discovery."""
"""Set up MQTT fan through configuration.yaml and dynamically through MQTT discovery."""
# load and initialize platform config from configuration.yaml
for config in await async_get_platform_config_from_yaml(
hass, fan.DOMAIN, PLATFORM_SCHEMA_MODERN
):
await _async_setup_entity(hass, async_add_entities, config, config_entry)
Comment thread
jbouwh marked this conversation as resolved.
Outdated
# setup for discovery
setup = functools.partial(
_async_setup_entity, hass, async_add_entities, config_entry=config_entry
)
Expand Down
52 changes: 45 additions & 7 deletions homeassistant/components/mqtt/light/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,31 +6,41 @@
import voluptuous as vol

from homeassistant.components import light
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType

from ..mixins import async_setup_entry_helper, async_setup_platform_helper
from ..mixins import (
async_get_platform_config_from_yaml,
async_setup_entry_helper,
async_setup_platform_helper,
warn_for_legacy_schema,
)
from .schema import CONF_SCHEMA, MQTT_LIGHT_SCHEMA_SCHEMA
from .schema_basic import (
DISCOVERY_SCHEMA_BASIC,
PLATFORM_SCHEMA_BASIC,
PLATFORM_SCHEMA_MODERN_BASIC,
async_setup_entity_basic,
)
from .schema_json import (
DISCOVERY_SCHEMA_JSON,
PLATFORM_SCHEMA_JSON,
PLATFORM_SCHEMA_MODERN_JSON,
async_setup_entity_json,
)
from .schema_template import (
DISCOVERY_SCHEMA_TEMPLATE,
PLATFORM_SCHEMA_MODERN_TEMPLATE,
PLATFORM_SCHEMA_TEMPLATE,
async_setup_entity_template,
)


def validate_mqtt_light_discovery(value):
"""Validate MQTT light schema."""
"""Validate MQTT light schema for."""
schemas = {
"basic": DISCOVERY_SCHEMA_BASIC,
"json": DISCOVERY_SCHEMA_JSON,
Expand All @@ -49,14 +59,31 @@ def validate_mqtt_light(value):
return schemas[value[CONF_SCHEMA]](value)


def validate_mqtt_light_modern(value):
"""Validate MQTT light schema."""
schemas = {
"basic": PLATFORM_SCHEMA_MODERN_BASIC,
"json": PLATFORM_SCHEMA_MODERN_JSON,
"template": PLATFORM_SCHEMA_MODERN_TEMPLATE,
}
return schemas[value[CONF_SCHEMA]](value)


DISCOVERY_SCHEMA = vol.All(
MQTT_LIGHT_SCHEMA_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA),
validate_mqtt_light_discovery,
)


# Configuring MQTT Lights under the light platform key is deprecated in HA Core 2022.6
PLATFORM_SCHEMA = vol.All(
MQTT_LIGHT_SCHEMA_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA), validate_mqtt_light
cv.PLATFORM_SCHEMA.extend(MQTT_LIGHT_SCHEMA_SCHEMA.schema, extra=vol.ALLOW_EXTRA),
validate_mqtt_light,
warn_for_legacy_schema(light.DOMAIN),
)

PLATFORM_SCHEMA_MODERN = vol.All(
MQTT_LIGHT_SCHEMA_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA),
validate_mqtt_light_modern,
)


Expand All @@ -66,14 +93,25 @@ async def async_setup_platform(
async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None:
"""Set up MQTT light through configuration.yaml."""
"""Set up MQTT light through configuration.yaml (deprecated)."""
# Deprecated in HA Core 2022.6
await async_setup_platform_helper(
hass, light.DOMAIN, config, async_add_entities, _async_setup_entity
)


async def async_setup_entry(hass, config_entry, async_add_entities):
"""Set up MQTT light dynamically through MQTT discovery."""
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up MQTT lights configured under the light platform key (deprecated)."""
# load and initialize platform config from configuration.yaml
for config in await async_get_platform_config_from_yaml(
hass, light.DOMAIN, PLATFORM_SCHEMA_MODERN
):
await _async_setup_entity(hass, async_add_entities, config, config_entry)
# setup for discovery
setup = functools.partial(
_async_setup_entity, hass, async_add_entities, config_entry=config_entry
)
Expand Down
7 changes: 5 additions & 2 deletions homeassistant/components/mqtt/light/schema_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@
]

_PLATFORM_SCHEMA_BASE = (
mqtt.MQTT_RW_PLATFORM_SCHEMA.extend(
mqtt.MQTT_RW_SCHEMA.extend(
{
vol.Optional(CONF_BRIGHTNESS_COMMAND_TEMPLATE): cv.template,
vol.Optional(CONF_BRIGHTNESS_COMMAND_TOPIC): mqtt.valid_publish_topic,
Expand Down Expand Up @@ -220,13 +220,14 @@
.extend(MQTT_LIGHT_SCHEMA_SCHEMA.schema)
)

# The use of PLATFORM_SCHEMA is deprecated in HA Core 2022.6

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# The use of PLATFORM_SCHEMA is deprecated in HA Core 2022.6
# Configuring MQTT Lights under the light platform key is deprecated in HA Core 2022.6

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bump.

PLATFORM_SCHEMA_BASIC = vol.All(
# CONF_WHITE_VALUE_* is deprecated, support will be removed in release 2022.9
cv.deprecated(CONF_WHITE_VALUE_COMMAND_TOPIC),
cv.deprecated(CONF_WHITE_VALUE_SCALE),
cv.deprecated(CONF_WHITE_VALUE_STATE_TOPIC),
cv.deprecated(CONF_WHITE_VALUE_TEMPLATE),
_PLATFORM_SCHEMA_BASE,
cv.PLATFORM_SCHEMA.extend(_PLATFORM_SCHEMA_BASE.schema),
)

DISCOVERY_SCHEMA_BASIC = vol.All(
Expand All @@ -240,6 +241,8 @@
_PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA),
)

PLATFORM_SCHEMA_MODERN_BASIC = _PLATFORM_SCHEMA_BASE


async def async_setup_entity_basic(
hass, config, async_add_entities, config_entry, discovery_data=None
Expand Down
10 changes: 8 additions & 2 deletions homeassistant/components/mqtt/light/schema_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ def valid_color_configuration(config):


_PLATFORM_SCHEMA_BASE = (
mqtt.MQTT_RW_PLATFORM_SCHEMA.extend(
mqtt.MQTT_RW_SCHEMA.extend(
{
vol.Optional(CONF_BRIGHTNESS, default=DEFAULT_BRIGHTNESS): cv.boolean,
vol.Optional(
Expand Down Expand Up @@ -146,10 +146,11 @@ def valid_color_configuration(config):
.extend(MQTT_LIGHT_SCHEMA_SCHEMA.schema)
)

# Configuring MQTT Lights under the light platform key is deprecated in HA Core 2022.6
PLATFORM_SCHEMA_JSON = vol.All(
# CONF_WHITE_VALUE is deprecated, support will be removed in release 2022.9
cv.deprecated(CONF_WHITE_VALUE),
_PLATFORM_SCHEMA_BASE,
cv.PLATFORM_SCHEMA.extend(_PLATFORM_SCHEMA_BASE.schema),
valid_color_configuration,
)

Expand All @@ -160,6 +161,11 @@ def valid_color_configuration(config):
valid_color_configuration,
)

PLATFORM_SCHEMA_MODERN_JSON = vol.All(
_PLATFORM_SCHEMA_BASE,
valid_color_configuration,
)


async def async_setup_entity_json(
hass, config: ConfigType, async_add_entities, config_entry, discovery_data
Expand Down
7 changes: 5 additions & 2 deletions homeassistant/components/mqtt/light/schema_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
CONF_WHITE_VALUE_TEMPLATE = "white_value_template"

_PLATFORM_SCHEMA_BASE = (
mqtt.MQTT_RW_PLATFORM_SCHEMA.extend(
mqtt.MQTT_RW_SCHEMA.extend(
{
vol.Optional(CONF_BLUE_TEMPLATE): cv.template,
vol.Optional(CONF_BRIGHTNESS_TEMPLATE): cv.template,
Expand All @@ -90,10 +90,11 @@
.extend(MQTT_LIGHT_SCHEMA_SCHEMA.schema)
)

# Configuring MQTT Lights under the light platform key is deprecated in HA Core 2022.6
PLATFORM_SCHEMA_TEMPLATE = vol.All(
# CONF_WHITE_VALUE_TEMPLATE is deprecated, support will be removed in release 2022.9
cv.deprecated(CONF_WHITE_VALUE_TEMPLATE),
_PLATFORM_SCHEMA_BASE,
cv.PLATFORM_SCHEMA.extend(_PLATFORM_SCHEMA_BASE.schema),
)

DISCOVERY_SCHEMA_TEMPLATE = vol.All(
Expand All @@ -102,6 +103,8 @@
_PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA),
)

PLATFORM_SCHEMA_MODERN_TEMPLATE = _PLATFORM_SCHEMA_BASE


async def async_setup_entity_template(
hass, config, async_add_entities, config_entry, discovery_data
Expand Down
Loading