Use constants and update ordering (#3266)

pull/3280/head
Fabian Affolter 2016-09-09 08:37:30 +02:00 committed by GitHub
parent 44f5a66b66
commit 911231afc1
3 changed files with 36 additions and 27 deletions

View File

@ -8,20 +8,19 @@ import logging
import voluptuous as vol import voluptuous as vol
import homeassistant.components.mqtt as mqtt from homeassistant.components.mqtt import CONF_STATE_TOPIC, CONF_QOS
from homeassistant.const import ( from homeassistant.const import (
CONF_NAME, CONF_VALUE_TEMPLATE, STATE_UNKNOWN, CONF_UNIT_OF_MEASUREMENT) CONF_NAME, CONF_VALUE_TEMPLATE, STATE_UNKNOWN, CONF_UNIT_OF_MEASUREMENT)
from homeassistant.components.mqtt import CONF_STATE_TOPIC, CONF_QOS
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity
from homeassistant.helpers import template from homeassistant.helpers import template
from homeassistant.helpers.entity import Entity
import homeassistant.components.mqtt as mqtt
import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
DEFAULT_NAME = 'MQTT Sensor'
DEPENDENCIES = ['mqtt'] DEPENDENCIES = ['mqtt']
DEFAULT_NAME = "MQTT Sensor"
PLATFORM_SCHEMA = mqtt.MQTT_RO_PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = mqtt.MQTT_RO_PLATFORM_SCHEMA.extend({
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string,
@ -33,9 +32,9 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
"""Setup MQTT Sensor.""" """Setup MQTT Sensor."""
add_devices([MqttSensor( add_devices([MqttSensor(
hass, hass,
config[CONF_NAME], config.get(CONF_NAME),
config[CONF_STATE_TOPIC], config.get(CONF_STATE_TOPIC),
config[CONF_QOS], config.get(CONF_QOS),
config.get(CONF_UNIT_OF_MEASUREMENT), config.get(CONF_UNIT_OF_MEASUREMENT),
config.get(CONF_VALUE_TEMPLATE), config.get(CONF_VALUE_TEMPLATE),
)]) )])

View File

@ -11,7 +11,8 @@ import voluptuous as vol
import homeassistant.components.mqtt as mqtt import homeassistant.components.mqtt as mqtt
from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import CONF_NAME, STATE_UNKNOWN from homeassistant.const import (
CONF_NAME, STATE_UNKNOWN, CONF_TIMEOUT)
from homeassistant.components.mqtt import CONF_STATE_TOPIC from homeassistant.components.mqtt import CONF_STATE_TOPIC
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
@ -21,12 +22,18 @@ _LOGGER = logging.getLogger(__name__)
DEPENDENCIES = ['mqtt'] DEPENDENCIES = ['mqtt']
CONF_DEVICE_ID = 'device_id' ATTR_DEVICE_ID = 'device_id'
CONF_TIMEOUT = 'timeout' ATTR_DISTANCE = 'distance'
ATTR_ID = 'id'
ATTR_ROOM = 'room'
CONF_DEVICE_ID = 'device_id'
CONF_ROOM = 'room'
DEFAULT_TOPIC = 'room_presence'
DEFAULT_TIMEOUT = 5
DEFAULT_NAME = 'Room Sensor' DEFAULT_NAME = 'Room Sensor'
DEFAULT_TIMEOUT = 5
DEFAULT_TOPIC = 'room_presence'
DEPENDENCIES = ['mqtt']
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_DEVICE_ID): cv.string, vol.Required(CONF_DEVICE_ID): cv.string,
@ -36,15 +43,15 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
}) })
MQTT_PAYLOAD = vol.Schema(vol.All(json.loads, vol.Schema({ MQTT_PAYLOAD = vol.Schema(vol.All(json.loads, vol.Schema({
vol.Required('id'): cv.string, vol.Required(ATTR_ID): cv.string,
vol.Required('distance'): vol.Coerce(float) vol.Required(ATTR_DISTANCE): vol.Coerce(float),
}, extra=vol.ALLOW_EXTRA))) }, extra=vol.ALLOW_EXTRA)))
# pylint: disable=unused-argument # pylint: disable=unused-argument
def setup_platform(hass, config, add_devices_callback, discovery_info=None): def setup_platform(hass, config, add_devices, discovery_info=None):
"""Setup MQTT Sensor.""" """Setup MQTT Sensor."""
add_devices_callback([MQTTRoomSensor( add_devices([MQTTRoomSensor(
hass, hass,
config.get(CONF_NAME), config.get(CONF_NAME),
config.get(CONF_STATE_TOPIC), config.get(CONF_STATE_TOPIC),
@ -62,7 +69,7 @@ class MQTTRoomSensor(Entity):
self._state = STATE_UNKNOWN self._state = STATE_UNKNOWN
self._hass = hass self._hass = hass
self._name = name self._name = name
self._state_topic = state_topic + '/+' self._state_topic = '{}{}'.format(state_topic, '/+')
self._device_id = slugify(device_id).upper() self._device_id = slugify(device_id).upper()
self._timeout = timeout self._timeout = timeout
self._distance = None self._distance = None
@ -86,7 +93,7 @@ class MQTTRoomSensor(Entity):
return return
device = _parse_update_data(topic, data) device = _parse_update_data(topic, data)
if device.get('device_id') == self._device_id: if device.get(CONF_DEVICE_ID) == self._device_id:
if self._distance is None or self._updated is None: if self._distance is None or self._updated is None:
update_state(**device) update_state(**device)
else: else:
@ -95,8 +102,8 @@ class MQTTRoomSensor(Entity):
# device is closer to another room OR # device is closer to another room OR
# last update from other room was too long ago # last update from other room was too long ago
timediff = dt.utcnow() - self._updated timediff = dt.utcnow() - self._updated
if device.get('room') == self._state \ if device.get(ATTR_ROOM) == self._state \
or device.get('distance') < self._distance \ or device.get(ATTR_DISTANCE) < self._distance \
or timediff.seconds >= self._timeout: or timediff.seconds >= self._timeout:
update_state(**device) update_state(**device)
@ -116,7 +123,7 @@ class MQTTRoomSensor(Entity):
def device_state_attributes(self): def device_state_attributes(self):
"""Return the state attributes.""" """Return the state attributes."""
return { return {
'distance': self._distance ATTR_DISTANCE: self._distance
} }
@property @property
@ -129,11 +136,11 @@ def _parse_update_data(topic, data):
"""Parse the room presence update.""" """Parse the room presence update."""
parts = topic.split('/') parts = topic.split('/')
room = parts[-1] room = parts[-1]
device_id = slugify(data.get('id')).upper() device_id = slugify(data.get(ATTR_ID)).upper()
distance = data.get('distance') distance = data.get('distance')
parsed_data = { parsed_data = {
'device_id': device_id, ATTR_DEVICE_ID: device_id,
'room': room, ATTR_ROOM: room,
'distance': distance ATTR_DISTANCE: distance
} }
return parsed_data return parsed_data

View File

@ -61,6 +61,7 @@ CONF_AUTHENTICATION = 'authentication'
CONF_BEFORE = 'before' CONF_BEFORE = 'before'
CONF_BELOW = 'below' CONF_BELOW = 'below'
CONF_BLACKLIST = 'blacklist' CONF_BLACKLIST = 'blacklist'
CONF_BRIGHTNESS = 'brightness'
CONF_CODE = 'code' CONF_CODE = 'code'
CONF_COMMAND = 'command' CONF_COMMAND = 'command'
CONF_COMMAND_CLOSE = 'command_close' CONF_COMMAND_CLOSE = 'command_close'
@ -110,6 +111,7 @@ CONF_PREFIX = 'prefix'
CONF_RECIPIENT = 'recipient' CONF_RECIPIENT = 'recipient'
CONF_RESOURCE = 'resource' CONF_RESOURCE = 'resource'
CONF_RESOURCES = 'resources' CONF_RESOURCES = 'resources'
CONF_RGB = 'rgb'
CONF_SCAN_INTERVAL = 'scan_interval' CONF_SCAN_INTERVAL = 'scan_interval'
CONF_SENDER = 'sender' CONF_SENDER = 'sender'
CONF_SENSOR_CLASS = 'sensor_class' CONF_SENSOR_CLASS = 'sensor_class'
@ -120,6 +122,7 @@ CONF_STRUCTURE = 'structure'
CONF_SWITCHES = 'switches' CONF_SWITCHES = 'switches'
CONF_TEMPERATURE_UNIT = 'temperature_unit' CONF_TEMPERATURE_UNIT = 'temperature_unit'
CONF_TIME_ZONE = 'time_zone' CONF_TIME_ZONE = 'time_zone'
CONF_TIMEOUT = 'timeout'
CONF_TOKEN = 'token' CONF_TOKEN = 'token'
CONF_TRIGGER_TIME = 'trigger_time' CONF_TRIGGER_TIME = 'trigger_time'
CONF_UNIT_OF_MEASUREMENT = 'unit_of_measurement' CONF_UNIT_OF_MEASUREMENT = 'unit_of_measurement'