161 lines
5.9 KiB
Python
161 lines
5.9 KiB
Python
"""
|
|
Support for the Netatmo binary sensors.
|
|
|
|
The binary sensors based on events seen by the NetatmoCamera
|
|
|
|
For more details about this platform, please refer to the documentation at
|
|
https://home-assistant.io/components/binary_sensor.netatmo/
|
|
"""
|
|
import logging
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components.binary_sensor import (
|
|
BinarySensorDevice, PLATFORM_SCHEMA)
|
|
from homeassistant.components.netatmo import WelcomeData
|
|
from homeassistant.loader import get_component
|
|
from homeassistant.const import CONF_MONITORED_CONDITIONS, CONF_TIMEOUT
|
|
from homeassistant.helpers import config_validation as cv
|
|
|
|
DEPENDENCIES = ["netatmo"]
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
# These are the available sensors mapped to binary_sensor class
|
|
SENSOR_TYPES = {
|
|
"Someone known": 'occupancy',
|
|
"Someone unknown": 'motion',
|
|
"Motion": 'motion',
|
|
"Tag Vibration": 'vibration',
|
|
"Tag Open": 'opening',
|
|
}
|
|
|
|
CONF_HOME = 'home'
|
|
CONF_CAMERAS = 'cameras'
|
|
|
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
|
vol.Optional(CONF_HOME): cv.string,
|
|
vol.Optional(CONF_TIMEOUT): cv.positive_int,
|
|
vol.Optional(CONF_CAMERAS, default=[]):
|
|
vol.All(cv.ensure_list, [cv.string]),
|
|
vol.Optional(CONF_MONITORED_CONDITIONS, default=SENSOR_TYPES.keys()):
|
|
vol.All(cv.ensure_list, [vol.In(SENSOR_TYPES)]),
|
|
})
|
|
|
|
|
|
# pylint: disable=unused-argument
|
|
def setup_platform(hass, config, add_devices, discovery_info=None):
|
|
"""Setup access to Netatmo binary sensor."""
|
|
netatmo = get_component('netatmo')
|
|
home = config.get(CONF_HOME, None)
|
|
timeout = config.get(CONF_TIMEOUT, 15)
|
|
|
|
module_name = None
|
|
|
|
import lnetatmo
|
|
try:
|
|
data = WelcomeData(netatmo.NETATMO_AUTH, home)
|
|
if data.get_camera_names() == []:
|
|
return None
|
|
except lnetatmo.NoDevice:
|
|
return None
|
|
|
|
sensors = config.get(CONF_MONITORED_CONDITIONS, SENSOR_TYPES)
|
|
|
|
for camera_name in data.get_camera_names():
|
|
if CONF_CAMERAS in config:
|
|
if config[CONF_CAMERAS] != [] and \
|
|
camera_name not in config[CONF_CAMERAS]:
|
|
continue
|
|
for variable in sensors:
|
|
if variable in ('Tag Vibration', 'Tag Open'):
|
|
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):
|
|
"""Represent a single binary sensor in a Netatmo Welcome device."""
|
|
|
|
def __init__(self, data, camera_name, module_name, home, timeout, sensor):
|
|
"""Setup for access to the Netatmo camera events."""
|
|
self._data = data
|
|
self._camera_name = camera_name
|
|
self._module_name = module_name
|
|
self._home = home
|
|
self._timeout = timeout
|
|
if home:
|
|
self._name = home + ' / ' + camera_name
|
|
else:
|
|
self._name = camera_name
|
|
if module_name:
|
|
self._name += ' / ' + module_name
|
|
self._sensor_name = sensor
|
|
self._name += ' ' + sensor
|
|
camera_id = data.welcomedata.cameraByName(camera=camera_name,
|
|
home=home)['id']
|
|
self._unique_id = "Welcome_binary_sensor {0} - {1}".format(self._name,
|
|
camera_id)
|
|
self.update()
|
|
|
|
@property
|
|
def name(self):
|
|
"""The name of the Netatmo device and this sensor."""
|
|
return self._name
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return the unique ID for this sensor."""
|
|
return self._unique_id
|
|
|
|
@property
|
|
def sensor_class(self):
|
|
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
|
return SENSOR_TYPES.get(self._sensor_name)
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if binary sensor is on."""
|
|
return self._state
|
|
|
|
def update(self):
|
|
"""Request an update from the Netatmo API."""
|
|
self._data.update()
|
|
self._data.update_event()
|
|
|
|
if self._sensor_name == "Someone known":
|
|
self._state =\
|
|
self._data.welcomedata.someoneKnownSeen(self._home,
|
|
self._camera_name,
|
|
self._timeout*60)
|
|
elif self._sensor_name == "Someone unknown":
|
|
self._state =\
|
|
self._data.welcomedata.someoneUnknownSeen(self._home,
|
|
self._camera_name,
|
|
self._timeout*60)
|
|
elif self._sensor_name == "Motion":
|
|
self._state =\
|
|
self._data.welcomedata.motionDetected(self._home,
|
|
self._camera_name,
|
|
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:
|
|
return None
|