diff --git a/homeassistant/components/prometheus/__init__.py b/homeassistant/components/prometheus/__init__.py index 845178cdbd2..cf689f408d9 100644 --- a/homeassistant/components/prometheus/__init__.py +++ b/homeassistant/components/prometheus/__init__.py @@ -13,6 +13,11 @@ from homeassistant.components.climate.const import ( CURRENT_HVAC_ACTIONS, ) from homeassistant.components.http import HomeAssistantView +from homeassistant.components.humidifier.const import ( + ATTR_AVAILABLE_MODES, + ATTR_HUMIDITY, + ATTR_MODE, +) from homeassistant.const import ( ATTR_DEVICE_CLASS, ATTR_TEMPERATURE, @@ -318,6 +323,41 @@ class PrometheusMetrics: float(action == current_action) ) + def _handle_humidifier(self, state): + humidifier_target_humidity_percent = state.attributes.get(ATTR_HUMIDITY) + if humidifier_target_humidity_percent: + metric = self._metric( + "humidifier_target_humidity_percent", + self.prometheus_cli.Gauge, + "Target Relative Humidity", + ) + metric.labels(**self._labels(state)).set(humidifier_target_humidity_percent) + + metric = self._metric( + "humidifier_state", + self.prometheus_cli.Gauge, + "State of the humidifier (0/1)", + ) + try: + value = self.state_as_number(state) + metric.labels(**self._labels(state)).set(value) + except ValueError: + pass + + current_mode = state.attributes.get(ATTR_MODE) + available_modes = state.attributes.get(ATTR_AVAILABLE_MODES) + if current_mode and available_modes: + metric = self._metric( + "humidifier_mode", + self.prometheus_cli.Gauge, + "Humidifier Mode", + ["mode"], + ) + for mode in available_modes: + metric.labels(**dict(self._labels(state), mode=mode)).set( + float(mode == current_mode) + ) + def _handle_sensor(self, state): unit = self._unit_string(state.attributes.get(ATTR_UNIT_OF_MEASUREMENT)) diff --git a/tests/components/prometheus/test_init.py b/tests/components/prometheus/test_init.py index 7b5f3182595..42cb286268d 100644 --- a/tests/components/prometheus/test_init.py +++ b/tests/components/prometheus/test_init.py @@ -4,7 +4,7 @@ from dataclasses import dataclass import pytest from homeassistant import setup -from homeassistant.components import climate, sensor +from homeassistant.components import climate, humidifier, sensor from homeassistant.components.demo.sensor import DemoSensor import homeassistant.components.prometheus as prometheus from homeassistant.const import ( @@ -44,6 +44,10 @@ async def prometheus_client(loop, hass, hass_client): ) await hass.async_block_till_done() + await setup.async_setup_component( + hass, humidifier.DOMAIN, {"humidifier": [{"platform": "demo"}]} + ) + sensor1 = DemoSensor( None, "Television Energy", 74, None, ENERGY_KILO_WATT_HOUR, None ) @@ -120,6 +124,31 @@ async def test_view(prometheus_client): # pylint: disable=redefined-outer-name 'friendly_name="HeatPump"} 25.0' in body ) + assert ( + 'humidifier_target_humidity_percent{domain="humidifier",' + 'entity="humidifier.humidifier",' + 'friendly_name="Humidifier"} 68.0' in body + ) + + assert ( + 'humidifier_state{domain="humidifier",' + 'entity="humidifier.dehumidifier",' + 'friendly_name="Dehumidifier"} 1.0' in body + ) + + assert ( + 'humidifier_mode{domain="humidifier",' + 'entity="humidifier.hygrostat",' + 'friendly_name="Hygrostat",' + 'mode="home"} 1.0' in body + ) + assert ( + 'humidifier_mode{domain="humidifier",' + 'entity="humidifier.hygrostat",' + 'friendly_name="Hygrostat",' + 'mode="eco"} 0.0' in body + ) + assert ( 'humidity_percent{domain="sensor",' 'entity="sensor.outside_humidity",'