binary_sensor sensor_class to entity device_class (#5860)
* binary_sensor sensor_class to entity device_class * Linter fixes * Should be it
This commit is contained in:
parent
67957cbfa8
commit
e877d572f5
36 changed files with 242 additions and 199 deletions
|
@ -14,13 +14,13 @@ from homeassistant.helpers.entity_component import EntityComponent
|
||||||
from homeassistant.helpers.entity import Entity
|
from homeassistant.helpers.entity import Entity
|
||||||
from homeassistant.const import (STATE_ON, STATE_OFF)
|
from homeassistant.const import (STATE_ON, STATE_OFF)
|
||||||
from homeassistant.helpers.config_validation import PLATFORM_SCHEMA # noqa
|
from homeassistant.helpers.config_validation import PLATFORM_SCHEMA # noqa
|
||||||
|
from homeassistant.helpers.deprecation import deprecated_substitute
|
||||||
|
|
||||||
DOMAIN = 'binary_sensor'
|
DOMAIN = 'binary_sensor'
|
||||||
SCAN_INTERVAL = timedelta(seconds=30)
|
SCAN_INTERVAL = timedelta(seconds=30)
|
||||||
|
|
||||||
ENTITY_ID_FORMAT = DOMAIN + '.{}'
|
ENTITY_ID_FORMAT = DOMAIN + '.{}'
|
||||||
SENSOR_CLASSES = [
|
DEVICE_CLASSES = [
|
||||||
None, # Generic on/off
|
|
||||||
'cold', # On means cold (or too cold)
|
'cold', # On means cold (or too cold)
|
||||||
'connectivity', # On means connection present, Off = no connection
|
'connectivity', # On means connection present, Off = no connection
|
||||||
'gas', # CO, CO2, etc.
|
'gas', # CO, CO2, etc.
|
||||||
|
@ -38,7 +38,7 @@ SENSOR_CLASSES = [
|
||||||
'vibration', # On means vibration detected, Off means no vibration
|
'vibration', # On means vibration detected, Off means no vibration
|
||||||
]
|
]
|
||||||
|
|
||||||
SENSOR_CLASSES_SCHEMA = vol.All(vol.Lower, vol.In(SENSOR_CLASSES))
|
DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.In(DEVICE_CLASSES))
|
||||||
|
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
|
@ -66,16 +66,7 @@ class BinarySensorDevice(Entity):
|
||||||
return STATE_ON if self.is_on else STATE_OFF
|
return STATE_ON if self.is_on else STATE_OFF
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
@deprecated_substitute('sensor_class')
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
def device_class(self):
|
||||||
|
"""Return the class of this device, from component DEVICE_CLASSES."""
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@property
|
|
||||||
def state_attributes(self):
|
|
||||||
"""Return device specific state attributes."""
|
|
||||||
attr = {}
|
|
||||||
|
|
||||||
if self.sensor_class is not None:
|
|
||||||
attr['sensor_class'] = self.sensor_class
|
|
||||||
|
|
||||||
return attr
|
|
||||||
|
|
|
@ -11,11 +11,12 @@ import requests
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
BinarySensorDevice, PLATFORM_SCHEMA, SENSOR_CLASSES_SCHEMA)
|
BinarySensorDevice, PLATFORM_SCHEMA, DEVICE_CLASSES_SCHEMA)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_RESOURCE, CONF_PIN, CONF_NAME, CONF_SENSOR_CLASS)
|
CONF_RESOURCE, CONF_PIN, CONF_NAME, CONF_SENSOR_CLASS, CONF_DEVICE_CLASS)
|
||||||
from homeassistant.util import Throttle
|
from homeassistant.util import Throttle
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
from homeassistant.helpers.deprecation import get_deprecated
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -25,7 +26,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(CONF_RESOURCE): cv.url,
|
vol.Required(CONF_RESOURCE): cv.url,
|
||||||
vol.Optional(CONF_NAME): cv.string,
|
vol.Optional(CONF_NAME): cv.string,
|
||||||
vol.Required(CONF_PIN): cv.string,
|
vol.Required(CONF_PIN): cv.string,
|
||||||
vol.Optional(CONF_SENSOR_CLASS): SENSOR_CLASSES_SCHEMA,
|
vol.Optional(CONF_SENSOR_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
|
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,7 +35,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
"""Set up the aREST binary sensor."""
|
"""Set up the aREST binary sensor."""
|
||||||
resource = config.get(CONF_RESOURCE)
|
resource = config.get(CONF_RESOURCE)
|
||||||
pin = config.get(CONF_PIN)
|
pin = config.get(CONF_PIN)
|
||||||
sensor_class = config.get(CONF_SENSOR_CLASS)
|
device_class = get_deprecated(config, CONF_DEVICE_CLASS, CONF_SENSOR_CLASS)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = requests.get(resource, timeout=10).json()
|
response = requests.get(resource, timeout=10).json()
|
||||||
|
@ -49,18 +51,18 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
|
|
||||||
add_devices([ArestBinarySensor(
|
add_devices([ArestBinarySensor(
|
||||||
arest, resource, config.get(CONF_NAME, response[CONF_NAME]),
|
arest, resource, config.get(CONF_NAME, response[CONF_NAME]),
|
||||||
sensor_class, pin)])
|
device_class, pin)])
|
||||||
|
|
||||||
|
|
||||||
class ArestBinarySensor(BinarySensorDevice):
|
class ArestBinarySensor(BinarySensorDevice):
|
||||||
"""Implement an aREST binary sensor for a pin."""
|
"""Implement an aREST binary sensor for a pin."""
|
||||||
|
|
||||||
def __init__(self, arest, resource, name, sensor_class, pin):
|
def __init__(self, arest, resource, name, device_class, pin):
|
||||||
"""Initialize the aREST device."""
|
"""Initialize the aREST device."""
|
||||||
self.arest = arest
|
self.arest = arest
|
||||||
self._resource = resource
|
self._resource = resource
|
||||||
self._name = name
|
self._name = name
|
||||||
self._sensor_class = sensor_class
|
self._device_class = device_class
|
||||||
self._pin = pin
|
self._pin = pin
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
|
@ -81,9 +83,9 @@ class ArestBinarySensor(BinarySensorDevice):
|
||||||
return bool(self.arest.data.get('state'))
|
return bool(self.arest.data.get('state'))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor."""
|
"""Return the class of this sensor."""
|
||||||
return self._sensor_class
|
return self._device_class
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
"""Get the latest data from aREST API."""
|
"""Get the latest data from aREST API."""
|
||||||
|
|
|
@ -64,8 +64,8 @@ class BloomSkySensor(BinarySensorDevice):
|
||||||
return self._unique_id
|
return self._unique_id
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
return SENSOR_TYPES.get(self._sensor_name)
|
return SENSOR_TYPES.get(self._sensor_name)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
|
@ -10,12 +10,13 @@ import logging
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
BinarySensorDevice, SENSOR_CLASSES_SCHEMA, PLATFORM_SCHEMA)
|
BinarySensorDevice, DEVICE_CLASSES_SCHEMA, PLATFORM_SCHEMA)
|
||||||
from homeassistant.components.sensor.command_line import CommandSensorData
|
from homeassistant.components.sensor.command_line import CommandSensorData
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_PAYLOAD_OFF, CONF_PAYLOAD_ON, CONF_NAME, CONF_VALUE_TEMPLATE,
|
CONF_PAYLOAD_OFF, CONF_PAYLOAD_ON, CONF_NAME, CONF_VALUE_TEMPLATE,
|
||||||
CONF_SENSOR_CLASS, CONF_COMMAND)
|
CONF_SENSOR_CLASS, CONF_COMMAND, CONF_DEVICE_CLASS)
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
from homeassistant.helpers.deprecation import get_deprecated
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -30,7 +31,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||||
vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string,
|
vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string,
|
||||||
vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string,
|
vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string,
|
||||||
vol.Optional(CONF_SENSOR_CLASS): SENSOR_CLASSES_SCHEMA,
|
vol.Optional(CONF_SENSOR_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
|
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
|
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -42,27 +44,27 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
command = config.get(CONF_COMMAND)
|
command = config.get(CONF_COMMAND)
|
||||||
payload_off = config.get(CONF_PAYLOAD_OFF)
|
payload_off = config.get(CONF_PAYLOAD_OFF)
|
||||||
payload_on = config.get(CONF_PAYLOAD_ON)
|
payload_on = config.get(CONF_PAYLOAD_ON)
|
||||||
sensor_class = config.get(CONF_SENSOR_CLASS)
|
device_class = get_deprecated(config, CONF_DEVICE_CLASS, CONF_SENSOR_CLASS)
|
||||||
value_template = config.get(CONF_VALUE_TEMPLATE)
|
value_template = config.get(CONF_VALUE_TEMPLATE)
|
||||||
if value_template is not None:
|
if value_template is not None:
|
||||||
value_template.hass = hass
|
value_template.hass = hass
|
||||||
data = CommandSensorData(command)
|
data = CommandSensorData(command)
|
||||||
|
|
||||||
add_devices([CommandBinarySensor(
|
add_devices([CommandBinarySensor(
|
||||||
hass, data, name, sensor_class, payload_on, payload_off,
|
hass, data, name, device_class, payload_on, payload_off,
|
||||||
value_template)])
|
value_template)])
|
||||||
|
|
||||||
|
|
||||||
class CommandBinarySensor(BinarySensorDevice):
|
class CommandBinarySensor(BinarySensorDevice):
|
||||||
"""Represent a command line binary sensor."""
|
"""Represent a command line binary sensor."""
|
||||||
|
|
||||||
def __init__(self, hass, data, name, sensor_class, payload_on,
|
def __init__(self, hass, data, name, device_class, payload_on,
|
||||||
payload_off, value_template):
|
payload_off, value_template):
|
||||||
"""Initialize the Command line binary sensor."""
|
"""Initialize the Command line binary sensor."""
|
||||||
self._hass = hass
|
self._hass = hass
|
||||||
self.data = data
|
self.data = data
|
||||||
self._name = name
|
self._name = name
|
||||||
self._sensor_class = sensor_class
|
self._device_class = device_class
|
||||||
self._state = False
|
self._state = False
|
||||||
self._payload_on = payload_on
|
self._payload_on = payload_on
|
||||||
self._payload_off = payload_off
|
self._payload_off = payload_off
|
||||||
|
@ -80,9 +82,9 @@ class CommandBinarySensor(BinarySensorDevice):
|
||||||
return self._state
|
return self._state
|
||||||
|
|
||||||
@ property
|
@ property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of the binary sensor."""
|
"""Return the class of the binary sensor."""
|
||||||
return self._sensor_class
|
return self._device_class
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
"""Get the latest data and updates the state."""
|
"""Get the latest data and updates the state."""
|
||||||
|
|
|
@ -11,7 +11,7 @@ import requests
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
BinarySensorDevice, PLATFORM_SCHEMA, SENSOR_CLASSES)
|
BinarySensorDevice, PLATFORM_SCHEMA, DEVICE_CLASSES)
|
||||||
from homeassistant.const import (CONF_HOST, CONF_PORT)
|
from homeassistant.const import (CONF_HOST, CONF_PORT)
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ DEFAULT_SSL = False
|
||||||
SCAN_INTERVAL = datetime.timedelta(seconds=1)
|
SCAN_INTERVAL = datetime.timedelta(seconds=1)
|
||||||
|
|
||||||
ZONE_TYPES_SCHEMA = vol.Schema({
|
ZONE_TYPES_SCHEMA = vol.Schema({
|
||||||
cv.positive_int: vol.In(SENSOR_CLASSES),
|
cv.positive_int: vol.In(DEVICE_CLASSES),
|
||||||
})
|
})
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
|
@ -102,8 +102,8 @@ class Concord232ZoneSensor(BinarySensorDevice):
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
return self._zone_type
|
return self._zone_type
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
|
@ -18,14 +18,14 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
class DemoBinarySensor(BinarySensorDevice):
|
class DemoBinarySensor(BinarySensorDevice):
|
||||||
"""A Demo binary sensor."""
|
"""A Demo binary sensor."""
|
||||||
|
|
||||||
def __init__(self, name, state, sensor_class):
|
def __init__(self, name, state, device_class):
|
||||||
"""Initialize the demo sensor."""
|
"""Initialize the demo sensor."""
|
||||||
self._name = name
|
self._name = name
|
||||||
self._state = state
|
self._state = state
|
||||||
self._sensor_type = sensor_class
|
self._sensor_type = device_class
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor."""
|
"""Return the class of this sensor."""
|
||||||
return self._sensor_type
|
return self._sensor_type
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ class DigitalOceanBinarySensor(BinarySensorDevice):
|
||||||
return self.data.status == 'active'
|
return self.data.status == 'active'
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor."""
|
"""Return the class of this sensor."""
|
||||||
return DEFAULT_SENSOR_CLASS
|
return DEFAULT_SENSOR_CLASS
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ class EcobeeBinarySensor(BinarySensorDevice):
|
||||||
self.sensor_name = sensor_name
|
self.sensor_name = sensor_name
|
||||||
self.index = sensor_index
|
self.index = sensor_index
|
||||||
self._state = None
|
self._state = None
|
||||||
self._sensor_class = 'occupancy'
|
self._device_class = 'occupancy'
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -57,9 +57,9 @@ class EcobeeBinarySensor(BinarySensorDevice):
|
||||||
return "binary_sensor_ecobee_{}_{}".format(self._name, self.index)
|
return "binary_sensor_ecobee_{}_{}".format(self._name, self.index)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
return self._sensor_class
|
return self._device_class
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
"""Get the latest state of the sensor."""
|
"""Get the latest state of the sensor."""
|
||||||
|
|
|
@ -9,10 +9,12 @@ import logging
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
BinarySensorDevice, PLATFORM_SCHEMA, SENSOR_CLASSES_SCHEMA)
|
BinarySensorDevice, PLATFORM_SCHEMA, DEVICE_CLASSES_SCHEMA)
|
||||||
from homeassistant.components import enocean
|
from homeassistant.components import enocean
|
||||||
from homeassistant.const import (CONF_NAME, CONF_ID, CONF_SENSOR_CLASS)
|
from homeassistant.const import (
|
||||||
|
CONF_NAME, CONF_ID, CONF_SENSOR_CLASS, CONF_DEVICE_CLASS)
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
from homeassistant.helpers.deprecation import get_deprecated
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -22,7 +24,8 @@ DEFAULT_NAME = 'EnOcean binary sensor'
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(CONF_ID): vol.All(cv.ensure_list, [vol.Coerce(int)]),
|
vol.Required(CONF_ID): vol.All(cv.ensure_list, [vol.Coerce(int)]),
|
||||||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||||
vol.Optional(CONF_SENSOR_CLASS, default=None): SENSOR_CLASSES_SCHEMA,
|
vol.Optional(CONF_SENSOR_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
|
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,15 +33,15 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
"""Setup the Binary Sensor platform fo EnOcean."""
|
"""Setup the Binary Sensor platform fo EnOcean."""
|
||||||
dev_id = config.get(CONF_ID)
|
dev_id = config.get(CONF_ID)
|
||||||
devname = config.get(CONF_NAME)
|
devname = config.get(CONF_NAME)
|
||||||
sensor_class = config.get(CONF_SENSOR_CLASS)
|
device_class = get_deprecated(config, CONF_DEVICE_CLASS, CONF_SENSOR_CLASS)
|
||||||
|
|
||||||
add_devices([EnOceanBinarySensor(dev_id, devname, sensor_class)])
|
add_devices([EnOceanBinarySensor(dev_id, devname, device_class)])
|
||||||
|
|
||||||
|
|
||||||
class EnOceanBinarySensor(enocean.EnOceanDevice, BinarySensorDevice):
|
class EnOceanBinarySensor(enocean.EnOceanDevice, BinarySensorDevice):
|
||||||
"""Representation of EnOcean binary sensors such as wall switches."""
|
"""Representation of EnOcean binary sensors such as wall switches."""
|
||||||
|
|
||||||
def __init__(self, dev_id, devname, sensor_class):
|
def __init__(self, dev_id, devname, device_class):
|
||||||
"""Initialize the EnOcean binary sensor."""
|
"""Initialize the EnOcean binary sensor."""
|
||||||
enocean.EnOceanDevice.__init__(self)
|
enocean.EnOceanDevice.__init__(self)
|
||||||
self.stype = "listener"
|
self.stype = "listener"
|
||||||
|
@ -46,7 +49,7 @@ class EnOceanBinarySensor(enocean.EnOceanDevice, BinarySensorDevice):
|
||||||
self.which = -1
|
self.which = -1
|
||||||
self.onoff = -1
|
self.onoff = -1
|
||||||
self.devname = devname
|
self.devname = devname
|
||||||
self._sensor_class = sensor_class
|
self._device_class = device_class
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
|
@ -54,9 +57,9 @@ class EnOceanBinarySensor(enocean.EnOceanDevice, BinarySensorDevice):
|
||||||
return self.devname
|
return self.devname
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor."""
|
"""Return the class of this sensor."""
|
||||||
return self._sensor_class
|
return self._device_class
|
||||||
|
|
||||||
def value_changed(self, value, value2):
|
def value_changed(self, value, value2):
|
||||||
"""Fire an event with the data that have changed.
|
"""Fire an event with the data that have changed.
|
||||||
|
|
|
@ -60,8 +60,8 @@ class EnvisalinkBinarySensor(EnvisalinkDevice, BinarySensorDevice):
|
||||||
return self._info['status']['open']
|
return self._info['status']['open']
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
return self._zone_type
|
return self._zone_type
|
||||||
|
|
||||||
def _update_callback(self, zone):
|
def _update_callback(self, zone):
|
||||||
|
|
|
@ -122,6 +122,6 @@ class FFmpegMotion(FFmpegBinarySensor):
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
return "motion"
|
return "motion"
|
||||||
|
|
|
@ -91,6 +91,6 @@ class FFmpegNoise(FFmpegBinarySensor):
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
return "sound"
|
return "sound"
|
||||||
|
|
|
@ -179,12 +179,9 @@ class FlicButton(BinarySensorDevice):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def state_attributes(self):
|
def device_state_attributes(self):
|
||||||
"""Return device specific state attributes."""
|
"""Return device specific state attributes."""
|
||||||
attr = super(FlicButton, self).state_attributes
|
return {"address": self.address}
|
||||||
attr["address"] = self.address
|
|
||||||
|
|
||||||
return attr
|
|
||||||
|
|
||||||
def _queued_event_check(self, click_type, time_diff):
|
def _queued_event_check(self, click_type, time_diff):
|
||||||
"""Generate a log message and returns true if timeout exceeded."""
|
"""Generate a log message and returns true if timeout exceeded."""
|
||||||
|
|
|
@ -29,7 +29,7 @@ DEFAULT_DELAY = 0
|
||||||
|
|
||||||
ATTR_DELAY = 'delay'
|
ATTR_DELAY = 'delay'
|
||||||
|
|
||||||
SENSOR_CLASS_MAP = {
|
DEVICE_CLASS_MAP = {
|
||||||
'Motion': 'motion',
|
'Motion': 'motion',
|
||||||
'Line Crossing': 'motion',
|
'Line Crossing': 'motion',
|
||||||
'IO Trigger': None,
|
'IO Trigger': None,
|
||||||
|
@ -201,10 +201,10 @@ class HikvisionBinarySensor(BinarySensorDevice):
|
||||||
return self._sensor_state()
|
return self._sensor_state()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
try:
|
try:
|
||||||
return SENSOR_CLASS_MAP[self._sensor]
|
return DEVICE_CLASS_MAP[self._sensor]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
# Sensor must be unknown to us, add as generic
|
# Sensor must be unknown to us, add as generic
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -54,8 +54,8 @@ class HMBinarySensor(HMDevice, BinarySensorDevice):
|
||||||
return bool(self._hm_get_state())
|
return bool(self._hm_get_state())
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
if not self.available:
|
if not self.available:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ ATTR_ISS_NUMBER_PEOPLE_SPACE = 'number_of_people_in_space'
|
||||||
CONF_SHOW_ON_MAP = 'show_on_map'
|
CONF_SHOW_ON_MAP = 'show_on_map'
|
||||||
|
|
||||||
DEFAULT_NAME = 'ISS'
|
DEFAULT_NAME = 'ISS'
|
||||||
DEFAULT_SENSOR_CLASS = 'visible'
|
DEFAULT_DEVICE_CLASS = 'visible'
|
||||||
|
|
||||||
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60)
|
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60)
|
||||||
|
|
||||||
|
@ -77,9 +77,9 @@ class IssBinarySensor(BinarySensorDevice):
|
||||||
return self.iss_data.is_above if self.iss_data else False
|
return self.iss_data.is_above if self.iss_data else False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor."""
|
"""Return the class of this sensor."""
|
||||||
return DEFAULT_SENSOR_CLASS
|
return DEFAULT_DEVICE_CLASS
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def device_state_attributes(self):
|
def device_state_attributes(self):
|
||||||
|
|
|
@ -11,12 +11,13 @@ import voluptuous as vol
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
import homeassistant.components.mqtt as mqtt
|
import homeassistant.components.mqtt as mqtt
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
BinarySensorDevice, SENSOR_CLASSES)
|
BinarySensorDevice, DEVICE_CLASSES_SCHEMA)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_NAME, CONF_VALUE_TEMPLATE, CONF_PAYLOAD_ON, CONF_PAYLOAD_OFF,
|
CONF_NAME, CONF_VALUE_TEMPLATE, CONF_PAYLOAD_ON, CONF_PAYLOAD_OFF,
|
||||||
CONF_SENSOR_CLASS)
|
CONF_SENSOR_CLASS, CONF_DEVICE_CLASS)
|
||||||
from homeassistant.components.mqtt import (CONF_STATE_TOPIC, CONF_QOS)
|
from homeassistant.components.mqtt import (CONF_STATE_TOPIC, CONF_QOS)
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
from homeassistant.helpers.deprecation import get_deprecated
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -29,8 +30,8 @@ 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_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string,
|
vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string,
|
||||||
vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string,
|
vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string,
|
||||||
vol.Optional(CONF_SENSOR_CLASS, default=None):
|
vol.Optional(CONF_SENSOR_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
vol.Any(vol.In(SENSOR_CLASSES), vol.SetTo(None)),
|
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,7 +48,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
hass,
|
hass,
|
||||||
config.get(CONF_NAME),
|
config.get(CONF_NAME),
|
||||||
config.get(CONF_STATE_TOPIC),
|
config.get(CONF_STATE_TOPIC),
|
||||||
config.get(CONF_SENSOR_CLASS),
|
get_deprecated(config, CONF_DEVICE_CLASS, CONF_SENSOR_CLASS),
|
||||||
config.get(CONF_QOS),
|
config.get(CONF_QOS),
|
||||||
config.get(CONF_PAYLOAD_ON),
|
config.get(CONF_PAYLOAD_ON),
|
||||||
config.get(CONF_PAYLOAD_OFF),
|
config.get(CONF_PAYLOAD_OFF),
|
||||||
|
@ -58,14 +59,14 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
class MqttBinarySensor(BinarySensorDevice):
|
class MqttBinarySensor(BinarySensorDevice):
|
||||||
"""Representation a binary sensor that is updated by MQTT."""
|
"""Representation a binary sensor that is updated by MQTT."""
|
||||||
|
|
||||||
def __init__(self, hass, name, state_topic, sensor_class, qos, payload_on,
|
def __init__(self, hass, name, state_topic, device_class, qos, payload_on,
|
||||||
payload_off, value_template):
|
payload_off, value_template):
|
||||||
"""Initialize the MQTT binary sensor."""
|
"""Initialize the MQTT binary sensor."""
|
||||||
self._hass = hass
|
self._hass = hass
|
||||||
self._name = name
|
self._name = name
|
||||||
self._state = False
|
self._state = False
|
||||||
self._state_topic = state_topic
|
self._state_topic = state_topic
|
||||||
self._sensor_class = sensor_class
|
self._device_class = device_class
|
||||||
self._payload_on = payload_on
|
self._payload_on = payload_on
|
||||||
self._payload_off = payload_off
|
self._payload_off = payload_off
|
||||||
self._qos = qos
|
self._qos = qos
|
||||||
|
@ -101,6 +102,6 @@ class MqttBinarySensor(BinarySensorDevice):
|
||||||
return self._state
|
return self._state
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor."""
|
"""Return the class of this sensor."""
|
||||||
return self._sensor_class
|
return self._device_class
|
||||||
|
|
|
@ -7,7 +7,7 @@ https://home-assistant.io/components/binary_sensor.mysensors/
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from homeassistant.components import mysensors
|
from homeassistant.components import mysensors
|
||||||
from homeassistant.components.binary_sensor import (SENSOR_CLASSES,
|
from homeassistant.components.binary_sensor import (DEVICE_CLASSES,
|
||||||
BinarySensorDevice)
|
BinarySensorDevice)
|
||||||
from homeassistant.const import STATE_ON
|
from homeassistant.const import STATE_ON
|
||||||
|
|
||||||
|
@ -62,8 +62,8 @@ class MySensorsBinarySensor(
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
pres = self.gateway.const.Presentation
|
pres = self.gateway.const.Presentation
|
||||||
class_map = {
|
class_map = {
|
||||||
pres.S_DOOR: 'opening',
|
pres.S_DOOR: 'opening',
|
||||||
|
@ -78,5 +78,5 @@ class MySensorsBinarySensor(
|
||||||
pres.S_VIBRATION: 'vibration',
|
pres.S_VIBRATION: 'vibration',
|
||||||
pres.S_MOISTURE: 'moisture',
|
pres.S_MOISTURE: 'moisture',
|
||||||
})
|
})
|
||||||
if class_map.get(self.child_type) in SENSOR_CLASSES:
|
if class_map.get(self.child_type) in DEVICE_CLASSES:
|
||||||
return class_map.get(self.child_type)
|
return class_map.get(self.child_type)
|
||||||
|
|
|
@ -154,8 +154,8 @@ class NetatmoBinarySensor(BinarySensorDevice):
|
||||||
return self._unique_id
|
return self._unique_id
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
if self._cameratype == "NACamera":
|
if self._cameratype == "NACamera":
|
||||||
return WELCOME_SENSOR_TYPES.get(self._sensor_name)
|
return WELCOME_SENSOR_TYPES.get(self._sensor_name)
|
||||||
elif self._cameratype == "NOC":
|
elif self._cameratype == "NOC":
|
||||||
|
|
|
@ -12,7 +12,7 @@ import requests
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
SENSOR_CLASSES, BinarySensorDevice, PLATFORM_SCHEMA)
|
DEVICE_CLASSES, BinarySensorDevice, PLATFORM_SCHEMA)
|
||||||
from homeassistant.const import (CONF_HOST, CONF_PORT)
|
from homeassistant.const import (CONF_HOST, CONF_PORT)
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ DEFAULT_PORT = '5007'
|
||||||
DEFAULT_SSL = False
|
DEFAULT_SSL = False
|
||||||
|
|
||||||
ZONE_TYPES_SCHEMA = vol.Schema({
|
ZONE_TYPES_SCHEMA = vol.Schema({
|
||||||
cv.positive_int: vol.In(SENSOR_CLASSES),
|
cv.positive_int: vol.In(DEVICE_CLASSES),
|
||||||
})
|
})
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
|
@ -85,8 +85,8 @@ class NX584ZoneSensor(BinarySensorDevice):
|
||||||
self._zone_type = zone_type
|
self._zone_type = zone_type
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
return self._zone_type
|
return self._zone_type
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
|
@ -99,8 +99,8 @@ class OctoPrintBinarySensor(BinarySensorDevice):
|
||||||
return STATE_OFF
|
return STATE_OFF
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
|
|
|
@ -10,14 +10,15 @@ import voluptuous as vol
|
||||||
from requests.auth import HTTPBasicAuth, HTTPDigestAuth
|
from requests.auth import HTTPBasicAuth, HTTPDigestAuth
|
||||||
|
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
BinarySensorDevice, SENSOR_CLASSES_SCHEMA, PLATFORM_SCHEMA)
|
BinarySensorDevice, DEVICE_CLASSES_SCHEMA, PLATFORM_SCHEMA)
|
||||||
from homeassistant.components.sensor.rest import RestData
|
from homeassistant.components.sensor.rest import RestData
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_PAYLOAD, CONF_NAME, CONF_VALUE_TEMPLATE, CONF_METHOD, CONF_RESOURCE,
|
CONF_PAYLOAD, CONF_NAME, CONF_VALUE_TEMPLATE, CONF_METHOD, CONF_RESOURCE,
|
||||||
CONF_SENSOR_CLASS, CONF_VERIFY_SSL, CONF_USERNAME, CONF_PASSWORD,
|
CONF_SENSOR_CLASS, CONF_VERIFY_SSL, CONF_USERNAME, CONF_PASSWORD,
|
||||||
CONF_HEADERS, CONF_AUTHENTICATION, HTTP_BASIC_AUTHENTICATION,
|
CONF_HEADERS, CONF_AUTHENTICATION, HTTP_BASIC_AUTHENTICATION,
|
||||||
HTTP_DIGEST_AUTHENTICATION)
|
HTTP_DIGEST_AUTHENTICATION, CONF_DEVICE_CLASS)
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
from homeassistant.helpers.deprecation import get_deprecated
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -34,7 +35,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||||
vol.Optional(CONF_PASSWORD): cv.string,
|
vol.Optional(CONF_PASSWORD): cv.string,
|
||||||
vol.Optional(CONF_PAYLOAD): cv.string,
|
vol.Optional(CONF_PAYLOAD): cv.string,
|
||||||
vol.Optional(CONF_SENSOR_CLASS): SENSOR_CLASSES_SCHEMA,
|
vol.Optional(CONF_SENSOR_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
|
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
vol.Optional(CONF_USERNAME): cv.string,
|
vol.Optional(CONF_USERNAME): cv.string,
|
||||||
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
|
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
|
||||||
vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean,
|
vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean,
|
||||||
|
@ -51,7 +53,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
username = config.get(CONF_USERNAME)
|
username = config.get(CONF_USERNAME)
|
||||||
password = config.get(CONF_PASSWORD)
|
password = config.get(CONF_PASSWORD)
|
||||||
headers = config.get(CONF_HEADERS)
|
headers = config.get(CONF_HEADERS)
|
||||||
sensor_class = config.get(CONF_SENSOR_CLASS)
|
device_class = get_deprecated(config, CONF_DEVICE_CLASS, CONF_SENSOR_CLASS)
|
||||||
value_template = config.get(CONF_VALUE_TEMPLATE)
|
value_template = config.get(CONF_VALUE_TEMPLATE)
|
||||||
if value_template is not None:
|
if value_template is not None:
|
||||||
value_template.hass = hass
|
value_template.hass = hass
|
||||||
|
@ -72,18 +74,18 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
add_devices([RestBinarySensor(
|
add_devices([RestBinarySensor(
|
||||||
hass, rest, name, sensor_class, value_template)])
|
hass, rest, name, device_class, value_template)])
|
||||||
|
|
||||||
|
|
||||||
class RestBinarySensor(BinarySensorDevice):
|
class RestBinarySensor(BinarySensorDevice):
|
||||||
"""Representation of a REST binary sensor."""
|
"""Representation of a REST binary sensor."""
|
||||||
|
|
||||||
def __init__(self, hass, rest, name, sensor_class, value_template):
|
def __init__(self, hass, rest, name, device_class, value_template):
|
||||||
"""Initialize a REST binary sensor."""
|
"""Initialize a REST binary sensor."""
|
||||||
self._hass = hass
|
self._hass = hass
|
||||||
self.rest = rest
|
self.rest = rest
|
||||||
self._name = name
|
self._name = name
|
||||||
self._sensor_class = sensor_class
|
self._device_class = device_class
|
||||||
self._state = False
|
self._state = False
|
||||||
self._previous_data = None
|
self._previous_data = None
|
||||||
self._value_template = value_template
|
self._value_template = value_template
|
||||||
|
@ -95,9 +97,9 @@ class RestBinarySensor(BinarySensorDevice):
|
||||||
return self._name
|
return self._name
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor."""
|
"""Return the class of this sensor."""
|
||||||
return self._sensor_class
|
return self._device_class
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_on(self):
|
def is_on(self):
|
||||||
|
|
|
@ -42,7 +42,7 @@ class IsInBedBinarySensor(sleepiq.SleepIQSensor, BinarySensorDevice):
|
||||||
return self._state is True
|
return self._state is True
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor."""
|
"""Return the class of this sensor."""
|
||||||
return "occupancy"
|
return "occupancy"
|
||||||
|
|
||||||
|
|
|
@ -12,14 +12,15 @@ import voluptuous as vol
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
BinarySensorDevice, ENTITY_ID_FORMAT, PLATFORM_SCHEMA,
|
BinarySensorDevice, ENTITY_ID_FORMAT, PLATFORM_SCHEMA,
|
||||||
SENSOR_CLASSES_SCHEMA)
|
DEVICE_CLASSES_SCHEMA)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_FRIENDLY_NAME, ATTR_ENTITY_ID, CONF_VALUE_TEMPLATE,
|
ATTR_FRIENDLY_NAME, ATTR_ENTITY_ID, CONF_VALUE_TEMPLATE,
|
||||||
CONF_SENSOR_CLASS, CONF_SENSORS)
|
CONF_SENSOR_CLASS, CONF_SENSORS, CONF_DEVICE_CLASS)
|
||||||
from homeassistant.exceptions import TemplateError
|
from homeassistant.exceptions import TemplateError
|
||||||
from homeassistant.helpers.entity import async_generate_entity_id
|
from homeassistant.helpers.entity import async_generate_entity_id
|
||||||
from homeassistant.helpers.event import async_track_state_change
|
from homeassistant.helpers.event import async_track_state_change
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
from homeassistant.helpers.deprecation import get_deprecated
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -27,7 +28,8 @@ SENSOR_SCHEMA = vol.Schema({
|
||||||
vol.Required(CONF_VALUE_TEMPLATE): cv.template,
|
vol.Required(CONF_VALUE_TEMPLATE): cv.template,
|
||||||
vol.Optional(ATTR_FRIENDLY_NAME): cv.string,
|
vol.Optional(ATTR_FRIENDLY_NAME): cv.string,
|
||||||
vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
|
vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
|
||||||
vol.Optional(CONF_SENSOR_CLASS, default=None): SENSOR_CLASSES_SCHEMA
|
vol.Optional(CONF_SENSOR_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
|
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
})
|
})
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
|
@ -45,7 +47,8 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
||||||
entity_ids = (device_config.get(ATTR_ENTITY_ID) or
|
entity_ids = (device_config.get(ATTR_ENTITY_ID) or
|
||||||
value_template.extract_entities())
|
value_template.extract_entities())
|
||||||
friendly_name = device_config.get(ATTR_FRIENDLY_NAME, device)
|
friendly_name = device_config.get(ATTR_FRIENDLY_NAME, device)
|
||||||
sensor_class = device_config.get(CONF_SENSOR_CLASS)
|
device_class = get_deprecated(
|
||||||
|
device_config, CONF_DEVICE_CLASS, CONF_SENSOR_CLASS)
|
||||||
|
|
||||||
if value_template is not None:
|
if value_template is not None:
|
||||||
value_template.hass = hass
|
value_template.hass = hass
|
||||||
|
@ -55,7 +58,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
||||||
hass,
|
hass,
|
||||||
device,
|
device,
|
||||||
friendly_name,
|
friendly_name,
|
||||||
sensor_class,
|
device_class,
|
||||||
value_template,
|
value_template,
|
||||||
entity_ids)
|
entity_ids)
|
||||||
)
|
)
|
||||||
|
@ -70,14 +73,14 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
||||||
class BinarySensorTemplate(BinarySensorDevice):
|
class BinarySensorTemplate(BinarySensorDevice):
|
||||||
"""A virtual binary sensor that triggers from another sensor."""
|
"""A virtual binary sensor that triggers from another sensor."""
|
||||||
|
|
||||||
def __init__(self, hass, device, friendly_name, sensor_class,
|
def __init__(self, hass, device, friendly_name, device_class,
|
||||||
value_template, entity_ids):
|
value_template, entity_ids):
|
||||||
"""Initialize the Template binary sensor."""
|
"""Initialize the Template binary sensor."""
|
||||||
self.hass = hass
|
self.hass = hass
|
||||||
self.entity_id = async_generate_entity_id(ENTITY_ID_FORMAT, device,
|
self.entity_id = async_generate_entity_id(ENTITY_ID_FORMAT, device,
|
||||||
hass=hass)
|
hass=hass)
|
||||||
self._name = friendly_name
|
self._name = friendly_name
|
||||||
self._sensor_class = sensor_class
|
self._device_class = device_class
|
||||||
self._template = value_template
|
self._template = value_template
|
||||||
self._state = None
|
self._state = None
|
||||||
|
|
||||||
|
@ -100,9 +103,9 @@ class BinarySensorTemplate(BinarySensorDevice):
|
||||||
return self._state
|
return self._state
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the sensor class of the sensor."""
|
"""Return the sensor class of the sensor."""
|
||||||
return self._sensor_class
|
return self._device_class
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def should_poll(self):
|
def should_poll(self):
|
||||||
|
|
|
@ -11,11 +11,12 @@ import voluptuous as vol
|
||||||
|
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
BinarySensorDevice, PLATFORM_SCHEMA, SENSOR_CLASSES_SCHEMA)
|
BinarySensorDevice, PLATFORM_SCHEMA, DEVICE_CLASSES_SCHEMA)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_NAME, CONF_ENTITY_ID, CONF_TYPE, STATE_UNKNOWN, CONF_SENSOR_CLASS,
|
CONF_NAME, CONF_ENTITY_ID, CONF_TYPE, STATE_UNKNOWN, CONF_SENSOR_CLASS,
|
||||||
ATTR_ENTITY_ID)
|
ATTR_ENTITY_ID, CONF_DEVICE_CLASS)
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
|
from homeassistant.helpers.deprecation import get_deprecated
|
||||||
from homeassistant.helpers.event import async_track_state_change
|
from homeassistant.helpers.event import async_track_state_change
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
@ -37,7 +38,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(CONF_THRESHOLD): vol.Coerce(float),
|
vol.Required(CONF_THRESHOLD): vol.Coerce(float),
|
||||||
vol.Required(CONF_TYPE): vol.In(SENSOR_TYPES),
|
vol.Required(CONF_TYPE): vol.In(SENSOR_TYPES),
|
||||||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||||
vol.Optional(CONF_SENSOR_CLASS, default=None): SENSOR_CLASSES_SCHEMA,
|
vol.Optional(CONF_SENSOR_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
|
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,11 +50,11 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
||||||
name = config.get(CONF_NAME)
|
name = config.get(CONF_NAME)
|
||||||
threshold = config.get(CONF_THRESHOLD)
|
threshold = config.get(CONF_THRESHOLD)
|
||||||
limit_type = config.get(CONF_TYPE)
|
limit_type = config.get(CONF_TYPE)
|
||||||
sensor_class = config.get(CONF_SENSOR_CLASS)
|
device_class = get_deprecated(config, CONF_DEVICE_CLASS, CONF_SENSOR_CLASS)
|
||||||
|
|
||||||
yield from async_add_devices(
|
yield from async_add_devices(
|
||||||
[ThresholdSensor(hass, entity_id, name, threshold, limit_type,
|
[ThresholdSensor(hass, entity_id, name, threshold, limit_type,
|
||||||
sensor_class)], True)
|
device_class)], True)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,14 +62,14 @@ class ThresholdSensor(BinarySensorDevice):
|
||||||
"""Representation of a Threshold sensor."""
|
"""Representation of a Threshold sensor."""
|
||||||
|
|
||||||
def __init__(self, hass, entity_id, name, threshold, limit_type,
|
def __init__(self, hass, entity_id, name, threshold, limit_type,
|
||||||
sensor_class):
|
device_class):
|
||||||
"""Initialize the Threshold sensor."""
|
"""Initialize the Threshold sensor."""
|
||||||
self._hass = hass
|
self._hass = hass
|
||||||
self._entity_id = entity_id
|
self._entity_id = entity_id
|
||||||
self.is_upper = limit_type == 'upper'
|
self.is_upper = limit_type == 'upper'
|
||||||
self._name = name
|
self._name = name
|
||||||
self._threshold = threshold
|
self._threshold = threshold
|
||||||
self._sensor_class = sensor_class
|
self._device_class = device_class
|
||||||
self._deviation = False
|
self._deviation = False
|
||||||
self.sensor_value = 0
|
self.sensor_value = 0
|
||||||
|
|
||||||
|
@ -105,9 +107,9 @@ class ThresholdSensor(BinarySensorDevice):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the sensor class of the sensor."""
|
"""Return the sensor class of the sensor."""
|
||||||
return self._sensor_class
|
return self._device_class
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def device_state_attributes(self):
|
def device_state_attributes(self):
|
||||||
|
|
|
@ -15,12 +15,14 @@ from homeassistant.components.binary_sensor import (
|
||||||
BinarySensorDevice,
|
BinarySensorDevice,
|
||||||
ENTITY_ID_FORMAT,
|
ENTITY_ID_FORMAT,
|
||||||
PLATFORM_SCHEMA,
|
PLATFORM_SCHEMA,
|
||||||
SENSOR_CLASSES_SCHEMA)
|
DEVICE_CLASSES_SCHEMA)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_FRIENDLY_NAME,
|
ATTR_FRIENDLY_NAME,
|
||||||
ATTR_ENTITY_ID,
|
ATTR_ENTITY_ID,
|
||||||
CONF_SENSOR_CLASS,
|
CONF_SENSOR_CLASS,
|
||||||
|
CONF_DEVICE_CLASS,
|
||||||
STATE_UNKNOWN,)
|
STATE_UNKNOWN,)
|
||||||
|
from homeassistant.helpers.deprecation import get_deprecated
|
||||||
from homeassistant.helpers.entity import generate_entity_id
|
from homeassistant.helpers.entity import generate_entity_id
|
||||||
from homeassistant.helpers.event import track_state_change
|
from homeassistant.helpers.event import track_state_change
|
||||||
|
|
||||||
|
@ -34,8 +36,8 @@ SENSOR_SCHEMA = vol.Schema({
|
||||||
vol.Optional(CONF_ATTRIBUTE): cv.string,
|
vol.Optional(CONF_ATTRIBUTE): cv.string,
|
||||||
vol.Optional(ATTR_FRIENDLY_NAME): cv.string,
|
vol.Optional(ATTR_FRIENDLY_NAME): cv.string,
|
||||||
vol.Optional(CONF_INVERT, default=False): cv.boolean,
|
vol.Optional(CONF_INVERT, default=False): cv.boolean,
|
||||||
vol.Optional(CONF_SENSOR_CLASS, default=None): SENSOR_CLASSES_SCHEMA
|
vol.Optional(CONF_SENSOR_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
|
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
|
||||||
})
|
})
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
|
@ -52,7 +54,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
entity_id = device_config[ATTR_ENTITY_ID]
|
entity_id = device_config[ATTR_ENTITY_ID]
|
||||||
attribute = device_config.get(CONF_ATTRIBUTE)
|
attribute = device_config.get(CONF_ATTRIBUTE)
|
||||||
friendly_name = device_config.get(ATTR_FRIENDLY_NAME, device)
|
friendly_name = device_config.get(ATTR_FRIENDLY_NAME, device)
|
||||||
sensor_class = device_config[CONF_SENSOR_CLASS]
|
device_class = get_deprecated(
|
||||||
|
device_config, CONF_DEVICE_CLASS, CONF_SENSOR_CLASS)
|
||||||
invert = device_config[CONF_INVERT]
|
invert = device_config[CONF_INVERT]
|
||||||
|
|
||||||
sensors.append(
|
sensors.append(
|
||||||
|
@ -62,7 +65,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
friendly_name,
|
friendly_name,
|
||||||
entity_id,
|
entity_id,
|
||||||
attribute,
|
attribute,
|
||||||
sensor_class,
|
device_class,
|
||||||
invert)
|
invert)
|
||||||
)
|
)
|
||||||
if not sensors:
|
if not sensors:
|
||||||
|
@ -76,7 +79,7 @@ class SensorTrend(BinarySensorDevice):
|
||||||
"""Representation of a trend Sensor."""
|
"""Representation of a trend Sensor."""
|
||||||
|
|
||||||
def __init__(self, hass, device_id, friendly_name,
|
def __init__(self, hass, device_id, friendly_name,
|
||||||
target_entity, attribute, sensor_class, invert):
|
target_entity, attribute, device_class, invert):
|
||||||
"""Initialize the sensor."""
|
"""Initialize the sensor."""
|
||||||
self._hass = hass
|
self._hass = hass
|
||||||
self.entity_id = generate_entity_id(ENTITY_ID_FORMAT, device_id,
|
self.entity_id = generate_entity_id(ENTITY_ID_FORMAT, device_id,
|
||||||
|
@ -84,7 +87,7 @@ class SensorTrend(BinarySensorDevice):
|
||||||
self._name = friendly_name
|
self._name = friendly_name
|
||||||
self._target_entity = target_entity
|
self._target_entity = target_entity
|
||||||
self._attribute = attribute
|
self._attribute = attribute
|
||||||
self._sensor_class = sensor_class
|
self._device_class = device_class
|
||||||
self._invert = invert
|
self._invert = invert
|
||||||
self._state = None
|
self._state = None
|
||||||
self.from_state = None
|
self.from_state = None
|
||||||
|
@ -111,9 +114,9 @@ class SensorTrend(BinarySensorDevice):
|
||||||
return self._state
|
return self._state
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the sensor class of the sensor."""
|
"""Return the sensor class of the sensor."""
|
||||||
return self._sensor_class
|
return self._device_class
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def should_poll(self):
|
def should_poll(self):
|
||||||
|
|
|
@ -107,8 +107,8 @@ class WinkBinarySensorDevice(WinkDevice, BinarySensorDevice, Entity):
|
||||||
return self.wink.state()
|
return self.wink.state()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
return SENSOR_TYPES.get(self.capability)
|
return SENSOR_TYPES.get(self.capability)
|
||||||
|
|
||||||
|
|
||||||
|
@ -161,8 +161,8 @@ class WinkRemote(WinkBinarySensorDevice):
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -48,9 +48,9 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
class ZWaveBinarySensor(BinarySensorDevice, zwave.ZWaveDeviceEntity):
|
class ZWaveBinarySensor(BinarySensorDevice, zwave.ZWaveDeviceEntity):
|
||||||
"""Representation of a binary sensor within Z-Wave."""
|
"""Representation of a binary sensor within Z-Wave."""
|
||||||
|
|
||||||
def __init__(self, value, sensor_class):
|
def __init__(self, value, device_class):
|
||||||
"""Initialize the sensor."""
|
"""Initialize the sensor."""
|
||||||
self._sensor_type = sensor_class
|
self._sensor_type = device_class
|
||||||
zwave.ZWaveDeviceEntity.__init__(self, value, DOMAIN)
|
zwave.ZWaveDeviceEntity.__init__(self, value, DOMAIN)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -59,8 +59,8 @@ class ZWaveBinarySensor(BinarySensorDevice, zwave.ZWaveDeviceEntity):
|
||||||
return self._value.data
|
return self._value.data
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sensor_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this sensor, from SENSOR_CLASSES."""
|
"""Return the class of this sensor, from DEVICE_CLASSES."""
|
||||||
return self._sensor_type
|
return self._sensor_type
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -72,9 +72,9 @@ class ZWaveBinarySensor(BinarySensorDevice, zwave.ZWaveDeviceEntity):
|
||||||
class ZWaveTriggerSensor(ZWaveBinarySensor):
|
class ZWaveTriggerSensor(ZWaveBinarySensor):
|
||||||
"""Representation of a stateless sensor within Z-Wave."""
|
"""Representation of a stateless sensor within Z-Wave."""
|
||||||
|
|
||||||
def __init__(self, value, sensor_class, hass, re_arm_sec=60):
|
def __init__(self, value, device_class, hass, re_arm_sec=60):
|
||||||
"""Initialize the sensor."""
|
"""Initialize the sensor."""
|
||||||
super(ZWaveTriggerSensor, self).__init__(value, sensor_class)
|
super(ZWaveTriggerSensor, self).__init__(value, device_class)
|
||||||
self._hass = hass
|
self._hass = hass
|
||||||
self.re_arm_sec = re_arm_sec
|
self.re_arm_sec = re_arm_sec
|
||||||
self.invalidate_after = dt_util.utcnow() + datetime.timedelta(
|
self.invalidate_after = dt_util.utcnow() + datetime.timedelta(
|
||||||
|
|
|
@ -20,6 +20,7 @@ from homeassistant.config import load_yaml_config_file
|
||||||
from homeassistant.helpers.entity import Entity
|
from homeassistant.helpers.entity import Entity
|
||||||
from homeassistant.helpers.entity_component import EntityComponent
|
from homeassistant.helpers.entity_component import EntityComponent
|
||||||
from homeassistant.helpers.config_validation import PLATFORM_SCHEMA # noqa
|
from homeassistant.helpers.config_validation import PLATFORM_SCHEMA # noqa
|
||||||
|
from homeassistant.helpers.deprecation import deprecated_substitute
|
||||||
from homeassistant.components.http import HomeAssistantView, KEY_AUTHENTICATED
|
from homeassistant.components.http import HomeAssistantView, KEY_AUTHENTICATED
|
||||||
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
@ -520,40 +521,9 @@ class MediaPlayerDevice(Entity):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def supported_media_commands(self):
|
@deprecated_substitute('supported_media_commands')
|
||||||
"""Flag media commands that are supported.
|
|
||||||
|
|
||||||
DEPRECATED: Included for temporary custom platform compatibility.
|
|
||||||
"""
|
|
||||||
return None
|
|
||||||
|
|
||||||
@property
|
|
||||||
def supported_features(self):
|
def supported_features(self):
|
||||||
"""Flag media player features that are supported."""
|
"""Flag media player features that are supported."""
|
||||||
# Begin temporary transition logic
|
|
||||||
|
|
||||||
if self.supported_media_commands is not None:
|
|
||||||
# If this platform is still using supported_media_commands, issue
|
|
||||||
# a logger warning once with instructions on how to fix it.
|
|
||||||
if not getattr(self, '_supported_features_warned', False):
|
|
||||||
def show_warning():
|
|
||||||
"""Show a deprecation warning in the log for this class."""
|
|
||||||
import inspect
|
|
||||||
_LOGGER.warning(
|
|
||||||
"supported_media_commands is deprecated. Please "
|
|
||||||
"rename supported_media_commands to "
|
|
||||||
"supported_features in '%s' to ensure future support.",
|
|
||||||
inspect.getfile(self.__class__))
|
|
||||||
# This is a temporary attribute. We don't want to pollute
|
|
||||||
# __init__ so it can be easily removed.
|
|
||||||
# pylint: disable=attribute-defined-outside-init
|
|
||||||
self._supported_features_warned = True
|
|
||||||
self.hass.add_job(show_warning)
|
|
||||||
|
|
||||||
# Return the old property
|
|
||||||
return self.supported_media_commands
|
|
||||||
|
|
||||||
# End temporary transition logic
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def turn_on(self):
|
def turn_on(self):
|
||||||
|
|
|
@ -78,6 +78,7 @@ CONF_CONDITION = 'condition'
|
||||||
CONF_COVERS = 'covers'
|
CONF_COVERS = 'covers'
|
||||||
CONF_CUSTOMIZE = 'customize'
|
CONF_CUSTOMIZE = 'customize'
|
||||||
CONF_DEVICE = 'device'
|
CONF_DEVICE = 'device'
|
||||||
|
CONF_DEVICE_CLASS = 'device_class'
|
||||||
CONF_DEVICES = 'devices'
|
CONF_DEVICES = 'devices'
|
||||||
CONF_DISARM_AFTER_TRIGGER = 'disarm_after_trigger'
|
CONF_DISARM_AFTER_TRIGGER = 'disarm_after_trigger'
|
||||||
CONF_DISCOVERY = 'discovery'
|
CONF_DISCOVERY = 'discovery'
|
||||||
|
@ -291,6 +292,9 @@ ATTR_OPTION = 'option'
|
||||||
# Bitfield of supported component features for the entity
|
# Bitfield of supported component features for the entity
|
||||||
ATTR_SUPPORTED_FEATURES = 'supported_features'
|
ATTR_SUPPORTED_FEATURES = 'supported_features'
|
||||||
|
|
||||||
|
# Class of device within its domain
|
||||||
|
ATTR_DEVICE_CLASS = 'device_class'
|
||||||
|
|
||||||
# #### SERVICES ####
|
# #### SERVICES ####
|
||||||
SERVICE_HOMEASSISTANT_STOP = 'stop'
|
SERVICE_HOMEASSISTANT_STOP = 'stop'
|
||||||
SERVICE_HOMEASSISTANT_RESTART = 'restart'
|
SERVICE_HOMEASSISTANT_RESTART = 'restart'
|
||||||
|
|
56
homeassistant/helpers/deprecation.py
Normal file
56
homeassistant/helpers/deprecation.py
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
"""Deprecation helpers for Home Assistant."""
|
||||||
|
|
||||||
|
import inspect
|
||||||
|
import logging
|
||||||
|
|
||||||
|
|
||||||
|
def deprecated_substitute(substitute_name):
|
||||||
|
"""Help migrate properties to new names.
|
||||||
|
|
||||||
|
When a property is added to replace an older property, this decorator can
|
||||||
|
be added to the new property, listing the old property as the substitute.
|
||||||
|
If the old property is defined, it's value will be used instead, and a log
|
||||||
|
warning will be issued alerting the user of the impending change.
|
||||||
|
"""
|
||||||
|
def decorator(func):
|
||||||
|
"""Decorator function."""
|
||||||
|
def func_wrapper(self):
|
||||||
|
"""Wrapper for original function."""
|
||||||
|
if hasattr(self, substitute_name):
|
||||||
|
# If this platform is still using the old property, issue
|
||||||
|
# a logger warning once with instructions on how to fix it.
|
||||||
|
warnings = getattr(func, '_deprecated_substitute_warnings', {})
|
||||||
|
module_name = self.__module__
|
||||||
|
if not warnings.get(module_name):
|
||||||
|
logger = logging.getLogger(module_name)
|
||||||
|
logger.warning(
|
||||||
|
"%s is deprecated. Please rename %s to "
|
||||||
|
"%s in '%s' to ensure future support.",
|
||||||
|
substitute_name, substitute_name, func.__name__,
|
||||||
|
inspect.getfile(self.__class__))
|
||||||
|
warnings[module_name] = True
|
||||||
|
# pylint: disable=protected-access
|
||||||
|
func._deprecated_substitute_warnings = warnings
|
||||||
|
|
||||||
|
# Return the old property
|
||||||
|
return getattr(self, substitute_name)
|
||||||
|
else:
|
||||||
|
return func(self)
|
||||||
|
return func_wrapper
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
|
def get_deprecated(config, new_name, old_name, default=None):
|
||||||
|
"""Allow an old config name to be deprecated with a replacement.
|
||||||
|
|
||||||
|
If the new config isn't found, but the old one is, the old value is used
|
||||||
|
and a warning is issued to the user.
|
||||||
|
"""
|
||||||
|
if old_name in config:
|
||||||
|
module_name = inspect.getmodule(inspect.stack()[1][0]).__name__
|
||||||
|
logger = logging.getLogger(module_name)
|
||||||
|
logger.warning(
|
||||||
|
"%s is deprecated. Please rename %s to %s in your "
|
||||||
|
"configuration file.", old_name, old_name, new_name)
|
||||||
|
return config.get(old_name)
|
||||||
|
return config.get(new_name, default)
|
|
@ -10,7 +10,7 @@ from homeassistant.const import (
|
||||||
ATTR_ASSUMED_STATE, ATTR_FRIENDLY_NAME, ATTR_HIDDEN, ATTR_ICON,
|
ATTR_ASSUMED_STATE, ATTR_FRIENDLY_NAME, ATTR_HIDDEN, ATTR_ICON,
|
||||||
ATTR_UNIT_OF_MEASUREMENT, DEVICE_DEFAULT_NAME, STATE_OFF, STATE_ON,
|
ATTR_UNIT_OF_MEASUREMENT, DEVICE_DEFAULT_NAME, STATE_OFF, STATE_ON,
|
||||||
STATE_UNAVAILABLE, STATE_UNKNOWN, TEMP_CELSIUS, TEMP_FAHRENHEIT,
|
STATE_UNAVAILABLE, STATE_UNKNOWN, TEMP_CELSIUS, TEMP_FAHRENHEIT,
|
||||||
ATTR_ENTITY_PICTURE, ATTR_SUPPORTED_FEATURES)
|
ATTR_ENTITY_PICTURE, ATTR_SUPPORTED_FEATURES, ATTR_DEVICE_CLASS)
|
||||||
from homeassistant.core import HomeAssistant, DOMAIN as CORE_DOMAIN
|
from homeassistant.core import HomeAssistant, DOMAIN as CORE_DOMAIN
|
||||||
from homeassistant.exceptions import NoEntitySpecifiedError
|
from homeassistant.exceptions import NoEntitySpecifiedError
|
||||||
from homeassistant.util import ensure_unique_string, slugify
|
from homeassistant.util import ensure_unique_string, slugify
|
||||||
|
@ -109,6 +109,11 @@ class Entity(object):
|
||||||
"""
|
"""
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def device_class(self) -> str:
|
||||||
|
"""Return the class of this device, from component DEVICE_CLASSES."""
|
||||||
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def unit_of_measurement(self):
|
def unit_of_measurement(self):
|
||||||
"""Return the unit of measurement of this entity, if any."""
|
"""Return the unit of measurement of this entity, if any."""
|
||||||
|
@ -236,6 +241,7 @@ class Entity(object):
|
||||||
self._attr_setter('assumed_state', bool, ATTR_ASSUMED_STATE, attr)
|
self._attr_setter('assumed_state', bool, ATTR_ASSUMED_STATE, attr)
|
||||||
self._attr_setter('supported_features', int, ATTR_SUPPORTED_FEATURES,
|
self._attr_setter('supported_features', int, ATTR_SUPPORTED_FEATURES,
|
||||||
attr)
|
attr)
|
||||||
|
self._attr_setter('device_class', str, ATTR_DEVICE_CLASS, attr)
|
||||||
|
|
||||||
end = timer()
|
end = timer()
|
||||||
|
|
||||||
|
|
|
@ -23,13 +23,3 @@ class TestBinarySensor(unittest.TestCase):
|
||||||
new=True):
|
new=True):
|
||||||
self.assertEqual(STATE_ON,
|
self.assertEqual(STATE_ON,
|
||||||
binary_sensor.BinarySensorDevice().state)
|
binary_sensor.BinarySensorDevice().state)
|
||||||
|
|
||||||
def test_attributes(self):
|
|
||||||
"""Test binary sensor attributes."""
|
|
||||||
sensor = binary_sensor.BinarySensorDevice()
|
|
||||||
self.assertEqual({}, sensor.state_attributes)
|
|
||||||
with mock.patch('homeassistant.components.binary_sensor.'
|
|
||||||
'BinarySensorDevice.sensor_class',
|
|
||||||
new='motion'):
|
|
||||||
self.assertEqual({'sensor_class': 'motion'},
|
|
||||||
sensor.state_attributes)
|
|
||||||
|
|
|
@ -47,32 +47,32 @@ class TestSensorMQTT(unittest.TestCase):
|
||||||
state = self.hass.states.get('binary_sensor.test')
|
state = self.hass.states.get('binary_sensor.test')
|
||||||
self.assertEqual(STATE_OFF, state.state)
|
self.assertEqual(STATE_OFF, state.state)
|
||||||
|
|
||||||
def test_valid_sensor_class(self):
|
def test_valid_device_class(self):
|
||||||
"""Test the setting of a valid sensor class."""
|
"""Test the setting of a valid sensor class."""
|
||||||
self.hass.config.components = set(['mqtt'])
|
self.hass.config.components = set(['mqtt'])
|
||||||
assert setup_component(self.hass, binary_sensor.DOMAIN, {
|
assert setup_component(self.hass, binary_sensor.DOMAIN, {
|
||||||
binary_sensor.DOMAIN: {
|
binary_sensor.DOMAIN: {
|
||||||
'platform': 'mqtt',
|
'platform': 'mqtt',
|
||||||
'name': 'test',
|
'name': 'test',
|
||||||
'sensor_class': 'motion',
|
'device_class': 'motion',
|
||||||
'state_topic': 'test-topic',
|
'state_topic': 'test-topic',
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
state = self.hass.states.get('binary_sensor.test')
|
state = self.hass.states.get('binary_sensor.test')
|
||||||
self.assertEqual('motion', state.attributes.get('sensor_class'))
|
self.assertEqual('motion', state.attributes.get('device_class'))
|
||||||
|
|
||||||
def test_invalid_sensor_class(self):
|
def test_invalid_device_class(self):
|
||||||
"""Test the setting of an invalid sensor class."""
|
"""Test the setting of an invalid sensor class."""
|
||||||
self.hass.config.components = set(['mqtt'])
|
self.hass.config.components = set(['mqtt'])
|
||||||
assert setup_component(self.hass, binary_sensor.DOMAIN, {
|
assert setup_component(self.hass, binary_sensor.DOMAIN, {
|
||||||
binary_sensor.DOMAIN: {
|
binary_sensor.DOMAIN: {
|
||||||
'platform': 'mqtt',
|
'platform': 'mqtt',
|
||||||
'name': 'test',
|
'name': 'test',
|
||||||
'sensor_class': 'abc123',
|
'device_class': 'abc123',
|
||||||
'state_topic': 'test-topic',
|
'state_topic': 'test-topic',
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
state = self.hass.states.get('binary_sensor.test')
|
state = self.hass.states.get('binary_sensor.test')
|
||||||
self.assertIsNone(state.attributes.get('sensor_class'))
|
self.assertIsNone(state)
|
||||||
|
|
|
@ -36,7 +36,7 @@ class TestBinarySensorTemplate(unittest.TestCase):
|
||||||
'test': {
|
'test': {
|
||||||
'friendly_name': 'virtual thingy',
|
'friendly_name': 'virtual thingy',
|
||||||
'value_template': '{{ foo }}',
|
'value_template': '{{ foo }}',
|
||||||
'sensor_class': 'motion',
|
'device_class': 'motion',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -66,7 +66,7 @@ class TestBinarySensorTemplate(unittest.TestCase):
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
def test_setup_invalid_sensor_class(self):
|
def test_setup_invalid_device_class(self):
|
||||||
""""Test setup with invalid sensor class."""
|
""""Test setup with invalid sensor class."""
|
||||||
with assert_setup_component(0):
|
with assert_setup_component(0):
|
||||||
assert bootstrap.setup_component(self.hass, 'binary_sensor', {
|
assert bootstrap.setup_component(self.hass, 'binary_sensor', {
|
||||||
|
@ -75,7 +75,7 @@ class TestBinarySensorTemplate(unittest.TestCase):
|
||||||
'sensors': {
|
'sensors': {
|
||||||
'test': {
|
'test': {
|
||||||
'value_template': '{{ foo }}',
|
'value_template': '{{ foo }}',
|
||||||
'sensor_class': 'foobarnotreal',
|
'device_class': 'foobarnotreal',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,7 @@ class TestBinarySensorTemplate(unittest.TestCase):
|
||||||
'platform': 'template',
|
'platform': 'template',
|
||||||
'sensors': {
|
'sensors': {
|
||||||
'test': {
|
'test': {
|
||||||
'sensor_class': 'motion',
|
'device_class': 'motion',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ class TestBinarySensorTemplate(unittest.TestCase):
|
||||||
template_hlpr.Template('{{ 1 > 1 }}', self.hass), MATCH_ALL
|
template_hlpr.Template('{{ 1 > 1 }}', self.hass), MATCH_ALL
|
||||||
).result()
|
).result()
|
||||||
self.assertFalse(vs.should_poll)
|
self.assertFalse(vs.should_poll)
|
||||||
self.assertEqual('motion', vs.sensor_class)
|
self.assertEqual('motion', vs.device_class)
|
||||||
self.assertEqual('Parent', vs.name)
|
self.assertEqual('Parent', vs.name)
|
||||||
|
|
||||||
vs.update()
|
vs.update()
|
||||||
|
|
|
@ -2,12 +2,13 @@
|
||||||
# pylint: disable=protected-access
|
# pylint: disable=protected-access
|
||||||
import asyncio
|
import asyncio
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
import homeassistant.helpers.entity as entity
|
import homeassistant.helpers.entity as entity
|
||||||
from homeassistant.helpers.customize import set_customize
|
from homeassistant.helpers.customize import set_customize
|
||||||
from homeassistant.const import ATTR_HIDDEN
|
from homeassistant.const import ATTR_HIDDEN, ATTR_DEVICE_CLASS
|
||||||
|
|
||||||
from tests.common import get_test_home_assistant
|
from tests.common import get_test_home_assistant
|
||||||
|
|
||||||
|
@ -119,3 +120,13 @@ class TestHelpersEntity(object):
|
||||||
ent = AsyncEntity()
|
ent = AsyncEntity()
|
||||||
ent.update()
|
ent.update()
|
||||||
assert len(async_update) == 1
|
assert len(async_update) == 1
|
||||||
|
|
||||||
|
def test_device_class(self):
|
||||||
|
"""Test device class attribute."""
|
||||||
|
state = self.hass.states.get(self.entity.entity_id)
|
||||||
|
assert state.attributes.get(ATTR_DEVICE_CLASS) is None
|
||||||
|
with patch('homeassistant.helpers.entity.Entity.device_class',
|
||||||
|
new='test_class'):
|
||||||
|
self.entity.update_ha_state()
|
||||||
|
state = self.hass.states.get(self.entity.entity_id)
|
||||||
|
assert state.attributes.get(ATTR_DEVICE_CLASS) == 'test_class'
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue