Add target high/low temperatures to prometheus integration (#50071)

* add target high/low temperatures to prometheus integration

* use labels

* Revert "use labels"

This reverts commit 09c56d6359.

* fix naming

* tests

* cleanup

* use three separate metrics

* fix descriptions
This commit is contained in:
Matt Zimmerman 2021-08-03 22:42:47 -07:00 committed by GitHub
parent c682d5d5e4
commit 515a47212e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 14 deletions

View file

@ -10,6 +10,8 @@ from homeassistant import core as hacore
from homeassistant.components.climate.const import ( from homeassistant.components.climate.const import (
ATTR_CURRENT_TEMPERATURE, ATTR_CURRENT_TEMPERATURE,
ATTR_HVAC_ACTION, ATTR_HVAC_ACTION,
ATTR_TARGET_TEMP_HIGH,
ATTR_TARGET_TEMP_LOW,
CURRENT_HVAC_ACTIONS, CURRENT_HVAC_ACTIONS,
) )
from homeassistant.components.http import HomeAssistantView from homeassistant.components.http import HomeAssistantView
@ -315,28 +317,43 @@ class PrometheusMetrics:
value = self.state_as_number(state) value = self.state_as_number(state)
metric.labels(**self._labels(state)).set(value) metric.labels(**self._labels(state)).set(value)
def _handle_climate(self, state): def _handle_climate_temp(self, state, attr, metric_name, metric_description):
temp = state.attributes.get(ATTR_TEMPERATURE) temp = state.attributes.get(attr)
if temp: if temp:
if self._climate_units == TEMP_FAHRENHEIT: if self._climate_units == TEMP_FAHRENHEIT:
temp = fahrenheit_to_celsius(temp) temp = fahrenheit_to_celsius(temp)
metric = self._metric( metric = self._metric(
"climate_target_temperature_celsius", metric_name,
self.prometheus_cli.Gauge, self.prometheus_cli.Gauge,
"Target temperature in degrees Celsius", metric_description,
) )
metric.labels(**self._labels(state)).set(temp) metric.labels(**self._labels(state)).set(temp)
current_temp = state.attributes.get(ATTR_CURRENT_TEMPERATURE) def _handle_climate(self, state):
if current_temp: self._handle_climate_temp(
if self._climate_units == TEMP_FAHRENHEIT: state,
current_temp = fahrenheit_to_celsius(current_temp) ATTR_TEMPERATURE,
metric = self._metric( "climate_target_temperature_celsius",
"Target temperature in degrees Celsius",
)
self._handle_climate_temp(
state,
ATTR_TARGET_TEMP_HIGH,
"climate_target_temperature_high_celsius",
"Target high temperature in degrees Celsius",
)
self._handle_climate_temp(
state,
ATTR_TARGET_TEMP_LOW,
"climate_target_temperature_low_celsius",
"Target low temperature in degrees Celsius",
)
self._handle_climate_temp(
state,
ATTR_CURRENT_TEMPERATURE,
"climate_current_temperature_celsius", "climate_current_temperature_celsius",
self.prometheus_cli.Gauge,
"Current temperature in degrees Celsius", "Current temperature in degrees Celsius",
) )
metric.labels(**self._labels(state)).set(current_temp)
current_action = state.attributes.get(ATTR_HVAC_ACTION) current_action = state.attributes.get(ATTR_HVAC_ACTION)
if current_action: if current_action:

View file

@ -137,6 +137,24 @@ async def test_view_empty_namespace(hass, hass_client):
'friendly_name="HeatPump"} 25.0' in body 'friendly_name="HeatPump"} 25.0' in body
) )
assert (
'climate_target_temperature_celsius{domain="climate",'
'entity="climate.heatpump",'
'friendly_name="HeatPump"} 20.0' in body
)
assert (
'climate_target_temperature_low_celsius{domain="climate",'
'entity="climate.ecobee",'
'friendly_name="Ecobee"} 21.0' in body
)
assert (
'climate_target_temperature_high_celsius{domain="climate",'
'entity="climate.ecobee",'
'friendly_name="Ecobee"} 24.0' in body
)
assert ( assert (
'humidifier_target_humidity_percent{domain="humidifier",' 'humidifier_target_humidity_percent{domain="humidifier",'
'entity="humidifier.humidifier",' 'entity="humidifier.humidifier",'