Add entity_picture property

pull/1384/head
Paulus Schoutsen 2016-02-23 22:41:24 -08:00
parent 8dc6443d14
commit 967a751da1
7 changed files with 67 additions and 45 deletions

View File

@ -15,7 +15,6 @@ from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.components import bloomsky
from homeassistant.const import (
ATTR_ENTITY_PICTURE,
HTTP_NOT_FOUND,
ATTR_ENTITY_ID,
)
@ -132,6 +131,11 @@ class Camera(Entity):
"""No need to poll cameras."""
return False
@property
def entity_picture(self):
"""Return a link to the camera feed as entity picture."""
return ENTITY_IMAGE_URL.format(self.entity_id)
@property
# pylint: disable=no-self-use
def is_recording(self):
@ -195,9 +199,7 @@ class Camera(Entity):
@property
def state_attributes(self):
"""Camera state attributes."""
attr = {
ATTR_ENTITY_PICTURE: ENTITY_IMAGE_URL.format(self.entity_id),
}
attr = {}
if self.model:
attr['model_name'] = self.model

View File

@ -25,7 +25,7 @@ import homeassistant.util.dt as dt_util
from homeassistant.helpers.event import track_utc_time_change
from homeassistant.const import (
ATTR_ENTITY_PICTURE, ATTR_GPS_ACCURACY, ATTR_LATITUDE, ATTR_LONGITUDE,
ATTR_GPS_ACCURACY, ATTR_LATITUDE, ATTR_LONGITUDE,
DEVICE_DEFAULT_NAME, STATE_HOME, STATE_NOT_HOME)
DOMAIN = "device_tracker"
@ -297,14 +297,16 @@ class Device(Entity):
""" State of the device. """
return self._state
@property
def entity_picture(self):
"""Picture of the device."""
return self.config_picture
@property
def state_attributes(self):
""" Device state attributes. """
attr = {}
if self.config_picture:
attr[ATTR_ENTITY_PICTURE] = self.config_picture
if self.gps:
attr[ATTR_LATITUDE] = self.gps[0]
attr[ATTR_LONGITUDE] = self.gps[1]

View File

@ -15,7 +15,7 @@ from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.const import (
STATE_OFF, STATE_UNKNOWN, STATE_PLAYING, STATE_IDLE,
ATTR_ENTITY_ID, ATTR_ENTITY_PICTURE, SERVICE_TURN_OFF, SERVICE_TURN_ON,
ATTR_ENTITY_ID, SERVICE_TURN_OFF, SERVICE_TURN_ON,
SERVICE_VOLUME_UP, SERVICE_VOLUME_DOWN, SERVICE_VOLUME_SET,
SERVICE_VOLUME_MUTE, SERVICE_TOGGLE,
SERVICE_MEDIA_PLAY_PAUSE, SERVICE_MEDIA_PLAY, SERVICE_MEDIA_PAUSE,
@ -525,6 +525,11 @@ class MediaPlayerDevice(Entity):
else:
self.media_play()
@property
def entity_picture(self):
"""Return image of the media playing."""
return None if self.state == STATE_OFF else self.media_image_url
@property
def state_attributes(self):
""" Return the state attributes. """
@ -538,7 +543,4 @@ class MediaPlayerDevice(Entity):
in ATTR_TO_PROPERTY if getattr(self, attr) is not None
}
if self.media_image_url:
state_attr[ATTR_ENTITY_PICTURE] = self.media_image_url
return state_attr

View File

@ -7,7 +7,7 @@ For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/sensor.steam_online/
"""
from homeassistant.helpers.entity import Entity
from homeassistant.const import (ATTR_ENTITY_PICTURE, CONF_API_KEY)
from homeassistant.const import CONF_API_KEY
ICON = 'mdi:steam'
@ -62,11 +62,9 @@ class SteamSensor(Entity):
}.get(self._profile.status, 'Offline')
@property
def device_state_attributes(self):
""" Returns the state attributes. """
return {
ATTR_ENTITY_PICTURE: self._profile.avatar_medium
}
def entity_picture(self):
"""Avatar of the account."""
return self._profile.avatar_medium
@property
def icon(self):

View File

@ -4,7 +4,6 @@ Support for the Twitch stream status.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/sensor.twitch/
"""
from homeassistant.const import ATTR_ENTITY_PICTURE
from homeassistant.helpers.entity import Entity
STATE_STREAMING = 'streaming'
@ -51,6 +50,11 @@ class TwitchSensor(Entity):
"""State of the sensor."""
return self._state
@property
def entity_picture(self):
"""Preview of current game."""
return self._preview
# pylint: disable=no-member
def update(self):
"""Update device state."""
@ -62,6 +66,7 @@ class TwitchSensor(Entity):
self._preview = stream.get('preview').get('small')
self._state = STATE_STREAMING
else:
self._preview = None
self._state = STATE_OFFLINE
@property
@ -71,7 +76,6 @@ class TwitchSensor(Entity):
return {
ATTR_GAME: self._game,
ATTR_TITLE: self._title,
ATTR_ENTITY_PICTURE: self._preview
}
@property

View File

@ -8,8 +8,7 @@ import logging
import requests
from homeassistant.const import (
ATTR_ENTITY_PICTURE, CONF_LATITUDE, CONF_LONGITUDE)
from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE
from homeassistant.helpers.entity import Entity
from homeassistant.util import dt as dt_util
from homeassistant.util import location
@ -97,20 +96,21 @@ class YrSensor(Entity):
"""Returns the state of the device."""
return self._state
@property
def entity_picture(self):
"""Weather symbol if type is symbol."""
if self.type != 'symbol':
return None
return "http://api.met.no/weatherapi/weathericon/1.1/" \
"?symbol={0};content_type=image/png".format(self._state)
@property
def device_state_attributes(self):
"""Returns state attributes. """
data = {
return {
'about': "Weather forecast from yr.no, delivered by the"
" Norwegian Meteorological Institute and the NRK"
}
if self.type == 'symbol':
symbol_nr = self._state
data[ATTR_ENTITY_PICTURE] = \
"http://api.met.no/weatherapi/weathericon/1.1/" \
"?symbol={0};content_type=image/png".format(symbol_nr)
return data
@property
def unit_of_measurement(self):

View File

@ -10,7 +10,8 @@ from collections import defaultdict
from homeassistant.const import (
ATTR_ASSUMED_STATE, ATTR_FRIENDLY_NAME, ATTR_HIDDEN, ATTR_ICON,
ATTR_UNIT_OF_MEASUREMENT, DEVICE_DEFAULT_NAME, STATE_OFF, STATE_ON,
STATE_UNAVAILABLE, STATE_UNKNOWN, TEMP_CELCIUS, TEMP_FAHRENHEIT)
STATE_UNAVAILABLE, STATE_UNKNOWN, TEMP_CELCIUS, TEMP_FAHRENHEIT,
ATTR_ENTITY_PICTURE)
from homeassistant.exceptions import NoEntitySpecifiedError
from homeassistant.util import ensure_unique_string, slugify
@ -105,6 +106,11 @@ class Entity(object):
"""Return the icon to use in the frontend, if any."""
return None
@property
def entity_picture(self):
"""Return the entity picture to use in the frontend, if any."""
return None
@property
def hidden(self):
"""Return True if the entity should be hidden from UIs."""
@ -157,25 +163,18 @@ class Entity(object):
if device_attr is not None:
attr.update(device_attr)
if ATTR_UNIT_OF_MEASUREMENT not in attr and \
self.unit_of_measurement is not None:
attr[ATTR_UNIT_OF_MEASUREMENT] = str(self.unit_of_measurement)
self._attr_setter('unit_of_measurement', str, ATTR_UNIT_OF_MEASUREMENT,
attr)
if not self.available:
state = STATE_UNAVAILABLE
attr = {}
if self.name is not None:
attr[ATTR_FRIENDLY_NAME] = str(self.name)
if self.icon is not None:
attr[ATTR_ICON] = str(self.icon)
if self.hidden:
attr[ATTR_HIDDEN] = bool(self.hidden)
if self.assumed_state:
attr[ATTR_ASSUMED_STATE] = bool(self.assumed_state)
self._attr_setter('name', str, ATTR_FRIENDLY_NAME, attr)
self._attr_setter('icon', str, ATTR_ICON, attr)
self._attr_setter('entity_picture', str, ATTR_ENTITY_PICTURE, attr)
self._attr_setter('hidden', bool, ATTR_HIDDEN, attr)
self._attr_setter('assumed_state', bool, ATTR_ASSUMED_STATE, attr)
# overwrite properties that have been set in the config file
attr.update(_OVERWRITE.get(self.entity_id, {}))
@ -195,6 +194,21 @@ class Entity(object):
return self.hass.states.set(self.entity_id, state, attr)
def _attr_setter(self, name, typ, attr, attrs):
"""Helper method to populate attributes based on properties."""
if attr in attrs:
return
value = getattr(self, name)
if not value:
return
try:
attrs[attr] = typ(value)
except (TypeError, ValueError):
pass
def __eq__(self, other):
return (isinstance(other, Entity) and
other.unique_id == self.unique_id)