import logging import voluptuous as vol # Reuse data and API logic from the sensor implementation from homeassistant.components.sensor.bom import ( CONF_STATION, BOMCurrentData, closest_station, validate_station) from homeassistant.components.weather import PLATFORM_SCHEMA, WeatherEntity from homeassistant.const import ( CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME, TEMP_CELSIUS) from homeassistant.helpers import config_validation as cv _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_STATION): validate_station, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the BOM weather platform.""" station = config.get(CONF_STATION) or closest_station( config.get(CONF_LATITUDE), config.get(CONF_LONGITUDE), hass.config.config_dir) if station is None: _LOGGER.error("Could not get BOM weather station from lat/lon") return False bom_data = BOMCurrentData(station) try: bom_data.update()
'lightning': [37], 'lightning-rainy': [3, 4, 38, 39, 47], 'partlycloudy': [44], 'pouring': [40, 45], 'rainy': [9, 11, 12], 'snowy': [8, 13, 14, 15, 16, 41, 42, 43], 'snowy-rainy': [5, 6, 7, 10, 46], 'sunny': [32, 33, 34, 25, 36], 'windy': [24], 'windy-variant': [], 'exceptional': [0, 1, 2], } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_WOEID): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Yahoo! weather platform.""" from yahooweather import get_woeid, UNIT_C, UNIT_F unit = hass.config.units.temperature_unit woeid = config.get(CONF_WOEID) name = config.get(CONF_NAME) yunit = UNIT_C if unit == TEMP_CELSIUS else UNIT_F # If not exists a customer WOEID/calculation from Home Assistant if woeid is None:
from .AemetApi import (AemetApi, ATTR_ELEVATION, ATTR_LAST_UPDATE, ATTR_STATION_NAME, ATTR_WEATHER_PRECIPITATION, ATTR_WEATHER_SNOW, ATTR_WEATHER_WIND_SPEED, ATTR_WEATHER_WIND_BEARING, CONF_ATTRIBUTION, CONF_STATION_ID, CONF_NEIGHBORHOOD_ID, ATTR_FORECAST_TEMP, ATTR_FORECAST_COND, ATTR_FORECAST_PREC, ATTR_FORECAST_PREC_PROB, ATTR_FORECAST_WIND_BEARING, ATTR_FORECAST_WIND_SPEED) DEFAULT_NAME = 'AEMET' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Required(CONF_API_KEY): cv.string, vol.Required(CONF_STATION_ID): cv.string, vol.Required(CONF_NEIGHBORHOOD_ID): cv.string }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the weather platform.""" name = config.get(CONF_NAME) api_key = config.get(CONF_API_KEY) station_id = config.get(CONF_STATION_ID) neighborhood_id = config.get(CONF_NEIGHBORHOOD_ID) aemetApi = AemetApi(api_key=api_key, station_id=station_id,
'lightning': [19], 'lightning-rainy': [20, 23], 'partlycloudy': [2, 3], 'pouring': [8, 11], 'rainy': [6, 7, 9, 10, 12, 13, 14, 15], 'snowy': [18], 'snowy-rainy': [], 'sunny': [1], 'windy': [], 'windy-variant': [], 'exceptional': [], } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_LATITUDE): cv.latitude, vol.Optional(CONF_LONGITUDE): cv.longitude, }) async def async_setup_platform( hass, config, async_add_entities, discovery_info=None): """Set up the ipma platform. Deprecated. """ _LOGGER.warning("Loading IPMA via platform config is deprecated") latitude = config.get(CONF_LATITUDE, hass.config.latitude) longitude = config.get(CONF_LONGITUDE, hass.config.longitude)
import voluptuous as vol from homeassistant.components.weather import WeatherEntity, PLATFORM_SCHEMA from homeassistant.const import ( CONF_NAME, TEMP_CELSIUS, CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE) from homeassistant.helpers import config_validation as cv # Reuse data and API logic from the sensor implementation from homeassistant.components.sensor.metoffice import \ MetOfficeCurrentData, CONF_ATTRIBUTION, CONDITION_CLASSES _LOGGER = logging.getLogger(__name__) REQUIREMENTS = ['datapoint==0.4.3'] PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME): cv.string, vol.Required(CONF_API_KEY): cv.string, }) def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the Met Office weather platform.""" import datapoint as dp datapoint = dp.connection(api_key=config.get(CONF_API_KEY)) latitude = config.get(CONF_LATITUDE, hass.config.latitude) longitude = config.get(CONF_LONGITUDE, hass.config.longitude) if None in (latitude, longitude): _LOGGER.error("Latitude or longitude not set in Home Assistant config") return False
from .aemet import AemetData from .const import * _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_API_KEY): cv.string, vol.Optional(CONF_LATITUDE): cv.latitude, vol.Optional(CONF_LONGITUDE): cv.longitude, vol.Optional(CONF_ELEVATION): cv.small_float, vol.Optional(CONF_MODE, default=DEFAULT_FORECAST_MODE): vol.In(FORECAST_MODE), vol.Optional(CONF_CACHE_DIR, default=DEFAULT_CACHE_DIR): cv.string, vol.Optional(CONF_SET_WEATHER_STATION): cv.string, vol.Optional(CONF_SET_CITY): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_EXPERIMENTAL, default=False): cv.boolean, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the AEMET weather entities.""" _LOGGER.debug("Setting up plataform %s", DEFAULT_NAME)
'lightning-rainy': [38, 39], 'partlycloudy': [44], 'pouring': [40, 45], 'rainy': [9, 11, 12], 'snowy': [8, 13, 14, 15, 16, 41, 42, 43], 'snowy-rainy': [5, 6, 7, 10, 46, 47], 'sunny': [32], 'windy': [24], 'windy-variant': [], 'exceptional': [0, 1, 2, 3, 4, 25, 36], } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_WOEID, default=None): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_FORECAST, default=0): vol.All(vol.Coerce(int), vol.Range(min=0, max=5)), }) def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the Yahoo! weather platform.""" from yahooweather import get_woeid, UNIT_C, UNIT_F unit = hass.config.units.temperature_unit woeid = config.get(CONF_WOEID) forecast = config.get(CONF_FORECAST) name = config.get(CONF_NAME) yunit = UNIT_C if unit == TEMP_CELSIUS else UNIT_F
'cloudy': 'cloudy', 'partly-cloudy-day': 'partlycloudy', 'partly-cloudy-night': 'partlycloudy', 'hail': 'hail', 'thunderstorm': 'lightning', 'tornado': None, } CONF_UNITS = 'units' DEFAULT_NAME = 'Dark Sky' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_API_KEY): cv.string, vol.Optional(CONF_LATITUDE): cv.latitude, vol.Optional(CONF_LONGITUDE): cv.longitude, vol.Optional(CONF_MODE, default='hourly'): vol.In(FORECAST_MODE), vol.Optional(CONF_UNITS): vol.In(['auto', 'si', 'us', 'ca', 'uk', 'uk2']), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=3) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Dark Sky weather.""" latitude = config.get(CONF_LATITUDE, hass.config.latitude) longitude = config.get(CONF_LONGITUDE, hass.config.longitude) name = config.get(CONF_NAME) mode = config.get(CONF_MODE) units = config.get(CONF_UNITS)
else: _LOGGER = logging.getLogger(__name__) DEFAULT_NAME = 'gismeteo' CONF_CITY = 'city' FORECAST_MODE = ['hourly', 'daily'] URL = "https://services.gismeteo.ru/inform-service/inf_ios/forecast/?city={}&lang=en" MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=300) MMHG2HPA = 1.333223684 DIRECTIONS = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'] ATTR_FORECAST_TEXT_CONDITION = 'text_condition' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_MODE, default='hourly'): vol.In(FORECAST_MODE), vol.Required(CONF_CITY): cv.string, }) def dt_to_utc(dt, offset): local_tz = timezone(timedelta(minutes=offset)) local_dt = datetime.fromisoformat(dt) local_dt_with_tz = local_dt.replace(tzinfo=local_tz) utc_dt = local_dt_with_tz.astimezone(timezone.utc) return utc_dt.isoformat() def _condition(tod, d): if int(d.get('ts')) == 1 and int(d.get('pt')) == 1:
ATTR_WEATHER_PRESSURE, ATTR_WEATHER_TEMPERATURE, ATTR_WEATHER_WIND_BEARING, ATTR_WEATHER_WIND_SPEED, PLATFORM_SCHEMA, WeatherEntity) from homeassistant.const import (CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME, TEMP_CELSIUS) from homeassistant.helpers import config_validation as cv _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_STATION_ID): cv.string, vol.Inclusive(CONF_LATITUDE, 'coordinates', 'Latitude and longitude must exist together'): cv.latitude, vol.Inclusive(CONF_LONGITUDE, 'coordinates', 'Latitude and longitude must exist together'): cv.longitude, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the ZAMG weather platform.""" name = config.get(CONF_NAME) latitude = config.get(CONF_LATITUDE, hass.config.latitude) longitude = config.get(CONF_LONGITUDE, hass.config.longitude) station_id = config.get(CONF_STATION_ID) or closest_station( latitude, longitude, hass.config.config_dir) if station_id not in zamg_stations(hass.config.config_dir):
ATTR_FORECAST_WIND_BEARING, ATTR_CONDITION_CLASS, ATTR_WEATHER_ATTRIBUTION, ATTR_WEATHER_HUMIDITY, ATTR_FORECAST_TIME, PLATFORM_SCHEMA, WeatherEntity, ) from homeassistant.const import CONF_NAME, TEMP_CELSIUS from homeassistant.helpers import config_validation as cv from .sensor import NEACurrentData _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( {vol.Optional(CONF_NAME): cv.string} ) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the NEA weather platform.""" _LOGGER.debug("initialising NEA Weather2 %s", config.get(CONF_NAME)) nea_data = NEACurrentData() try: nea_data.update() except ValueError as err: _LOGGER.error("Received error from NEA Current: %s", err) return False add_entities([NEAWeather(nea_data, config.get(CONF_NAME))], True)
# 雪 'snowy': [400, 401, 402, 403, 405, 406, 407, 408, 409, 410, 499], # 雨夹雪 'snowy-rainy': [404], # 晴 'sunny': [100], # 风 'windy': [200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 507, 508], # 'windy-variant': [104], # 其他 'exceptional': [999], } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_API_KEY): cv.string, vol.Optional(CONF_ID): cv.string, }) MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=30) def setup_platform(hass, config, add_entities, discovery_info=None): api_key = config.get(CONF_API_KEY) city_id = config.get(CONF_ID) hew = WeatherData(api_key, city_id) add_entities([HeWeather(hew)], True) class HeWeather(WeatherEntity):
("cloudy", ["Mostly cloudy", "Overcast"]), ("partlycloudy", ["A few clouds", "Partly cloudy"]), ] ) ERRORS = (aiohttp.ClientError, JSONDecodeError) FORECAST_MODE = ["daynight", "hourly"] PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Optional(CONF_NAME): cv.string, vol.Inclusive( CONF_LATITUDE, "coordinates", "Latitude and longitude must exist together" ): cv.latitude, vol.Inclusive( CONF_LONGITUDE, "coordinates", "Latitude and longitude must exist together" ): cv.longitude, vol.Optional(CONF_MODE, default="daynight"): vol.In(FORECAST_MODE), vol.Optional(CONF_STATION): cv.string, vol.Required(CONF_API_KEY): cv.string, } ) def convert_condition(time, weather): """ Convert NWS codes to HA condition. Choose first condition in CONDITION_CLASSES that exists in weather code. If no match is found, return first condition from NWS """
from homeassistant.helpers.event import ( async_call_later, async_track_utc_time_change) import homeassistant.util.dt as dt_util _LOGGER = logging.getLogger(__name__) ATTRIBUTION = "Weather forecast from met.no, delivered by the Norwegian " \ "Meteorological Institute." DEFAULT_NAME = "Met.no" URL = 'https://aa015h6buqvih86i1.api.met.no/weatherapi/locationforecast/1.9/' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Inclusive(CONF_LATITUDE, 'coordinates', 'Latitude and longitude must exist together'): cv.latitude, vol.Inclusive(CONF_LONGITUDE, 'coordinates', 'Latitude and longitude must exist together'): cv.longitude, }) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Met.no weather platform.""" elevation = config.get(CONF_ELEVATION, hass.config.elevation or 0) latitude = config.get(CONF_LATITUDE, hass.config.latitude) longitude = config.get(CONF_LONGITUDE, hass.config.longitude) name = config.get(CONF_NAME) if None in (latitude, longitude): _LOGGER.error("Latitude or longitude not set in Home Assistant config")
92: "fog", # "Fog" } _LOGGER = logging.getLogger(__name__) ATTRIBUTION = "Weather Data provided by FMI" DEFAULT_NAME = "FMI" FORECAST_OFFSET = [1, 2, 3, 4, 6, 8, 12, 24] # Based on API test runs PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_LATITUDE): cv.latitude, vol.Optional(CONF_LONGITUDE): cv.longitude, vol.Optional(CONF_OFFSET, default=1): vol.In(FORECAST_OFFSET), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=15) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the FMI weather.""" latitude = config.get(CONF_LATITUDE, hass.config.latitude) longitude = config.get(CONF_LONGITUDE, hass.config.longitude) name = config.get(CONF_NAME) time_step = config.get(CONF_OFFSET)
'lightning-rainy': [200, 201, 202, 230, 231, 232], 'partlycloudy': [801, 802, 803], 'pouring': [504, 314, 502, 503, 522], 'rainy': [300, 301, 302, 310, 311, 312, 313, 500, 501, 520, 521], 'snowy': [600, 601, 602, 611, 612, 620, 621, 622], 'snowy-rainy': [511, 615, 616], 'sunny': [800], 'windy': [905, 951, 952, 953, 954, 955, 956, 957], 'windy-variant': [958, 959, 960, 961], 'exceptional': [711, 721, 731, 751, 761, 762, 771, 900, 901, 962, 903, 904], } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_API_KEY): cv.string, vol.Optional(CONF_LATITUDE): cv.latitude, vol.Optional(CONF_LONGITUDE): cv.longitude, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the OpenWeatherMap weather platform.""" import pyowm longitude = config.get(CONF_LONGITUDE, round(hass.config.longitude, 5)) latitude = config.get(CONF_LATITUDE, round(hass.config.latitude, 5)) name = config.get(CONF_NAME) try: owm = pyowm.OWM(config.get(CONF_API_KEY)) except pyowm.exceptions.api_call_error.APICallError:
DEFAULT_NAME = "AEMET" _LOGGER = logging.getLogger(__name__) FORECAST_MODE = ["hourly", "daily"] PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_API_KEY): cv.string, vol.Optional(CONF_LATITUDE): cv.latitude, vol.Optional(CONF_LONGITUDE): cv.longitude, vol.Optional(CONF_ELEVATION): cv.small_float, vol.Optional(CONF_MODE, default="daily"): vol.In(FORECAST_MODE), vol.Optional("cache_dir", default=DEFAULT_CACHE_DIR): cv.string, vol.Optional("weather_station"): cv.string, vol.Optional("city"): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional("experimental", default=False): cv.boolean, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the AEMET weather entities.""" _LOGGER.debug("Setting up plataform %s", DEFAULT_NAME)
'lightning': ['g'], 'lightning-rainy': ['s'], 'partlycloudy': ['b', 'j', 'o', 'r'], 'pouring': ['l', 'q'], 'rainy': ['f', 'h', 'k', 'm'], 'snowy': ['u', 'i', 'v', 't'], 'snowy-rainy': ['w'], 'sunny': ['a'], 'windy': [], 'windy-variant': [], 'exceptional': [], } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_LATITUDE): cv.latitude, vol.Optional(CONF_LONGITUDE): cv.longitude, vol.Optional(CONF_FORECAST, default=True): cv.boolean, }) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the buienradar platform.""" latitude = config.get(CONF_LATITUDE, hass.config.latitude) longitude = config.get(CONF_LONGITUDE, hass.config.longitude) if None in (latitude, longitude): _LOGGER.error("Latitude or longitude not set in Home Assistant config") return False coordinates = {CONF_LATITUDE: float(latitude),
'lightning': [37], 'lightning-rainy': [38, 39], 'partlycloudy': [44], 'pouring': [40, 45], 'rainy': [9, 11, 12], 'snowy': [8, 13, 14, 15, 16, 41, 42, 43], 'snowy-rainy': [5, 6, 7, 10, 46, 47], 'sunny': [32], 'windy': [24], 'windy-variant': [], 'exceptional': [0, 1, 2, 3, 4, 25, 36], } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_WOEID, default=None): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_FORECAST, default=0): vol.All(vol.Coerce(int), vol.Range(min=0, max=5)), }) def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the Yahoo! weather platform.""" from yahooweather import get_woeid, UNIT_C, UNIT_F unit = hass.config.units.temperature_unit woeid = config.get(CONF_WOEID) forecast = config.get(CONF_FORECAST) name = config.get(CONF_NAME) yunit = UNIT_C if unit == TEMP_CELSIUS else UNIT_F