118 lines
3.4 KiB
Python
118 lines
3.4 KiB
Python
"""Support for Meteo-France weather service."""
|
|
from datetime import timedelta
|
|
import logging
|
|
|
|
from homeassistant.components.weather import (
|
|
ATTR_FORECAST_CONDITION,
|
|
ATTR_FORECAST_TEMP,
|
|
ATTR_FORECAST_TEMP_LOW,
|
|
ATTR_FORECAST_TIME,
|
|
WeatherEntity,
|
|
)
|
|
import homeassistant.util.dt as dt_util
|
|
from homeassistant.const import TEMP_CELSIUS
|
|
|
|
from .const import ATTRIBUTION, CONDITION_CLASSES, CONF_CITY, DATA_METEO_FRANCE
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
def setup_platform(hass, config, add_entities, discovery_info=None):
|
|
"""Set up the Meteo-France weather platform."""
|
|
if discovery_info is None:
|
|
return
|
|
|
|
city = discovery_info[CONF_CITY]
|
|
client = hass.data[DATA_METEO_FRANCE][city]
|
|
|
|
add_entities([MeteoFranceWeather(client)], True)
|
|
|
|
|
|
class MeteoFranceWeather(WeatherEntity):
|
|
"""Representation of a weather condition."""
|
|
|
|
def __init__(self, client):
|
|
"""Initialise the platform with a data instance and station name."""
|
|
self._client = client
|
|
self._data = {}
|
|
|
|
def update(self):
|
|
"""Update current conditions."""
|
|
self._client.update()
|
|
self._data = self._client.get_data()
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the sensor."""
|
|
return self._data["name"]
|
|
|
|
@property
|
|
def condition(self):
|
|
"""Return the current condition."""
|
|
return self.format_condition(self._data["weather"])
|
|
|
|
@property
|
|
def temperature(self):
|
|
"""Return the temperature."""
|
|
return self._data["temperature"]
|
|
|
|
@property
|
|
def humidity(self):
|
|
"""Return the humidity."""
|
|
return None
|
|
|
|
@property
|
|
def temperature_unit(self):
|
|
"""Return the unit of measurement."""
|
|
return TEMP_CELSIUS
|
|
|
|
@property
|
|
def wind_speed(self):
|
|
"""Return the wind speed."""
|
|
return self._data["wind_speed"]
|
|
|
|
@property
|
|
def wind_bearing(self):
|
|
"""Return the wind bearing."""
|
|
return self._data["wind_bearing"]
|
|
|
|
@property
|
|
def attribution(self):
|
|
"""Return the attribution."""
|
|
return ATTRIBUTION
|
|
|
|
@property
|
|
def forecast(self):
|
|
"""Return the forecast."""
|
|
reftime = dt_util.utcnow().replace(hour=12, minute=0, second=0, microsecond=0)
|
|
reftime += timedelta(hours=24)
|
|
_LOGGER.debug("reftime used for %s forecast: %s", self._data["name"], reftime)
|
|
forecast_data = []
|
|
for key in self._data["forecast"]:
|
|
value = self._data["forecast"][key]
|
|
data_dict = {
|
|
ATTR_FORECAST_TIME: reftime.isoformat(),
|
|
ATTR_FORECAST_TEMP: int(value["max_temp"]),
|
|
ATTR_FORECAST_TEMP_LOW: int(value["min_temp"]),
|
|
ATTR_FORECAST_CONDITION: self.format_condition(value["weather"]),
|
|
}
|
|
reftime = reftime + timedelta(hours=24)
|
|
forecast_data.append(data_dict)
|
|
return forecast_data
|
|
|
|
@staticmethod
|
|
def format_condition(condition):
|
|
"""Return condition from dict CONDITION_CLASSES."""
|
|
for key, value in CONDITION_CLASSES.items():
|
|
if condition in value:
|
|
return key
|
|
return condition
|
|
|
|
@property
|
|
def device_state_attributes(self):
|
|
"""Return the state attributes."""
|
|
data = dict()
|
|
if self._data and "next_rain" in self._data:
|
|
data["next_rain"] = self._data["next_rain"]
|
|
return data
|