core/homeassistant/components/prezzibenzina/sensor.py

120 lines
3.2 KiB
Python

"""Support for the PrezziBenzina.it service."""
import datetime as dt
from datetime import timedelta
import logging
import voluptuous as vol
from homeassistant.const import ATTR_ATTRIBUTION, ATTR_TIME, CONF_NAME
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.config_validation import PLATFORM_SCHEMA
from homeassistant.helpers.entity import Entity
_LOGGER = logging.getLogger(__name__)
ATTR_FUEL = "fuel"
ATTR_SERVICE = "service"
ATTRIBUTION = "Data provided by PrezziBenzina.it"
CONF_STATION = "station"
CONF_TYPES = "fuel_types"
ICON = "mdi:fuel"
FUEL_TYPES = [
"Benzina",
"Benzina speciale",
"Diesel",
"Diesel speciale",
"GPL",
"Metano",
]
SCAN_INTERVAL = timedelta(minutes=120)
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{
vol.Required(CONF_STATION): cv.string,
vol.Optional(CONF_NAME, None): cv.string,
vol.Optional(CONF_TYPES, None): vol.All(cv.ensure_list, [vol.In(FUEL_TYPES)]),
}
)
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
"""Set up the PrezziBenzina sensor platform."""
from prezzibenzina import PrezziBenzinaPy
station = config[CONF_STATION]
name = config.get(CONF_NAME)
types = config.get(CONF_TYPES)
client = PrezziBenzinaPy()
dev = []
info = client.get_by_id(station)
if name is None:
name = client.get_station_name(station)
for index, info in enumerate(info):
if types is not None and info["fuel"] not in types:
continue
dev.append(
PrezziBenzinaSensor(
index, client, station, name, info["fuel"], info["service"]
)
)
async_add_entities(dev, True)
class PrezziBenzinaSensor(Entity):
"""Implementation of a PrezziBenzina sensor."""
def __init__(self, index, client, station, name, ft, srv):
"""Initialize the PrezziBenzina sensor."""
self._client = client
self._index = index
self._data = None
self._station = station
self._name = "{} {} {}".format(name, ft, srv)
@property
def name(self):
"""Return the name of the sensor."""
return self._name
@property
def icon(self):
"""Icon to use in the frontend, if any."""
return ICON
@property
def state(self):
"""Return the state of the device."""
return self._data["price"].replace("", "")
@property
def unit_of_measurement(self):
"""Return the unit of measurement of this entity, if any."""
return self._data["price"].split(" ")[1]
@property
def device_state_attributes(self):
"""Return the device state attributes of the last update."""
timestamp = dt.datetime.strptime(
self._data["date"], "%d/%m/%Y %H:%M"
).isoformat()
attrs = {
ATTR_ATTRIBUTION: ATTRIBUTION,
ATTR_FUEL: self._data["fuel"],
ATTR_SERVICE: self._data["service"],
ATTR_TIME: timestamp,
}
return attrs
async def async_update(self):
"""Get the latest data and updates the states."""
self._data = self._client.get_by_id(self._station)[self._index]