Add support for Netatmo tags (#4761)

* Add support for Netatmo Welcome Tags

Signed-off-by: Hugo D. (jabesq) <jabesq@gmail.com>

* Add size parameter for WelcomeData

* minor fixes

* Add Throttling mechanism for update event

This will prevent to reach the API limit

Signed-off-by: Hugo D. (jabesq) <jabesq@gmail.com>

* Change scan interval for Netatmo Binary sensors

Signed-off-by: Hugo D. (jabesq) <jabesq@gmail.com>

* Minor fixes

Signed-off-by: Hugo D. (jabesq) <jabesq@gmail.com>

* Update netatmo.py
This commit is contained in:
Hugo Dupras 2016-12-06 06:35:33 +01:00 committed by Paulus Schoutsen
parent 81d38c3463
commit 8c628071f3
3 changed files with 56 additions and 11 deletions

View file

@ -23,9 +23,11 @@ _LOGGER = logging.getLogger(__name__)
# These are the available sensors mapped to binary_sensor class # These are the available sensors mapped to binary_sensor class
SENSOR_TYPES = { SENSOR_TYPES = {
"Someone known": "motion", "Someone known": 'occupancy',
"Someone unknown": "motion", "Someone unknown": 'motion',
"Motion": "motion", "Motion": 'motion',
"Tag Vibration": 'vibration',
"Tag Open": 'opening',
} }
CONF_HOME = 'home' CONF_HOME = 'home'
@ -48,6 +50,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
home = config.get(CONF_HOME, None) home = config.get(CONF_HOME, None)
timeout = config.get(CONF_TIMEOUT, 15) timeout = config.get(CONF_TIMEOUT, 15)
module_name = None
import lnetatmo import lnetatmo
try: try:
data = WelcomeData(netatmo.NETATMO_AUTH, home) data = WelcomeData(netatmo.NETATMO_AUTH, home)
@ -64,23 +68,35 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
camera_name not in config[CONF_CAMERAS]: camera_name not in config[CONF_CAMERAS]:
continue continue
for variable in sensors: for variable in sensors:
add_devices([WelcomeBinarySensor(data, camera_name, home, timeout, if variable in ('Tag Vibration', 'Tag Open'):
variable)]) continue
add_devices([WelcomeBinarySensor(data, camera_name, module_name,
home, timeout, variable)])
for module_name in data.get_module_names(camera_name):
for variable in sensors:
if variable in ('Tag Vibration', 'Tag Open'):
add_devices([WelcomeBinarySensor(data, camera_name,
module_name, home,
timeout, variable)])
class WelcomeBinarySensor(BinarySensorDevice): class WelcomeBinarySensor(BinarySensorDevice):
"""Represent a single binary sensor in a Netatmo Welcome device.""" """Represent a single binary sensor in a Netatmo Welcome device."""
def __init__(self, data, camera_name, home, timeout, sensor): def __init__(self, data, camera_name, module_name, home, timeout, sensor):
"""Setup for access to the Netatmo camera events.""" """Setup for access to the Netatmo camera events."""
self._data = data self._data = data
self._camera_name = camera_name self._camera_name = camera_name
self._module_name = module_name
self._home = home self._home = home
self._timeout = timeout self._timeout = timeout
if home: if home:
self._name = home + ' / ' + camera_name self._name = home + ' / ' + camera_name
else: else:
self._name = camera_name self._name = camera_name
if module_name:
self._name += ' / ' + module_name
self._sensor_name = sensor self._sensor_name = sensor
self._name += ' ' + sensor self._name += ' ' + sensor
camera_id = data.welcomedata.cameraByName(camera=camera_name, camera_id = data.welcomedata.cameraByName(camera=camera_name,
@ -112,7 +128,7 @@ class WelcomeBinarySensor(BinarySensorDevice):
def update(self): def update(self):
"""Request an update from the Netatmo API.""" """Request an update from the Netatmo API."""
self._data.update() self._data.update()
self._data.welcomedata.updateEvent(home=self._data.home) self._data.update_event()
if self._sensor_name == "Someone known": if self._sensor_name == "Someone known":
self._state =\ self._state =\
@ -129,5 +145,16 @@ class WelcomeBinarySensor(BinarySensorDevice):
self._data.welcomedata.motionDetected(self._home, self._data.welcomedata.motionDetected(self._home,
self._camera_name, self._camera_name,
self._timeout*60) self._timeout*60)
elif self._sensor_name == "Tag Vibration":
self._state =\
self._data.welcomedata.moduleMotionDetected(self._home,
self._module_name,
self._camera_name,
self._timeout*60)
elif self._sensor_name == "Tag Open":
self._state =\
self._data.welcomedata.moduleOpened(self._home,
self._module_name,
self._camera_name)
else: else:
return None return None

View file

@ -18,7 +18,7 @@ from homeassistant.util import Throttle
REQUIREMENTS = [ REQUIREMENTS = [
'https://github.com/jabesq/netatmo-api-python/archive/' 'https://github.com/jabesq/netatmo-api-python/archive/'
'v0.7.0.zip#lnetatmo==0.7.0'] 'v0.8.0.zip#lnetatmo==0.8.0']
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -30,6 +30,7 @@ NETATMO_AUTH = None
DEFAULT_DISCOVERY = True DEFAULT_DISCOVERY = True
MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=10) MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=10)
MIN_TIME_BETWEEN_EVENT_UPDATES = timedelta(seconds=10)
CONFIG_SCHEMA = vol.Schema({ CONFIG_SCHEMA = vol.Schema({
DOMAIN: vol.Schema({ DOMAIN: vol.Schema({
@ -72,10 +73,11 @@ class WelcomeData(object):
self.auth = auth self.auth = auth
self.welcomedata = None self.welcomedata = None
self.camera_names = [] self.camera_names = []
self.module_names = []
self.home = home self.home = home
def get_camera_names(self): def get_camera_names(self):
"""Return all module available on the API as a list.""" """Return all camera available on the API as a list."""
self.camera_names = [] self.camera_names = []
self.update() self.update()
if not self.home: if not self.home:
@ -87,8 +89,24 @@ class WelcomeData(object):
self.camera_names.append(camera['name']) self.camera_names.append(camera['name'])
return self.camera_names return self.camera_names
def get_module_names(self, camera_name):
"""Return all module available on the API as a list."""
self.module_names = []
self.update()
cam_id = self.welcomedata.cameraByName(camera=camera_name,
home=self.home)['id']
for module in self.welcomedata.modules.values():
if cam_id == module['cam_id']:
self.module_names.append(module['name'])
return self.module_names
@Throttle(MIN_TIME_BETWEEN_UPDATES) @Throttle(MIN_TIME_BETWEEN_UPDATES)
def update(self): def update(self):
"""Call the Netatmo API to update the data.""" """Call the Netatmo API to update the data."""
import lnetatmo import lnetatmo
self.welcomedata = lnetatmo.WelcomeData(self.auth) self.welcomedata = lnetatmo.WelcomeData(self.auth, size=100)
@Throttle(MIN_TIME_BETWEEN_EVENT_UPDATES)
def update_event(self):
"""Call the Netatmo API to update the list of events."""
self.welcomedata.updateEvent(home=self.home)

View file

@ -205,7 +205,7 @@ https://github.com/danieljkemp/onkyo-eiscp/archive/python3.zip#onkyo-eiscp==0.9.
# https://github.com/deisi/fritzconnection/archive/b5c14515e1c8e2652b06b6316a7f3913df942841.zip#fritzconnection==0.4.6 # https://github.com/deisi/fritzconnection/archive/b5c14515e1c8e2652b06b6316a7f3913df942841.zip#fritzconnection==0.4.6
# homeassistant.components.netatmo # homeassistant.components.netatmo
https://github.com/jabesq/netatmo-api-python/archive/v0.7.0.zip#lnetatmo==0.7.0 https://github.com/jabesq/netatmo-api-python/archive/v0.8.0.zip#lnetatmo==0.8.0
# homeassistant.components.neato # homeassistant.components.neato
https://github.com/jabesq/pybotvac/archive/v0.0.1.zip#pybotvac==0.0.1 https://github.com/jabesq/pybotvac/archive/v0.0.1.zip#pybotvac==0.0.1