Move manual configuration of MQTT camera to the integration key (#72249)

Add camera

Co-authored-by: Erik Montnemery <erik@montnemery.com>
This commit is contained in:
Jan Bouwhuis 2022-05-21 19:04:36 +02:00 committed by GitHub
parent b38289ee50
commit 809808dd80
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 39 additions and 4 deletions

View File

@ -193,6 +193,7 @@ PLATFORM_CONFIG_SCHEMA_BASE = vol.Schema(
vol.Optional(Platform.ALARM_CONTROL_PANEL.value): cv.ensure_list, vol.Optional(Platform.ALARM_CONTROL_PANEL.value): cv.ensure_list,
vol.Optional(Platform.BINARY_SENSOR.value): cv.ensure_list, vol.Optional(Platform.BINARY_SENSOR.value): cv.ensure_list,
vol.Optional(Platform.BUTTON.value): cv.ensure_list, vol.Optional(Platform.BUTTON.value): cv.ensure_list,
vol.Optional(Platform.CAMERA.value): cv.ensure_list,
vol.Optional(Platform.FAN.value): cv.ensure_list, vol.Optional(Platform.FAN.value): cv.ensure_list,
vol.Optional(Platform.LIGHT.value): cv.ensure_list, vol.Optional(Platform.LIGHT.value): cv.ensure_list,
} }

View File

@ -1,6 +1,7 @@
"""Camera that loads a picture from an MQTT topic.""" """Camera that loads a picture from an MQTT topic."""
from __future__ import annotations from __future__ import annotations
import asyncio
from base64 import b64decode from base64 import b64decode
import functools import functools
@ -22,8 +23,10 @@ from .debug_info import log_messages
from .mixins import ( from .mixins import (
MQTT_ENTITY_COMMON_SCHEMA, MQTT_ENTITY_COMMON_SCHEMA,
MqttEntity, MqttEntity,
async_get_platform_config_from_yaml,
async_setup_entry_helper, async_setup_entry_helper,
async_setup_platform_helper, async_setup_platform_helper,
warn_for_legacy_schema,
) )
DEFAULT_NAME = "MQTT Camera" DEFAULT_NAME = "MQTT Camera"
@ -37,14 +40,20 @@ MQTT_CAMERA_ATTRIBUTES_BLOCKED = frozenset(
} }
) )
PLATFORM_SCHEMA = mqtt.MQTT_BASE_PLATFORM_SCHEMA.extend( PLATFORM_SCHEMA_MODERN = mqtt.MQTT_BASE_SCHEMA.extend(
{ {
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Required(CONF_TOPIC): mqtt.valid_subscribe_topic, vol.Required(CONF_TOPIC): mqtt.valid_subscribe_topic,
} }
).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema)
DISCOVERY_SCHEMA = PLATFORM_SCHEMA.extend({}, extra=vol.REMOVE_EXTRA) # Configuring MQTT Camera under the camera platform key is deprecated in HA Core 2022.6
PLATFORM_SCHEMA = vol.All(
cv.PLATFORM_SCHEMA.extend(PLATFORM_SCHEMA_MODERN.schema),
warn_for_legacy_schema(camera.DOMAIN),
)
DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA)
async def async_setup_platform( async def async_setup_platform(
@ -53,7 +62,8 @@ async def async_setup_platform(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None, discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up MQTT camera through configuration.yaml.""" """Set up MQTT camera configured under the camera platform key (deprecated)."""
# Deprecated in HA Core 2022.6
await async_setup_platform_helper( await async_setup_platform_helper(
hass, camera.DOMAIN, config, async_add_entities, _async_setup_entity hass, camera.DOMAIN, config, async_add_entities, _async_setup_entity
) )
@ -64,7 +74,17 @@ async def async_setup_entry(
config_entry: ConfigEntry, config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up MQTT camera dynamically through MQTT discovery.""" """Set up MQTT camera through configuration.yaml and dynamically through MQTT discovery."""
# load and initialize platform config from configuration.yaml
await asyncio.gather(
*(
_async_setup_entity(hass, async_add_entities, config, config_entry)
for config in await async_get_platform_config_from_yaml(
hass, camera.DOMAIN, PLATFORM_SCHEMA_MODERN
)
)
)
# setup for discovery
setup = functools.partial( setup = functools.partial(
_async_setup_entity, hass, async_add_entities, config_entry=config_entry _async_setup_entity, hass, async_add_entities, config_entry=config_entry
) )

View File

@ -1,5 +1,6 @@
"""The tests for mqtt camera component.""" """The tests for mqtt camera component."""
from base64 import b64encode from base64 import b64encode
import copy
from http import HTTPStatus from http import HTTPStatus
import json import json
from unittest.mock import patch from unittest.mock import patch
@ -32,6 +33,7 @@ from .test_common import (
help_test_setting_attribute_via_mqtt_json_message, help_test_setting_attribute_via_mqtt_json_message,
help_test_setting_attribute_with_template, help_test_setting_attribute_with_template,
help_test_setting_blocked_attribute_via_mqtt_json_message, help_test_setting_blocked_attribute_via_mqtt_json_message,
help_test_setup_manual_entity_from_yaml,
help_test_unique_id, help_test_unique_id,
help_test_update_with_json_attrs_bad_JSON, help_test_update_with_json_attrs_bad_JSON,
help_test_update_with_json_attrs_not_dict, help_test_update_with_json_attrs_not_dict,
@ -289,3 +291,15 @@ async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
domain = camera.DOMAIN domain = camera.DOMAIN
config = DEFAULT_CONFIG[domain] config = DEFAULT_CONFIG[domain]
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config) await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
async def test_setup_manual_entity_from_yaml(hass, caplog, tmp_path):
"""Test setup manual configured MQTT entity."""
platform = camera.DOMAIN
config = copy.deepcopy(DEFAULT_CONFIG[platform])
config["name"] = "test"
del config["platform"]
await help_test_setup_manual_entity_from_yaml(
hass, caplog, tmp_path, platform, config
)
assert hass.states.get(f"{platform}.test") is not None