core/homeassistant/components/sensor/apcupsd.py

88 lines
2.3 KiB
Python
Raw Normal View History

2016-02-10 16:32:18 +00:00
"""
homeassistant.components.sensor.apcupsd
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Provides a sensor to track various status aspects of a UPS.
"""
import logging
from homeassistant.const import TEMP_CELCIUS
from homeassistant.helpers.entity import Entity
from homeassistant.components import apcupsd
DEPENDENCIES = [apcupsd.DOMAIN]
DEFAULT_NAME = "UPS Status"
SPECIFIC_UNITS = {
"ITEMP": TEMP_CELCIUS
}
_LOGGER = logging.getLogger(__name__)
def setup_platform(hass, config, add_entities, discovery_info=None):
"""
Ensure that the 'type' config value has been set and use a specific unit
of measurement if required.
"""
typ = config.get(apcupsd.CONF_TYPE)
if typ is None:
_LOGGER.error(
"You must include a '%s' when configuring an APCUPSd sensor.",
apcupsd.CONF_TYPE)
return False
2016-02-10 16:32:18 +00:00
typ = typ.upper()
if typ not in apcupsd.DATA.status:
_LOGGER.error(
"Specified '%s' of '%s' does not appear in the APCUPSd status "
"output.", apcupsd.CONF_TYPE, typ)
return False
2016-02-10 16:32:18 +00:00
add_entities((
Sensor(config, apcupsd.DATA, unit=SPECIFIC_UNITS.get(typ)),
2016-02-10 16:32:18 +00:00
))
def infer_unit(value):
"""
If the value ends with any of the units from ALL_UNITS, split the unit
off the end of the value and return the value, unit tuple pair. Else return
the original value and None as the unit.
"""
from apcaccess.status import ALL_UNITS
for unit in ALL_UNITS:
if value.endswith(unit):
return value[:-len(unit)], unit
return value, None
class Sensor(Entity):
""" Generic sensor entity for APCUPSd status values. """
def __init__(self, config, data, unit=None):
2016-02-10 16:32:18 +00:00
self._config = config
self._unit = unit
self._data = data
2016-02-10 16:32:18 +00:00
self._inferred_unit = None
self.update()
2016-02-10 16:32:18 +00:00
@property
def name(self):
return self._config.get("name", DEFAULT_NAME)
@property
def state(self):
return self._state
@property
def unit_of_measurement(self):
if self._unit is None:
return self._inferred_unit
return self._unit
def update(self):
""" Get the latest status and use it to update our sensor state. """
key = self._config[apcupsd.CONF_TYPE].upper()
self._state, self._inferred_unit = infer_unit(self._data.status[key])