mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 05:07:41 +00:00
Added support for specifying units in the configuration file. If no units are specified in the config file it will use location to determine the units.
This commit is contained in:
parent
73cb23f599
commit
293ed275ab
@ -24,6 +24,7 @@ sensor:
|
|||||||
- pressure
|
- pressure
|
||||||
- visibility
|
- visibility
|
||||||
- ozone
|
- ozone
|
||||||
|
units: si, us, ca, uk, uk2 or auto(default)
|
||||||
|
|
||||||
Variables:
|
Variables:
|
||||||
|
|
||||||
@ -33,15 +34,16 @@ To retrieve this value log into your account at http://forecast.io/. You can
|
|||||||
make 1000 requests per day. This means that you could create every 1.4 minute
|
make 1000 requests per day. This means that you could create every 1.4 minute
|
||||||
one.
|
one.
|
||||||
|
|
||||||
monitored_conditions
|
|
||||||
*Required
|
|
||||||
An array specifying the conditions to monitor.
|
|
||||||
|
|
||||||
monitored_conditions
|
monitored_conditions
|
||||||
*Required
|
*Required
|
||||||
Conditions to monitor. See the configuration example above for a
|
Conditions to monitor. See the configuration example above for a
|
||||||
list of all available conditions to monitor.
|
list of all available conditions to monitor.
|
||||||
|
|
||||||
|
units
|
||||||
|
*Optional
|
||||||
|
Specify the unit system. Default to 'auto' which is based on location.
|
||||||
|
Other options are us, si, ca, uk, and uk2. For more info see API link below.
|
||||||
|
|
||||||
Details for the API : https://developer.forecast.io/docs/v2
|
Details for the API : https://developer.forecast.io/docs/v2
|
||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
@ -55,23 +57,26 @@ except ImportError:
|
|||||||
forecastio = None
|
forecastio = None
|
||||||
|
|
||||||
from homeassistant.util import Throttle
|
from homeassistant.util import Throttle
|
||||||
from homeassistant.const import (CONF_API_KEY, TEMP_CELCIUS, TEMP_FAHRENHEIT)
|
from homeassistant.const import (CONF_API_KEY)
|
||||||
from homeassistant.helpers.entity import Entity
|
from homeassistant.helpers.entity import Entity
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# Sensor types are defined like so:
|
||||||
|
# Name, si unit, us unit, ca unit, uk unit, uk2 unit
|
||||||
SENSOR_TYPES = {
|
SENSOR_TYPES = {
|
||||||
'summary': ['Summary', ''],
|
'summary': ['Summary', '', '', '', '', ''],
|
||||||
'precip_type': ['Precip', ''],
|
'precip_type': ['Precip', '', '', '', '', ''],
|
||||||
'precip_intensity': ['Precip intensity', 'mm'],
|
'precip_intensity': ['Precip intensity', 'mm', 'in', 'mm', 'mm', 'mm'],
|
||||||
'temperature': ['Temperature', ''],
|
'temperature': ['Temperature', '°C', '°F', '°C', '°C', '°C'],
|
||||||
'dew_point': ['Dew point', '°C'],
|
'dew_point': ['Dew point', '°C', '°F', '°C', '°C', '°C'],
|
||||||
'wind_speed': ['Wind Speed', 'm/s'],
|
'wind_speed': ['Wind Speed', 'm/s', 'mph', 'km/h', 'mph', 'mph'],
|
||||||
'wind_bearing': ['Wind Bearing', '°'],
|
'wind_bearing': ['Wind Bearing', '°', '°', '°', '°', '°'],
|
||||||
'cloud_cover': ['Cloud coverage', '%'],
|
'cloud_cover': ['Cloud coverage', '%', '%', '%', '%', '%'],
|
||||||
'humidity': ['Humidity', '%'],
|
'humidity': ['Humidity', '%', '%', '%', '%', '%'],
|
||||||
'pressure': ['Pressure', 'mBar'],
|
'pressure': ['Pressure', 'mBar', 'mBar', 'mBar', 'mBar', 'mBar'],
|
||||||
'visibility': ['Visibility', 'km'],
|
'visibility': ['Visibility', 'km', 'm', 'km', 'km', 'm'],
|
||||||
'ozone': ['Ozone', 'DU'],
|
'ozone': ['Ozone', 'DU', 'DU', 'DU', 'DU', 'DU'],
|
||||||
}
|
}
|
||||||
|
|
||||||
# Return cached results if last scan was less then this time ago
|
# Return cached results if last scan was less then this time ago
|
||||||
@ -90,9 +95,6 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||||||
_LOGGER.error("Latitude or longitude not set in Home Assistant config")
|
_LOGGER.error("Latitude or longitude not set in Home Assistant config")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
SENSOR_TYPES['temperature'][1] = hass.config.temperature_unit
|
|
||||||
unit = hass.config.temperature_unit
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
forecast = forecastio.load_forecast(config.get(CONF_API_KEY, None),
|
forecast = forecastio.load_forecast(config.get(CONF_API_KEY, None),
|
||||||
hass.config.latitude,
|
hass.config.latitude,
|
||||||
@ -104,16 +106,21 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||||||
"Please check your settings for Forecast.io.")
|
"Please check your settings for Forecast.io.")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
units = config.get('units')
|
||||||
|
if units is None:
|
||||||
|
units = 'auto'
|
||||||
|
|
||||||
data = ForeCastData(config.get(CONF_API_KEY, None),
|
data = ForeCastData(config.get(CONF_API_KEY, None),
|
||||||
hass.config.latitude,
|
hass.config.latitude,
|
||||||
hass.config.longitude)
|
hass.config.longitude,
|
||||||
|
units)
|
||||||
|
|
||||||
dev = []
|
dev = []
|
||||||
for variable in config['monitored_conditions']:
|
for variable in config['monitored_conditions']:
|
||||||
if variable not in SENSOR_TYPES:
|
if variable not in SENSOR_TYPES:
|
||||||
_LOGGER.error('Sensor type: "%s" does not exist', variable)
|
_LOGGER.error('Sensor type: "%s" does not exist', variable)
|
||||||
else:
|
else:
|
||||||
dev.append(ForeCastSensor(data, variable, unit))
|
dev.append(ForeCastSensor(data, variable))
|
||||||
|
|
||||||
add_devices(dev)
|
add_devices(dev)
|
||||||
|
|
||||||
@ -122,14 +129,23 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||||||
class ForeCastSensor(Entity):
|
class ForeCastSensor(Entity):
|
||||||
""" Implements an Forecast.io sensor. """
|
""" Implements an Forecast.io sensor. """
|
||||||
|
|
||||||
def __init__(self, weather_data, sensor_type, unit):
|
def __init__(self, weather_data, sensor_type):
|
||||||
self.client_name = 'Weather'
|
self.client_name = 'Weather'
|
||||||
self._name = SENSOR_TYPES[sensor_type][0]
|
self._name = SENSOR_TYPES[sensor_type][0]
|
||||||
self.forecast_client = weather_data
|
self.forecast_client = weather_data
|
||||||
self._unit = unit
|
|
||||||
self.type = sensor_type
|
self.type = sensor_type
|
||||||
self._state = None
|
self._state = None
|
||||||
self._unit_of_measurement = SENSOR_TYPES[sensor_type][1]
|
self._unit_system = self.forecast_client.unit_system
|
||||||
|
if self._unit_system == 'si':
|
||||||
|
self._unit_of_measurement = SENSOR_TYPES[self.type][1]
|
||||||
|
elif self._unit_system == 'us':
|
||||||
|
self._unit_of_measurement = SENSOR_TYPES[self.type][2]
|
||||||
|
elif self._unit_system == 'ca':
|
||||||
|
self._unit_of_measurement = SENSOR_TYPES[self.type][3]
|
||||||
|
elif self._unit_system == 'uk':
|
||||||
|
self._unit_of_measurement = SENSOR_TYPES[self.type][4]
|
||||||
|
elif self._unit_system == 'uk2':
|
||||||
|
self._unit_of_measurement = SENSOR_TYPES[self.type][5]
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -146,6 +162,11 @@ class ForeCastSensor(Entity):
|
|||||||
""" Unit of measurement of this entity, if any. """
|
""" Unit of measurement of this entity, if any. """
|
||||||
return self._unit_of_measurement
|
return self._unit_of_measurement
|
||||||
|
|
||||||
|
@property
|
||||||
|
def unit_system(self):
|
||||||
|
""" Unit system of this entity. """
|
||||||
|
return self._unit_system
|
||||||
|
|
||||||
# pylint: disable=too-many-branches
|
# pylint: disable=too-many-branches
|
||||||
def update(self):
|
def update(self):
|
||||||
""" Gets the latest data from Forecast.io and updates the states. """
|
""" Gets the latest data from Forecast.io and updates the states. """
|
||||||
@ -169,19 +190,9 @@ class ForeCastSensor(Entity):
|
|||||||
else:
|
else:
|
||||||
self._state = data.precipType
|
self._state = data.precipType
|
||||||
elif self.type == 'dew_point':
|
elif self.type == 'dew_point':
|
||||||
if self._unit == TEMP_CELCIUS:
|
self._state = round(data.dewPoint, 1)
|
||||||
self._state = round(data.dewPoint, 1)
|
|
||||||
elif self._unit == TEMP_FAHRENHEIT:
|
|
||||||
self._state = round(data.dewPoint * 1.8 + 32.0, 1)
|
|
||||||
else:
|
|
||||||
self._state = round(data.dewPoint, 1)
|
|
||||||
elif self.type == 'temperature':
|
elif self.type == 'temperature':
|
||||||
if self._unit == TEMP_CELCIUS:
|
self._state = round(data.temperature, 1)
|
||||||
self._state = round(data.temperature, 1)
|
|
||||||
elif self._unit == TEMP_FAHRENHEIT:
|
|
||||||
self._state = round(data.temperature * 1.8 + 32.0, 1)
|
|
||||||
else:
|
|
||||||
self._state = round(data.temperature, 1)
|
|
||||||
elif self.type == 'wind_speed':
|
elif self.type == 'wind_speed':
|
||||||
self._state = data.windSpeed
|
self._state = data.windSpeed
|
||||||
elif self.type == 'wind_bearing':
|
elif self.type == 'wind_bearing':
|
||||||
@ -196,6 +207,7 @@ class ForeCastSensor(Entity):
|
|||||||
self._state = data.visibility
|
self._state = data.visibility
|
||||||
elif self.type == 'ozone':
|
elif self.type == 'ozone':
|
||||||
self._state = round(data.ozone, 1)
|
self._state = round(data.ozone, 1)
|
||||||
|
|
||||||
except forecastio.utils.PropertyUnavailable:
|
except forecastio.utils.PropertyUnavailable:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -203,11 +215,14 @@ class ForeCastSensor(Entity):
|
|||||||
class ForeCastData(object):
|
class ForeCastData(object):
|
||||||
""" Gets the latest data from Forecast.io. """
|
""" Gets the latest data from Forecast.io. """
|
||||||
|
|
||||||
def __init__(self, api_key, latitude, longitude):
|
def __init__(self, api_key, latitude, longitude, units):
|
||||||
self._api_key = api_key
|
self._api_key = api_key
|
||||||
self.latitude = latitude
|
self.latitude = latitude
|
||||||
self.longitude = longitude
|
self.longitude = longitude
|
||||||
self.data = None
|
self.data = None
|
||||||
|
self.unit_system = None
|
||||||
|
self.units = units
|
||||||
|
self.update()
|
||||||
|
|
||||||
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
||||||
def update(self):
|
def update(self):
|
||||||
@ -216,5 +231,6 @@ class ForeCastData(object):
|
|||||||
forecast = forecastio.load_forecast(self._api_key,
|
forecast = forecastio.load_forecast(self._api_key,
|
||||||
self.latitude,
|
self.latitude,
|
||||||
self.longitude,
|
self.longitude,
|
||||||
units='si')
|
units=self.units)
|
||||||
self.data = forecast.currently()
|
self.data = forecast.currently()
|
||||||
|
self.unit_system = forecast.json['flags']['units']
|
||||||
|
Loading…
x
Reference in New Issue
Block a user