Add entity_picture property
parent
8dc6443d14
commit
967a751da1
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue