Fix issue at Netatmo startup (#47452)

This commit is contained in:
Tobias Sauerwein 2021-03-05 21:41:55 +01:00 committed by GitHub
parent 793929f2ea
commit b3c33fc1be
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 33 deletions

View file

@ -7,6 +7,7 @@ import voluptuous as vol
from homeassistant.components.camera import SUPPORT_STREAM, Camera from homeassistant.components.camera import SUPPORT_STREAM, Camera
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers import config_validation as cv, entity_platform from homeassistant.helpers import config_validation as cv, entity_platform
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
@ -49,15 +50,17 @@ async def async_setup_entry(hass, entry, async_add_entities):
data_handler = hass.data[DOMAIN][entry.entry_id][DATA_HANDLER] data_handler = hass.data[DOMAIN][entry.entry_id][DATA_HANDLER]
await data_handler.register_data_class(
CAMERA_DATA_CLASS_NAME, CAMERA_DATA_CLASS_NAME, None
)
if CAMERA_DATA_CLASS_NAME not in data_handler.data:
raise PlatformNotReady
async def get_entities(): async def get_entities():
"""Retrieve Netatmo entities.""" """Retrieve Netatmo entities."""
await data_handler.register_data_class(
CAMERA_DATA_CLASS_NAME, CAMERA_DATA_CLASS_NAME, None
)
data = data_handler.data if not data_handler.data.get(CAMERA_DATA_CLASS_NAME):
if not data.get(CAMERA_DATA_CLASS_NAME):
return [] return []
data_class = data_handler.data[CAMERA_DATA_CLASS_NAME] data_class = data_handler.data[CAMERA_DATA_CLASS_NAME]
@ -94,24 +97,25 @@ async def async_setup_entry(hass, entry, async_add_entities):
async_add_entities(await get_entities(), True) async_add_entities(await get_entities(), True)
await data_handler.unregister_data_class(CAMERA_DATA_CLASS_NAME, None)
platform = entity_platform.current_platform.get() platform = entity_platform.current_platform.get()
if data_handler.data[CAMERA_DATA_CLASS_NAME] is not None: platform.async_register_entity_service(
platform.async_register_entity_service( SERVICE_SET_PERSONS_HOME,
SERVICE_SET_PERSONS_HOME, {vol.Required(ATTR_PERSONS): vol.All(cv.ensure_list, [cv.string])},
{vol.Required(ATTR_PERSONS): vol.All(cv.ensure_list, [cv.string])}, "_service_set_persons_home",
"_service_set_persons_home", )
) platform.async_register_entity_service(
platform.async_register_entity_service( SERVICE_SET_PERSON_AWAY,
SERVICE_SET_PERSON_AWAY, {vol.Optional(ATTR_PERSON): cv.string},
{vol.Optional(ATTR_PERSON): cv.string}, "_service_set_person_away",
"_service_set_person_away", )
) platform.async_register_entity_service(
platform.async_register_entity_service( SERVICE_SET_CAMERA_LIGHT,
SERVICE_SET_CAMERA_LIGHT, {vol.Required(ATTR_CAMERA_LIGHT_MODE): vol.In(CAMERA_LIGHT_MODES)},
{vol.Required(ATTR_CAMERA_LIGHT_MODE): vol.In(CAMERA_LIGHT_MODES)}, "_service_set_camera_light",
"_service_set_camera_light", )
)
class NetatmoCamera(NetatmoBase, Camera): class NetatmoCamera(NetatmoBase, Camera):

View file

@ -25,6 +25,7 @@ from homeassistant.const import (
TEMP_CELSIUS, TEMP_CELSIUS,
) )
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers import config_validation as cv, entity_platform from homeassistant.helpers import config_validation as cv, entity_platform
from homeassistant.helpers.device_registry import async_get_registry from homeassistant.helpers.device_registry import async_get_registry
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
@ -81,6 +82,7 @@ NETATMO_MAP_PRESET = {
STATE_NETATMO_AWAY: PRESET_AWAY, STATE_NETATMO_AWAY: PRESET_AWAY,
STATE_NETATMO_OFF: STATE_NETATMO_OFF, STATE_NETATMO_OFF: STATE_NETATMO_OFF,
STATE_NETATMO_MANUAL: STATE_NETATMO_MANUAL, STATE_NETATMO_MANUAL: STATE_NETATMO_MANUAL,
STATE_NETATMO_HOME: PRESET_SCHEDULE,
} }
HVAC_MAP_NETATMO = { HVAC_MAP_NETATMO = {
@ -111,8 +113,8 @@ async def async_setup_entry(hass, entry, async_add_entities):
) )
home_data = data_handler.data.get(HOMEDATA_DATA_CLASS_NAME) home_data = data_handler.data.get(HOMEDATA_DATA_CLASS_NAME)
if not home_data: if HOMEDATA_DATA_CLASS_NAME not in data_handler.data:
return raise PlatformNotReady
async def get_entities(): async def get_entities():
"""Retrieve Netatmo entities.""" """Retrieve Netatmo entities."""
@ -151,6 +153,8 @@ async def async_setup_entry(hass, entry, async_add_entities):
async_add_entities(await get_entities(), True) async_add_entities(await get_entities(), True)
await data_handler.unregister_data_class(HOMEDATA_DATA_CLASS_NAME, None)
platform = entity_platform.current_platform.get() platform = entity_platform.current_platform.get()
if home_data is not None: if home_data is not None:

View file

@ -129,7 +129,11 @@ class NetatmoDataHandler:
if update_callback: if update_callback:
update_callback() update_callback()
except (pyatmo.NoDevice, pyatmo.ApiError) as err: except pyatmo.NoDevice as err:
_LOGGER.debug(err)
self.data[data_class_entry] = None
except pyatmo.ApiError as err:
_LOGGER.debug(err) _LOGGER.debug(err)
async def register_data_class( async def register_data_class(

View file

@ -31,18 +31,15 @@ async def async_setup_entry(hass, entry, async_add_entities):
data_handler = hass.data[DOMAIN][entry.entry_id][DATA_HANDLER] data_handler = hass.data[DOMAIN][entry.entry_id][DATA_HANDLER]
if CAMERA_DATA_CLASS_NAME not in data_handler.data:
raise PlatformNotReady
async def get_entities(): async def get_entities():
"""Retrieve Netatmo entities.""" """Retrieve Netatmo entities."""
await data_handler.register_data_class(
CAMERA_DATA_CLASS_NAME, CAMERA_DATA_CLASS_NAME, None
)
entities = [] entities = []
all_cameras = [] all_cameras = []
if CAMERA_DATA_CLASS_NAME not in data_handler.data:
raise PlatformNotReady
try: try:
for home in data_handler.data[CAMERA_DATA_CLASS_NAME].cameras.values(): for home in data_handler.data[CAMERA_DATA_CLASS_NAME].cameras.values():
for camera in home.values(): for camera in home.values():

View file

@ -20,6 +20,7 @@ from homeassistant.const import (
TEMP_CELSIUS, TEMP_CELSIUS,
) )
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers.device_registry import async_entries_for_config_entry from homeassistant.helpers.device_registry import async_entries_for_config_entry
from homeassistant.helpers.dispatcher import ( from homeassistant.helpers.dispatcher import (
async_dispatcher_connect, async_dispatcher_connect,
@ -129,14 +130,25 @@ async def async_setup_entry(hass, entry, async_add_entities):
"""Set up the Netatmo weather and homecoach platform.""" """Set up the Netatmo weather and homecoach platform."""
data_handler = hass.data[DOMAIN][entry.entry_id][DATA_HANDLER] data_handler = hass.data[DOMAIN][entry.entry_id][DATA_HANDLER]
await data_handler.register_data_class(
WEATHERSTATION_DATA_CLASS_NAME, WEATHERSTATION_DATA_CLASS_NAME, None
)
await data_handler.register_data_class(
HOMECOACH_DATA_CLASS_NAME, HOMECOACH_DATA_CLASS_NAME, None
)
async def find_entities(data_class_name): async def find_entities(data_class_name):
"""Find all entities.""" """Find all entities."""
await data_handler.register_data_class(data_class_name, data_class_name, None) if data_class_name not in data_handler.data:
raise PlatformNotReady
all_module_infos = {} all_module_infos = {}
data = data_handler.data data = data_handler.data
if not data.get(data_class_name): if data_class_name not in data:
return []
if data[data_class_name] is None:
return [] return []
data_class = data[data_class_name] data_class = data[data_class_name]
@ -174,6 +186,8 @@ async def async_setup_entry(hass, entry, async_add_entities):
NetatmoSensor(data_handler, data_class_name, module, condition) NetatmoSensor(data_handler, data_class_name, module, condition)
) )
await data_handler.unregister_data_class(data_class_name, None)
return entities return entities
for data_class_name in [ for data_class_name in [