diff --git a/homeassistant/components/netatmo/camera.py b/homeassistant/components/netatmo/camera.py index 6e55b884d4d..5163c9582b0 100644 --- a/homeassistant/components/netatmo/camera.py +++ b/homeassistant/components/netatmo/camera.py @@ -7,6 +7,7 @@ import voluptuous as vol from homeassistant.components.camera import SUPPORT_STREAM, Camera from homeassistant.core import callback +from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers import config_validation as cv, entity_platform 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] + 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(): """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.get(CAMERA_DATA_CLASS_NAME): + if not data_handler.data.get(CAMERA_DATA_CLASS_NAME): return [] 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) + await data_handler.unregister_data_class(CAMERA_DATA_CLASS_NAME, None) + platform = entity_platform.current_platform.get() - if data_handler.data[CAMERA_DATA_CLASS_NAME] is not None: - platform.async_register_entity_service( - SERVICE_SET_PERSONS_HOME, - {vol.Required(ATTR_PERSONS): vol.All(cv.ensure_list, [cv.string])}, - "_service_set_persons_home", - ) - platform.async_register_entity_service( - SERVICE_SET_PERSON_AWAY, - {vol.Optional(ATTR_PERSON): cv.string}, - "_service_set_person_away", - ) - platform.async_register_entity_service( - SERVICE_SET_CAMERA_LIGHT, - {vol.Required(ATTR_CAMERA_LIGHT_MODE): vol.In(CAMERA_LIGHT_MODES)}, - "_service_set_camera_light", - ) + platform.async_register_entity_service( + SERVICE_SET_PERSONS_HOME, + {vol.Required(ATTR_PERSONS): vol.All(cv.ensure_list, [cv.string])}, + "_service_set_persons_home", + ) + platform.async_register_entity_service( + SERVICE_SET_PERSON_AWAY, + {vol.Optional(ATTR_PERSON): cv.string}, + "_service_set_person_away", + ) + platform.async_register_entity_service( + SERVICE_SET_CAMERA_LIGHT, + {vol.Required(ATTR_CAMERA_LIGHT_MODE): vol.In(CAMERA_LIGHT_MODES)}, + "_service_set_camera_light", + ) class NetatmoCamera(NetatmoBase, Camera): diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index a53f7f9fb08..d12ee9263db 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -25,6 +25,7 @@ from homeassistant.const import ( TEMP_CELSIUS, ) from homeassistant.core import callback +from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers import config_validation as cv, entity_platform from homeassistant.helpers.device_registry import async_get_registry from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -81,6 +82,7 @@ NETATMO_MAP_PRESET = { STATE_NETATMO_AWAY: PRESET_AWAY, STATE_NETATMO_OFF: STATE_NETATMO_OFF, STATE_NETATMO_MANUAL: STATE_NETATMO_MANUAL, + STATE_NETATMO_HOME: PRESET_SCHEDULE, } 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) - if not home_data: - return + if HOMEDATA_DATA_CLASS_NAME not in data_handler.data: + raise PlatformNotReady async def get_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) + await data_handler.unregister_data_class(HOMEDATA_DATA_CLASS_NAME, None) + platform = entity_platform.current_platform.get() if home_data is not None: diff --git a/homeassistant/components/netatmo/data_handler.py b/homeassistant/components/netatmo/data_handler.py index 9bc4b197f1b..be0120bd1a0 100644 --- a/homeassistant/components/netatmo/data_handler.py +++ b/homeassistant/components/netatmo/data_handler.py @@ -129,7 +129,11 @@ class NetatmoDataHandler: if 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) async def register_data_class( diff --git a/homeassistant/components/netatmo/light.py b/homeassistant/components/netatmo/light.py index dc8bf3f1fc8..eed12f048c8 100644 --- a/homeassistant/components/netatmo/light.py +++ b/homeassistant/components/netatmo/light.py @@ -31,18 +31,15 @@ async def async_setup_entry(hass, entry, async_add_entities): 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(): """Retrieve Netatmo entities.""" - await data_handler.register_data_class( - CAMERA_DATA_CLASS_NAME, CAMERA_DATA_CLASS_NAME, None - ) entities = [] all_cameras = [] - if CAMERA_DATA_CLASS_NAME not in data_handler.data: - raise PlatformNotReady - try: for home in data_handler.data[CAMERA_DATA_CLASS_NAME].cameras.values(): for camera in home.values(): diff --git a/homeassistant/components/netatmo/sensor.py b/homeassistant/components/netatmo/sensor.py index f8484444818..9176b670bea 100644 --- a/homeassistant/components/netatmo/sensor.py +++ b/homeassistant/components/netatmo/sensor.py @@ -20,6 +20,7 @@ from homeassistant.const import ( TEMP_CELSIUS, ) 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.dispatcher import ( 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.""" 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): """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 = {} 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 [] 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) ) + await data_handler.unregister_data_class(data_class_name, None) + return entities for data_class_name in [