"""Platform to retrieve uptime for Home Assistant.""" import logging import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import CONF_NAME, CONF_UNIT_OF_MEASUREMENT import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity import homeassistant.util.dt as dt_util _LOGGER = logging.getLogger(__name__) DEFAULT_NAME = "Uptime" ICON = "mdi:clock" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_UNIT_OF_MEASUREMENT, default="days"): vol.All( cv.string, vol.In(["minutes", "hours", "days"]) ), } ) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the uptime sensor platform.""" name = config.get(CONF_NAME) units = config.get(CONF_UNIT_OF_MEASUREMENT) async_add_entities([UptimeSensor(name, units)], True) class UptimeSensor(Entity): """Representation of an uptime sensor.""" def __init__(self, name, unit): """Initialize the uptime sensor.""" self._name = name self._unit = unit self.initial = dt_util.now() self._state = None @property def name(self): """Return the name of the sensor.""" return self._name @property def icon(self): """Icon to display in the front end.""" return ICON @property def unit_of_measurement(self): """Return the unit of measurement the value is expressed in.""" return self._unit @property def state(self): """Return the state of the sensor.""" return self._state async def async_update(self): """Update the state of the sensor.""" delta = dt_util.now() - self.initial div_factor = 3600 if self.unit_of_measurement == "days": div_factor *= 24 elif self.unit_of_measurement == "minutes": div_factor /= 60 delta = delta.total_seconds() / div_factor self._state = round(delta, 2) _LOGGER.debug("New value: %s", delta)