From e9cd9f88be00f5c75b8abacb39b67d3e5bbac79c Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Fri, 22 Mar 2019 13:16:17 -0700 Subject: [PATCH] Fix Prometheus casting issues (#22282) ## Description: Fix Prometheus casting issues **Related issue (if applicable):** fixes #8659. ## Checklist: - [x] The code change is tested and works locally. - [x] Local tests pass with `tox`. **Your PR cannot be merged unless tests pass** - [x] There is no commented out code in this PR. --- .../components/prometheus/__init__.py | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/prometheus/__init__.py b/homeassistant/components/prometheus/__init__.py index 9053a872134..de0de8ae162 100644 --- a/homeassistant/components/prometheus/__init__.py +++ b/homeassistant/components/prometheus/__init__.py @@ -103,6 +103,16 @@ class PrometheusMetrics: full_metric_name, documentation, labels) return self._metrics[metric] + @staticmethod + def state_as_number(state): + """Return a state casted to a float.""" + try: + value = state_helper.state_as_number(state) + except ValueError: + _LOGGER.warning("Could not convert %s to float", state) + value = 0 + return value + @staticmethod def _labels(state): return { @@ -130,7 +140,7 @@ class PrometheusMetrics: self.prometheus_client.Gauge, 'State of the binary sensor (0/1)', ) - value = state_helper.state_as_number(state) + value = self.state_as_number(state) metric.labels(**self._labels(state)).set(value) def _handle_input_boolean(self, state): @@ -139,7 +149,7 @@ class PrometheusMetrics: self.prometheus_client.Gauge, 'State of the input boolean (0/1)', ) - value = state_helper.state_as_number(state) + value = self.state_as_number(state) metric.labels(**self._labels(state)).set(value) def _handle_device_tracker(self, state): @@ -148,7 +158,7 @@ class PrometheusMetrics: self.prometheus_client.Gauge, 'State of the device tracker (0/1)', ) - value = state_helper.state_as_number(state) + value = self.state_as_number(state) metric.labels(**self._labels(state)).set(value) def _handle_person(self, state): @@ -157,7 +167,7 @@ class PrometheusMetrics: self.prometheus_client.Gauge, 'State of the person (0/1)', ) - value = state_helper.state_as_number(state) + value = self.state_as_number(state) metric.labels(**self._labels(state)).set(value) def _handle_light(self, state): @@ -171,7 +181,7 @@ class PrometheusMetrics: if 'brightness' in state.attributes: value = state.attributes['brightness'] / 255.0 else: - value = state_helper.state_as_number(state) + value = self.state_as_number(state) value = value * 100 metric.labels(**self._labels(state)).set(value) except ValueError: @@ -183,7 +193,7 @@ class PrometheusMetrics: self.prometheus_client.Gauge, 'State of the lock (0/1)', ) - value = state_helper.state_as_number(state) + value = self.state_as_number(state) metric.labels(**self._labels(state)).set(value) def _handle_climate(self, state): @@ -209,7 +219,7 @@ class PrometheusMetrics: 'climate_state', self.prometheus_client.Gauge, 'State of the thermostat (0/1)') try: - value = state_helper.state_as_number(state) + value = self.state_as_number(state) metric.labels(**self._labels(state)).set(value) except ValueError: pass @@ -232,7 +242,7 @@ class PrometheusMetrics: state.entity_id) try: - value = state_helper.state_as_number(state) + value = self.state_as_number(state) if unit == TEMP_FAHRENHEIT: value = fahrenheit_to_celsius(value) _metric.labels(**self._labels(state)).set(value) @@ -249,7 +259,7 @@ class PrometheusMetrics: ) try: - value = state_helper.state_as_number(state) + value = self.state_as_number(state) metric.labels(**self._labels(state)).set(value) except ValueError: pass