Create tasks to load Amcrest platforms (#64848)

* Create tasks to load Amcrest platforms

* Move closure definition out of for loop
This commit is contained in:
Sean Vig 2022-01-24 16:34:18 -05:00 committed by GitHub
parent 6d5c2bb34b
commit 6af7425051
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -30,10 +30,11 @@ from homeassistant.const import (
CONF_USERNAME, CONF_USERNAME,
ENTITY_MATCH_ALL, ENTITY_MATCH_ALL,
ENTITY_MATCH_NONE, ENTITY_MATCH_NONE,
EVENT_HOMEASSISTANT_STOP,
HTTP_BASIC_AUTHENTICATION, HTTP_BASIC_AUTHENTICATION,
Platform, Platform,
) )
from homeassistant.core import HomeAssistant, ServiceCall from homeassistant.core import Event, HomeAssistant, ServiceCall, callback
from homeassistant.exceptions import Unauthorized, UnknownUser from homeassistant.exceptions import Unauthorized, UnknownUser
from homeassistant.helpers import discovery from homeassistant.helpers import discovery
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
@ -267,6 +268,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up the Amcrest IP Camera component.""" """Set up the Amcrest IP Camera component."""
hass.data.setdefault(DATA_AMCREST, {DEVICES: {}, CAMERAS: []}) hass.data.setdefault(DATA_AMCREST, {DEVICES: {}, CAMERAS: []})
monitor_tasks = []
for device in config[DOMAIN]: for device in config[DOMAIN]:
name: str = device[CONF_NAME] name: str = device[CONF_NAME]
username: str = device[CONF_USERNAME] username: str = device[CONF_USERNAME]
@ -302,18 +304,22 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
control_light, control_light,
) )
await discovery.async_load_platform( hass.async_create_task(
hass, Platform.CAMERA, DOMAIN, {CONF_NAME: name}, config discovery.async_load_platform(
hass, Platform.CAMERA, DOMAIN, {CONF_NAME: name}, config
)
) )
event_codes = set() event_codes = set()
if binary_sensors: if binary_sensors:
await discovery.async_load_platform( hass.async_create_task(
hass, discovery.async_load_platform(
Platform.BINARY_SENSOR, hass,
DOMAIN, Platform.BINARY_SENSOR,
{CONF_NAME: name, CONF_BINARY_SENSORS: binary_sensors}, DOMAIN,
config, {CONF_NAME: name, CONF_BINARY_SENSORS: binary_sensors},
config,
)
) )
event_codes = { event_codes = {
sensor.event_code sensor.event_code
@ -323,26 +329,39 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
and sensor.event_code is not None and sensor.event_code is not None
} }
asyncio.create_task(_monitor_events(hass, name, api, event_codes)) monitor_tasks.append(
asyncio.create_task(_monitor_events(hass, name, api, event_codes))
)
if sensors: if sensors:
await discovery.async_load_platform( hass.async_create_task(
hass, discovery.async_load_platform(
Platform.SENSOR, hass,
DOMAIN, Platform.SENSOR,
{CONF_NAME: name, CONF_SENSORS: sensors}, DOMAIN,
config, {CONF_NAME: name, CONF_SENSORS: sensors},
config,
)
) )
if switches: if switches:
await discovery.async_load_platform( hass.async_create_task(
hass, discovery.async_load_platform(
Platform.SWITCH, hass,
DOMAIN, Platform.SWITCH,
{CONF_NAME: name, CONF_SWITCHES: switches}, DOMAIN,
config, {CONF_NAME: name, CONF_SWITCHES: switches},
config,
)
) )
@callback
def cancel_monitors(event: Event) -> None:
for monitor_task in monitor_tasks:
monitor_task.cancel()
hass.bus.async_listen(EVENT_HOMEASSISTANT_STOP, cancel_monitors)
if not hass.data[DATA_AMCREST][DEVICES]: if not hass.data[DATA_AMCREST][DEVICES]:
return False return False