""" The Habitica sensor. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/sensor.habitica/ """ import logging from datetime import timedelta from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle from homeassistant.components import habitica _LOGGER = logging.getLogger(__name__) MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=15) async def async_setup_platform( hass, config, async_add_devices, discovery_info=None): """Set up the habitica platform.""" if discovery_info is None: return name = discovery_info[habitica.CONF_NAME] sensors = discovery_info[habitica.CONF_SENSORS] sensor_data = HabitipyData(hass.data[habitica.DOMAIN][name]) await sensor_data.update() async_add_devices([ HabitipySensor(name, sensor, sensor_data) for sensor in sensors ], True) class HabitipyData: """Habitica API user data cache.""" def __init__(self, api): """ Habitica API user data cache. api - HAHabitipyAsync object """ self.api = api self.data = None @Throttle(MIN_TIME_BETWEEN_UPDATES) async def update(self): """Get a new fix from Habitica servers.""" self.data = await self.api.user.get() class HabitipySensor(Entity): """A generic Habitica sensor.""" def __init__(self, name, sensor_name, updater): """ Init a generic Habitica sensor. name - Habitica platform name sensor_name - one of the names from ALL_SENSOR_TYPES """ self._name = name self._sensor_name = sensor_name self._sensor_type = habitica.SENSORS_TYPES[sensor_name] self._state = None self._updater = updater async def async_update(self): """Update Condition and Forecast.""" await self._updater.update() data = self._updater.data for element in self._sensor_type.path: data = data[element] self._state = data @property def icon(self): """Return the icon to use in the frontend, if any.""" return self._sensor_type.icon @property def name(self): """Return the name of the sensor.""" return "{0}_{1}_{2}".format( habitica.DOMAIN, self._name, self._sensor_name) @property def state(self): """Return the state of the device.""" return self._state @property def unit_of_measurement(self): """Return the unit the value is expressed in.""" return self._sensor_type.unit