Fix issue at Netatmo startup (#47452)
This commit is contained in:
parent
793929f2ea
commit
b3c33fc1be
5 changed files with 56 additions and 33 deletions
|
@ -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):
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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():
|
||||||
|
|
|
@ -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 [
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue