"""Parse prices of an item from gearbest.""" import logging from datetime import timedelta import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA import homeassistant.helpers.config_validation as cv from homeassistant.util import Throttle from homeassistant.helpers.entity import Entity from homeassistant.helpers.event import track_time_interval from homeassistant.const import CONF_NAME, CONF_ID, CONF_URL, CONF_CURRENCY _LOGGER = logging.getLogger(__name__) CONF_ITEMS = "items" ICON = "mdi:coin" MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=2 * 60 * 60) # 2h MIN_TIME_BETWEEN_CURRENCY_UPDATES = timedelta(seconds=12 * 60 * 60) # 12h _ITEM_SCHEMA = vol.All( vol.Schema( { vol.Exclusive(CONF_URL, "XOR"): cv.string, vol.Exclusive(CONF_ID, "XOR"): cv.string, vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_CURRENCY): cv.string, } ), cv.has_at_least_one_key(CONF_URL, CONF_ID), ) _ITEMS_SCHEMA = vol.Schema([_ITEM_SCHEMA]) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( {vol.Required(CONF_ITEMS): _ITEMS_SCHEMA, vol.Required(CONF_CURRENCY): cv.string} ) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Gearbest sensor.""" from gearbest_parser import CurrencyConverter currency = config.get(CONF_CURRENCY) sensors = [] items = config.get(CONF_ITEMS) converter = CurrencyConverter() converter.update() for item in items: try: sensors.append(GearbestSensor(converter, item, currency)) except ValueError as exc: _LOGGER.error(exc) def currency_update(event_time): """Update currency list.""" converter.update() track_time_interval(hass, currency_update, MIN_TIME_BETWEEN_CURRENCY_UPDATES) add_entities(sensors, True) class GearbestSensor(Entity): """Implementation of the sensor.""" def __init__(self, converter, item, currency): """Initialize the sensor.""" from gearbest_parser import GearbestParser self._name = item.get(CONF_NAME) self._parser = GearbestParser() self._parser.set_currency_converter(converter) self._item = self._parser.load( item.get(CONF_ID), item.get(CONF_URL), item.get(CONF_CURRENCY, currency) ) if self._item is None: raise ValueError("id and url could not be resolved") @property def name(self): """Return the name of the item.""" return self._name if self._name is not None else self._item.name @property def icon(self): """Return the icon for the frontend.""" return ICON @property def state(self): """Return the price of the selected product.""" return self._item.price @property def unit_of_measurement(self): """Return the currency.""" return self._item.currency @property def entity_picture(self): """Return the image.""" return self._item.image @property def device_state_attributes(self): """Return the state attributes.""" attrs = { "name": self._item.name, "description": self._item.description, "currency": self._item.currency, "url": self._item.url, } return attrs @Throttle(MIN_TIME_BETWEEN_UPDATES) def update(self): """Get the latest price from gearbest and updates the state.""" self._item.update()