* Introducing the Netatmo component As Netatmo is providing several type of device (sensor, camera), a new Netatmo component needs to be created in order to centralize the Netatmo login data. Currently this change only impacts the Netatmo Weather station * Add new Netatmo library This new API will provide access to the Welcome Camera * Basic support for Netatmo Welcome camera This change introduces support for Netatmo Welcome camera. Currently, it will add all detected camera to Home Assistant, camera filtering (similar to the one used for weather station modules) will be added later * Remove useless REQUIREMENTS * Fixes for Netatmo Welcome support * Allow to filter Welcome cameras by name and/or home * Update requirements for Netatmo components * Fix multi-camera support for Welcome * Fix pep8 error/warning * This commit also adds improved logging for bad credentials * Add Throttle decorator for Welcome update function As the update function updates the data for all cameras, we should prevent this function to be called several time during an interval
104 lines
3.4 KiB
Python
104 lines
3.4 KiB
Python
"""
|
|
Support for the Netatmo Welcome camera.
|
|
|
|
For more details about this platform, please refer to the documentation at
|
|
https://home-assistant.io/components/camera.netatmo/
|
|
"""
|
|
import logging
|
|
from datetime import timedelta
|
|
import requests
|
|
from homeassistant.util import Throttle
|
|
|
|
from homeassistant.components.camera import Camera
|
|
from homeassistant.loader import get_component
|
|
|
|
DEPENDENCIES = ["netatmo"]
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
CONF_HOME = 'home'
|
|
ATTR_CAMERAS = 'cameras'
|
|
|
|
MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=10)
|
|
|
|
|
|
# pylint: disable=unused-argument
|
|
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
|
"""Setup access to Netatmo Welcome cameras."""
|
|
netatmo = get_component('netatmo')
|
|
home = config.get(CONF_HOME, None)
|
|
data = WelcomeData(netatmo.NETATMO_AUTH, home)
|
|
|
|
for camera_name in data.get_camera_names():
|
|
if ATTR_CAMERAS in config:
|
|
if camera_name not in config[ATTR_CAMERAS]:
|
|
continue
|
|
add_devices_callback([WelcomeCamera(data, camera_name, home)])
|
|
|
|
|
|
class WelcomeCamera(Camera):
|
|
"""Representation of the images published from Welcome camera."""
|
|
|
|
def __init__(self, data, camera_name, home):
|
|
"""Setup for access to the BloomSky camera images."""
|
|
super(WelcomeCamera, self).__init__()
|
|
self._data = data
|
|
self._camera_name = camera_name
|
|
if home:
|
|
self._name = home + ' / ' + camera_name
|
|
else:
|
|
self._name = camera_name
|
|
self._vpnurl, self._localurl = self._data.welcomedata.cameraUrls(
|
|
camera=camera_name
|
|
)
|
|
|
|
def camera_image(self):
|
|
"""Return a still image response from the camera."""
|
|
try:
|
|
if self._localurl:
|
|
response = requests.get('{0}/live/snapshot_720.jpg'.format(
|
|
self._localurl))
|
|
else:
|
|
response = requests.get('{0}/live/snapshot_720.jpg'.format(
|
|
self._vpnurl))
|
|
except requests.exceptions.RequestException as error:
|
|
_LOGGER.error('Welcome VPN url changed: %s', error)
|
|
self._data.update()
|
|
(self._vpnurl, self._localurl) = \
|
|
self._data.welcomedata.cameraUrls(camera=self._camera_name)
|
|
return None
|
|
return response.content
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of this Netatmo Welcome device."""
|
|
return self._name
|
|
|
|
|
|
class WelcomeData(object):
|
|
"""Get the latest data from NetAtmo."""
|
|
|
|
def __init__(self, auth, home=None):
|
|
"""Initialize the data object."""
|
|
self.auth = auth
|
|
self.welcomedata = None
|
|
self.camera_names = []
|
|
self.home = home
|
|
|
|
def get_camera_names(self):
|
|
"""Return all module available on the API as a list."""
|
|
self.update()
|
|
if not self.home:
|
|
for home in self.welcomedata.cameras.keys():
|
|
for camera in self.welcomedata.cameras[home].values():
|
|
self.camera_names.append(camera['name'])
|
|
else:
|
|
for camera in self.welcomedata.cameras[self.home].values():
|
|
self.camera_names.append(camera['name'])
|
|
return self.camera_names
|
|
|
|
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
|
def update(self):
|
|
"""Call the NetAtmo API to update the data."""
|
|
import lnetatmo
|
|
self.welcomedata = lnetatmo.WelcomeData(self.auth)
|