core/homeassistant/components/demo/weather.py

122 lines
3.7 KiB
Python

"""Demo platform that offers fake meteorological data."""
from datetime import datetime, timedelta
from homeassistant.components.weather import (
ATTR_FORECAST_CONDITION, ATTR_FORECAST_PRECIPITATION, ATTR_FORECAST_TEMP,
ATTR_FORECAST_TEMP_LOW, ATTR_FORECAST_TIME, WeatherEntity)
from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT
CONDITION_CLASSES = {
'cloudy': [],
'fog': [],
'hail': [],
'lightning': [],
'lightning-rainy': [],
'partlycloudy': [],
'pouring': [],
'rainy': ['shower rain'],
'snowy': [],
'snowy-rainy': [],
'sunny': ['sunshine'],
'windy': [],
'windy-variant': [],
'exceptional': [],
}
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the Demo weather."""
add_entities([
DemoWeather('South', 'Sunshine', 21.6414, 92, 1099, 0.5, TEMP_CELSIUS,
[['rainy', 1, 22, 15], ['rainy', 5, 19, 8],
['cloudy', 0, 15, 9], ['sunny', 0, 12, 6],
['partlycloudy', 2, 14, 7], ['rainy', 15, 18, 7],
['fog', 0.2, 21, 12]]),
DemoWeather('North', 'Shower rain', -12, 54, 987, 4.8, TEMP_FAHRENHEIT,
[['snowy', 2, -10, -15], ['partlycloudy', 1, -13, -14],
['sunny', 0, -18, -22], ['sunny', 0.1, -23, -23],
['snowy', 4, -19, -20], ['sunny', 0.3, -14, -19],
['sunny', 0, -9, -12]])
])
class DemoWeather(WeatherEntity):
"""Representation of a weather condition."""
def __init__(self, name, condition, temperature, humidity, pressure,
wind_speed, temperature_unit, forecast):
"""Initialize the Demo weather."""
self._name = name
self._condition = condition
self._temperature = temperature
self._temperature_unit = temperature_unit
self._humidity = humidity
self._pressure = pressure
self._wind_speed = wind_speed
self._forecast = forecast
@property
def name(self):
"""Return the name of the sensor."""
return '{} {}'.format('Demo Weather', self._name)
@property
def should_poll(self):
"""No polling needed for a demo weather condition."""
return False
@property
def temperature(self):
"""Return the temperature."""
return self._temperature
@property
def temperature_unit(self):
"""Return the unit of measurement."""
return self._temperature_unit
@property
def humidity(self):
"""Return the humidity."""
return self._humidity
@property
def wind_speed(self):
"""Return the wind speed."""
return self._wind_speed
@property
def pressure(self):
"""Return the pressure."""
return self._pressure
@property
def condition(self):
"""Return the weather condition."""
return [k for k, v in CONDITION_CLASSES.items() if
self._condition.lower() in v][0]
@property
def attribution(self):
"""Return the attribution."""
return 'Powered by Home Assistant'
@property
def forecast(self):
"""Return the forecast."""
reftime = datetime.now().replace(hour=16, minute=00)
forecast_data = []
for entry in self._forecast:
data_dict = {
ATTR_FORECAST_TIME: reftime.isoformat(),
ATTR_FORECAST_CONDITION: entry[0],
ATTR_FORECAST_PRECIPITATION: entry[1],
ATTR_FORECAST_TEMP: entry[2],
ATTR_FORECAST_TEMP_LOW: entry[3]
}
reftime = reftime + timedelta(hours=4)
forecast_data.append(data_dict)
return forecast_data