core/homeassistant/components/prezzibenzina/sensor.py

116 lines
3.1 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]