Export climate status and target temperature to Prometheus (#10919)

* Export climate metrics to Prometheus.

This adds climate_state and temperature_c metrics for each climate
device.

* Add more climate states to state_as_number
This commit is contained in:
drop table USERS; -- 2017-12-04 12:39:26 +00:00 committed by Martin Hjelmare
parent 19a97580fc
commit 31cedf83c7
2 changed files with 28 additions and 5 deletions

View File

@ -14,7 +14,8 @@ from homeassistant.components.http import HomeAssistantView
from homeassistant.components import recorder from homeassistant.components import recorder
from homeassistant.const import ( from homeassistant.const import (
CONF_DOMAINS, CONF_ENTITIES, CONF_EXCLUDE, CONF_INCLUDE, TEMP_CELSIUS, CONF_DOMAINS, CONF_ENTITIES, CONF_EXCLUDE, CONF_INCLUDE, TEMP_CELSIUS,
EVENT_STATE_CHANGED, TEMP_FAHRENHEIT, CONTENT_TYPE_TEXT_PLAIN) EVENT_STATE_CHANGED, TEMP_FAHRENHEIT, CONTENT_TYPE_TEXT_PLAIN,
ATTR_TEMPERATURE, ATTR_UNIT_OF_MEASUREMENT)
from homeassistant import core as hacore from homeassistant import core as hacore
from homeassistant.helpers import state as state_helper from homeassistant.helpers import state as state_helper
from homeassistant.util.temperature import fahrenheit_to_celsius from homeassistant.util.temperature import fahrenheit_to_celsius
@ -159,6 +160,26 @@ class Metrics(object):
value = state_helper.state_as_number(state) value = state_helper.state_as_number(state)
metric.labels(**self._labels(state)).set(value) metric.labels(**self._labels(state)).set(value)
def _handle_climate(self, state):
temp = state.attributes.get(ATTR_TEMPERATURE)
if temp:
unit = state.attributes.get(ATTR_UNIT_OF_MEASUREMENT)
if unit == TEMP_FAHRENHEIT:
temp = fahrenheit_to_celsius(temp)
metric = self._metric(
'temperature_c', self.prometheus_client.Gauge,
'Temperature in degrees Celsius')
metric.labels(**self._labels(state)).set(temp)
metric = self._metric(
'climate_state', self.prometheus_client.Gauge,
'State of the thermostat (0/1)')
try:
value = state_helper.state_as_number(state)
metric.labels(**self._labels(state)).set(value)
except ValueError:
pass
def _handle_sensor(self, state): def _handle_sensor(self, state):
_sensor_types = { _sensor_types = {
TEMP_CELSIUS: ( TEMP_CELSIUS: (
@ -199,7 +220,7 @@ class Metrics(object):
), ),
} }
unit = state.attributes.get('unit_of_measurement') unit = state.attributes.get(ATTR_UNIT_OF_MEASUREMENT)
metric = _sensor_types.get(unit) metric = _sensor_types.get(unit)
if metric is not None: if metric is not None:

View File

@ -21,7 +21,8 @@ from homeassistant.components.climate import (
ATTR_HUMIDITY, ATTR_OPERATION_MODE, ATTR_SWING_MODE, ATTR_HUMIDITY, ATTR_OPERATION_MODE, ATTR_SWING_MODE,
SERVICE_SET_AUX_HEAT, SERVICE_SET_AWAY_MODE, SERVICE_SET_HOLD_MODE, SERVICE_SET_AUX_HEAT, SERVICE_SET_AWAY_MODE, SERVICE_SET_HOLD_MODE,
SERVICE_SET_FAN_MODE, SERVICE_SET_HUMIDITY, SERVICE_SET_OPERATION_MODE, SERVICE_SET_FAN_MODE, SERVICE_SET_HUMIDITY, SERVICE_SET_OPERATION_MODE,
SERVICE_SET_SWING_MODE, SERVICE_SET_TEMPERATURE) SERVICE_SET_SWING_MODE, SERVICE_SET_TEMPERATURE, STATE_HEAT, STATE_COOL,
STATE_IDLE)
from homeassistant.components.climate.ecobee import ( from homeassistant.components.climate.ecobee import (
ATTR_FAN_MIN_ON_TIME, SERVICE_SET_FAN_MIN_ON_TIME, ATTR_FAN_MIN_ON_TIME, SERVICE_SET_FAN_MIN_ON_TIME,
ATTR_RESUME_ALL, SERVICE_RESUME_PROGRAM) ATTR_RESUME_ALL, SERVICE_RESUME_PROGRAM)
@ -210,10 +211,11 @@ def state_as_number(state):
Raises ValueError if this is not possible. Raises ValueError if this is not possible.
""" """
if state.state in (STATE_ON, STATE_LOCKED, STATE_ABOVE_HORIZON, if state.state in (STATE_ON, STATE_LOCKED, STATE_ABOVE_HORIZON,
STATE_OPEN, STATE_HOME): STATE_OPEN, STATE_HOME, STATE_HEAT, STATE_COOL):
return 1 return 1
elif state.state in (STATE_OFF, STATE_UNLOCKED, STATE_UNKNOWN, elif state.state in (STATE_OFF, STATE_UNLOCKED, STATE_UNKNOWN,
STATE_BELOW_HORIZON, STATE_CLOSED, STATE_NOT_HOME): STATE_BELOW_HORIZON, STATE_CLOSED, STATE_NOT_HOME,
STATE_IDLE):
return 0 return 0
return float(state.state) return float(state.state)