Files
homeassistant-prometheus-query/custom_components/prometheus_query/sensor.py
Grégoire Seux 4fbe9c5660 Support state class propoerty for sensor
Fix lfasci/homeassistant-prometheus-query#5

Goal is to make a first pass to allow to be exposed in the energy
dashboard.
This requires usage of HA version 2021.9 (which is beta at time of
writing) if we want to allow total_increase state_class
2021-08-29 21:14:40 +02:00

94 lines
2.9 KiB
Python

import logging, time
import requests
import json
import voluptuous as vol
import homeassistant.helpers.config_validation as cv
from datetime import timedelta
from homeassistant.helpers.config_validation import PLATFORM_SCHEMA
from homeassistant.helpers.entity import Entity
from homeassistant.util import Throttle
from homeassistant.const import (
CONF_NAME,
CONF_UNIT_OF_MEASUREMENT,
STATE_UNKNOWN,
)
from homeassistant.components.sensor import (
DEVICE_CLASSES_SCHEMA,
STATE_CLASSES_SCHEMA,
)
from prometheus_client import Summary
CONF_PROMETHEUS_URL = 'prometheus_url'
CONF_PROMETHEUS_QUERY = 'prometheus_query'
CONF_STATE_CLASS = 'state_class'
SCAN_INTERVAL = timedelta(seconds=600)
_LOGGER = logging.getLogger(__name__)
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_PROMETHEUS_URL): cv.string,
vol.Required(CONF_PROMETHEUS_QUERY): cv.string,
vol.Required(CONF_NAME): cv.string,
vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string,
vol.Optional(CONF_STATE_CLASS): STATE_CLASSES_SCHEMA,
})
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the sensor platform."""
prom_data = {
'url': str(config.get(CONF_PROMETHEUS_URL)) + "/api/v1/query",
'query': str(config.get(CONF_PROMETHEUS_QUERY)),
'name': str(config.get(CONF_NAME)),
'unit': str(config.get(CONF_UNIT_OF_MEASUREMENT)),
'state_class': str(config.get(CONF_STATE_CLASS)),
}
add_entities([PrometheusQuery(prom_data)], True)
class PrometheusQuery(Entity):
"""Representation of a Sensor."""
def __init__(self, prom_data):
"""Initialize the sensor."""
self._url = prom_data["url"]
self._query = prom_data["query"]
self._name = prom_data["name"]
self._state = None
self._unit_of_measurement = prom_data["unit"]
self._state_class = prom_data["state_class"]
@property
def name(self):
"""Return the name of the sensor."""
return self._name
@property
def state(self):
"""Return the state of the sensor."""
return self._state
@property
def unit_of_measurement(self):
"""Return the unit of measurement."""
return self._unit_of_measurement
@property
def state_class(self):
"""Return the state_class of the sensor"""
return self._state_class
def update(self):
"""Fetch new state data for the sensor.
This is the only method that should fetch new data for Home Assistant.
"""
try:
response = requests.get(self._url, params={'query': self._query})
if (response):
results = response.json()['data']['result']
self._state = results[0]['value'][1]
else:
self._state = STATE_UNKNOWN
except URLCallError:
_LOGGER.error("Error when retrieving update data")