From afac09b528a2ee62ffc0f46c284a9f029a3d3274 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Sun, 7 Mar 2021 05:21:55 -0500 Subject: [PATCH 01/15] Add ClimaCell v4 API support --- .../components/climacell/__init__.py | 182 +++++++-- .../components/climacell/config_flow.py | 27 +- homeassistant/components/climacell/const.py | 94 +++-- .../components/climacell/manifest.json | 2 +- .../components/climacell/strings.json | 4 +- homeassistant/components/climacell/weather.py | 362 ++++++++++++------ requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 8 files changed, 486 insertions(+), 189 deletions(-) diff --git a/homeassistant/components/climacell/__init__.py b/homeassistant/components/climacell/__init__.py index c3c3f702780f1..ab32e5722358d 100644 --- a/homeassistant/components/climacell/__init__.py +++ b/homeassistant/components/climacell/__init__.py @@ -5,14 +5,19 @@ from math import ceil from typing import Any, Dict, Optional, Union -from pyclimacell import ClimaCell +from pyclimacell import ClimaCellV3, ClimaCellV4 from pyclimacell.const import ( + CURRENT, + DAILY, FORECAST_DAILY, FORECAST_HOURLY, FORECAST_NOWCAST, + FORECASTS, + HOURLY, + NOWCAST, REALTIME, ) -from pyclimacell.pyclimacell import ( +from pyclimacell.exceptions import ( CantConnectException, InvalidAPIKeyException, RateLimitedException, @@ -21,7 +26,13 @@ from homeassistant.components.weather import DOMAIN as WEATHER_DOMAIN from homeassistant.config_entries import ConfigEntry -from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME +from homeassistant.const import ( + CONF_API_KEY, + CONF_API_VERSION, + CONF_LATITUDE, + CONF_LONGITUDE, + CONF_NAME, +) from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.typing import ConfigType, HomeAssistantType @@ -33,15 +44,23 @@ from .const import ( ATTRIBUTION, + CC_ATTR_CONDITION, + CC_ATTR_HUMIDITY, + CC_ATTR_OZONE, + CC_ATTR_PRECIPITATION, + CC_ATTR_PRECIPITATION_PROBABILITY, + CC_ATTR_PRESSURE, + CC_ATTR_TEMPERATURE, + CC_ATTR_TEMPERATURE_HIGH, + CC_ATTR_TEMPERATURE_LOW, + CC_ATTR_VISIBILITY, + CC_ATTR_WIND_DIRECTION, + CC_ATTR_WIND_SPEED, CONF_TIMESTEP, - CURRENT, - DAILY, + DEFAULT_FORECAST_TYPE, DEFAULT_TIMESTEP, DOMAIN, - FORECASTS, - HOURLY, MAX_REQUESTS_PER_DAY, - NOWCAST, ) _LOGGER = logging.getLogger(__name__) @@ -53,6 +72,7 @@ def _set_update_interval( hass: HomeAssistantType, current_entry: ConfigEntry ) -> timedelta: """Recalculate update_interval based on existing ClimaCell instances and update them.""" + api_calls = 4 if current_entry.data[CONF_API_VERSION] == 3 else 2 # We check how many ClimaCell configured instances are using the same API key and # calculate interval to not exceed allowed numbers of requests. Divide 90% of # MAX_REQUESTS_PER_DAY by 4 because every update requires four API calls and we want @@ -67,7 +87,7 @@ def _set_update_interval( interval = timedelta( minutes=( ceil( - (24 * 60 * (len(other_instance_entry_ids) + 1) * 4) + (24 * 60 * (len(other_instance_entry_ids) + 1) * api_calls) / (MAX_REQUESTS_PER_DAY * 0.9) ) ) @@ -98,15 +118,18 @@ async def async_setup_entry(hass: HomeAssistantType, config_entry: ConfigEntry) }, ) + api_class = ClimaCellV3 if config_entry.data[CONF_API_VERSION] == 3 else ClimaCellV4 + api = api_class( + config_entry.data[CONF_API_KEY], + config_entry.data.get(CONF_LATITUDE, hass.config.latitude), + config_entry.data.get(CONF_LONGITUDE, hass.config.longitude), + session=async_get_clientsession(hass), + ) + coordinator = ClimaCellDataUpdateCoordinator( hass, config_entry, - ClimaCell( - config_entry.data[CONF_API_KEY], - config_entry.data.get(CONF_LATITUDE, hass.config.latitude), - config_entry.data.get(CONF_LONGITUDE, hass.config.longitude), - session=async_get_clientsession(hass), - ), + api, _set_update_interval(hass, config_entry), ) @@ -145,6 +168,47 @@ async def async_unload_entry( return unload_ok +async def async_migrate_entry( + hass: HomeAssistantType, config_entry: ConfigEntry +) -> bool: + """Migrate old entry.""" + version = config_entry.version + + _LOGGER.debug("Migrating from version %s", version) + + # 1 -> 2: Added new config key to support multiple API versions and limited nowcast timesteps + if version == 1: + params = {} + + # Add API version if not found + if CONF_API_VERSION not in config_entry.data: + new_data = config_entry.data.copy() + new_data[CONF_API_VERSION] = 3 + params["data"] = new_data + + # Use valid timestep if it's invalid + timestep = config_entry.options[CONF_TIMESTEP] + if timestep not in (1, 5, 15, 30): + if timestep <= 2: + timestep = 1 + elif timestep <= 7: + timestep = 5 + elif timestep <= 20: + timestep = 15 + else: + timestep = 30 + new_options = config_entry.options.copy() + new_options[CONF_TIMESTEP] = timestep + params["options"] = new_options + + version = config_entry.version = 2 + hass.config_entries.async_update_entry(config_entry, **params) + + _LOGGER.info("Migration to version %s successful", version) + + return True + + class ClimaCellDataUpdateCoordinator(DataUpdateCoordinator): """Define an object to hold ClimaCell data.""" @@ -152,12 +216,13 @@ def __init__( self, hass: HomeAssistantType, config_entry: ConfigEntry, - api: ClimaCell, + api: Union[ClimaCellV3, ClimaCellV4], update_interval: timedelta, ) -> None: """Initialize.""" self._config_entry = config_entry + self._api_version = config_entry.data[CONF_API_VERSION] self._api = api self.name = config_entry.data[CONF_NAME] self.data = {CURRENT: {}, FORECASTS: {}} @@ -173,27 +238,50 @@ async def _async_update_data(self) -> Dict[str, Any]: """Update data via library.""" data = {FORECASTS: {}} try: - data[CURRENT] = await self._api.realtime( - self._api.available_fields(REALTIME) - ) - data[FORECASTS][HOURLY] = await self._api.forecast_hourly( - self._api.available_fields(FORECAST_HOURLY), - None, - timedelta(hours=24), - ) - - data[FORECASTS][DAILY] = await self._api.forecast_daily( - self._api.available_fields(FORECAST_DAILY), None, timedelta(days=14) - ) - - data[FORECASTS][NOWCAST] = await self._api.forecast_nowcast( - self._api.available_fields(FORECAST_NOWCAST), - None, - timedelta( - minutes=min(300, self._config_entry.options[CONF_TIMESTEP] * 30) - ), - self._config_entry.options[CONF_TIMESTEP], - ) + if self._api_version == 3: + data[CURRENT] = await self._api.realtime( + self._api.available_fields(REALTIME) + ) + data[FORECASTS][HOURLY] = await self._api.forecast_hourly( + self._api.available_fields(FORECAST_HOURLY), + None, + timedelta(hours=24), + ) + + data[FORECASTS][DAILY] = await self._api.forecast_daily( + self._api.available_fields(FORECAST_DAILY), None, timedelta(days=14) + ) + + data[FORECASTS][NOWCAST] = await self._api.forecast_nowcast( + self._api.available_fields(FORECAST_NOWCAST), + None, + timedelta( + minutes=min(300, self._config_entry.options[CONF_TIMESTEP] * 30) + ), + self._config_entry.options[CONF_TIMESTEP], + ) + else: + return await self._api.realtime_and_all_forecasts( + [ + CC_ATTR_TEMPERATURE, + CC_ATTR_HUMIDITY, + CC_ATTR_PRESSURE, + CC_ATTR_WIND_SPEED, + CC_ATTR_WIND_DIRECTION, + CC_ATTR_CONDITION, + CC_ATTR_VISIBILITY, + CC_ATTR_OZONE, + ], + [ + CC_ATTR_TEMPERATURE_LOW, + CC_ATTR_TEMPERATURE_HIGH, + CC_ATTR_WIND_SPEED, + CC_ATTR_WIND_DIRECTION, + CC_ATTR_CONDITION, + CC_ATTR_PRECIPITATION, + CC_ATTR_PRECIPITATION_PROBABILITY, + ], + ) except ( CantConnectException, InvalidAPIKeyException, @@ -209,10 +297,16 @@ class ClimaCellEntity(CoordinatorEntity): """Base ClimaCell Entity.""" def __init__( - self, config_entry: ConfigEntry, coordinator: ClimaCellDataUpdateCoordinator + self, + config_entry: ConfigEntry, + coordinator: ClimaCellDataUpdateCoordinator, + forecast_type: str, + api_version: int, ) -> None: """Initialize ClimaCell Entity.""" super().__init__(coordinator) + self.api_version = api_version + self.forecast_type = forecast_type self._config_entry = config_entry @staticmethod @@ -236,15 +330,23 @@ def _get_cc_value( return items.get("value") + @property + def entity_registry_enabled_default(self) -> bool: + """Return if the entity should be enabled when first added to the entity registry.""" + if self.forecast_type == DEFAULT_FORECAST_TYPE: + return True + + return False + @property def name(self) -> str: """Return the name of the entity.""" - return self._config_entry.data[CONF_NAME] + return f"{self._config_entry.data[CONF_NAME]} - {self.forecast_type.title()}" @property def unique_id(self) -> str: """Return the unique id of the entity.""" - return self._config_entry.unique_id + return f"{self._config_entry.unique_id}_{self.forecast_type}" @property def attribution(self): diff --git a/homeassistant/components/climacell/config_flow.py b/homeassistant/components/climacell/config_flow.py index 09e02f3f559b7..1aca552cc5cbd 100644 --- a/homeassistant/components/climacell/config_flow.py +++ b/homeassistant/components/climacell/config_flow.py @@ -2,17 +2,23 @@ import logging from typing import Any, Dict -from pyclimacell import ClimaCell -from pyclimacell.const import REALTIME +from pyclimacell import ClimaCellV3 from pyclimacell.exceptions import ( CantConnectException, InvalidAPIKeyException, RateLimitedException, ) +from pyclimacell.pyclimacell import ClimaCellV4 import voluptuous as vol from homeassistant import config_entries, core -from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME +from homeassistant.const import ( + CONF_API_KEY, + CONF_API_VERSION, + CONF_LATITUDE, + CONF_LONGITUDE, + CONF_NAME, +) from homeassistant.core import callback from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -42,6 +48,7 @@ def _get_config_schema( CONF_NAME, default=input_dict.get(CONF_NAME, DEFAULT_NAME) ): str, vol.Required(CONF_API_KEY, default=input_dict.get(CONF_API_KEY)): str, + vol.Required(CONF_API_VERSION, default=4): vol.In([3, 4]), vol.Inclusive( CONF_LATITUDE, "location", @@ -84,7 +91,7 @@ async def async_step_init( vol.Required( CONF_TIMESTEP, default=self._config_entry.options.get(CONF_TIMESTEP, DEFAULT_TIMESTEP), - ): vol.All(vol.Coerce(int), vol.Range(min=1, max=60)), + ): vol.In([1, 5, 15, 30]), } return self.async_show_form( @@ -95,7 +102,7 @@ async def async_step_init( class ClimaCellConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): """Handle a config flow for ClimaCell Weather API.""" - VERSION = 1 + VERSION = 2 CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL @staticmethod @@ -119,12 +126,18 @@ async def async_step_user( self._abort_if_unique_id_configured() try: - await ClimaCell( + if user_input[CONF_API_VERSION] == 3: + api_class = ClimaCellV3 + field = "temp" + else: + api_class = ClimaCellV4 + field = "temperature" + await api_class( user_input[CONF_API_KEY], str(user_input.get(CONF_LATITUDE, self.hass.config.latitude)), str(user_input.get(CONF_LONGITUDE, self.hass.config.longitude)), session=async_get_clientsession(self.hass), - ).realtime(ClimaCell.first_field(REALTIME)) + ).realtime([field]) return self.async_create_entry( title=user_input[CONF_NAME], data=user_input diff --git a/homeassistant/components/climacell/const.py b/homeassistant/components/climacell/const.py index f2d0a59612190..01d85dcc16136 100644 --- a/homeassistant/components/climacell/const.py +++ b/homeassistant/components/climacell/const.py @@ -1,4 +1,5 @@ """Constants for the ClimaCell integration.""" +from pyclimacell.const import DAILY, HOURLY, NOWCAST, WeatherCode from homeassistant.components.weather import ( ATTR_CONDITION_CLEAR_NIGHT, @@ -16,15 +17,8 @@ ) CONF_TIMESTEP = "timestep" - -DAILY = "daily" -HOURLY = "hourly" -NOWCAST = "nowcast" FORECAST_TYPES = [DAILY, HOURLY, NOWCAST] -CURRENT = "current" -FORECASTS = "forecasts" - DEFAULT_NAME = "ClimaCell" DEFAULT_TIMESTEP = 15 DEFAULT_FORECAST_TYPE = DAILY @@ -33,7 +27,58 @@ MAX_REQUESTS_PER_DAY = 1000 +CLEAR_CONDITIONS = {"night": ATTR_CONDITION_CLEAR_NIGHT, "day": ATTR_CONDITION_SUNNY} + +MAX_FORECASTS = { + DAILY: 14, + HOURLY: 24, + NOWCAST: 30, +} + +# V4 constants CONDITIONS = { + WeatherCode.WIND: ATTR_CONDITION_WINDY, + WeatherCode.LIGHT_WIND: ATTR_CONDITION_WINDY, + WeatherCode.STRONG_WIND: ATTR_CONDITION_WINDY, + WeatherCode.FREEZING_RAIN: ATTR_CONDITION_SNOWY_RAINY, + WeatherCode.HEAVY_FREEZING_RAIN: ATTR_CONDITION_SNOWY_RAINY, + WeatherCode.LIGHT_FREEZING_RAIN: ATTR_CONDITION_SNOWY_RAINY, + WeatherCode.FREEZING_DRIZZLE: ATTR_CONDITION_SNOWY_RAINY, + WeatherCode.ICE_PELLETS: ATTR_CONDITION_HAIL, + WeatherCode.HEAVY_ICE_PELLETS: ATTR_CONDITION_HAIL, + WeatherCode.LIGHT_ICE_PELLETS: ATTR_CONDITION_HAIL, + WeatherCode.SNOW: ATTR_CONDITION_SNOWY, + WeatherCode.HEAVY_SNOW: ATTR_CONDITION_SNOWY, + WeatherCode.LIGHT_SNOW: ATTR_CONDITION_SNOWY, + WeatherCode.FLURRIES: ATTR_CONDITION_SNOWY, + WeatherCode.THUNDERSTORM: ATTR_CONDITION_LIGHTNING, + WeatherCode.RAIN: ATTR_CONDITION_POURING, + WeatherCode.HEAVY_RAIN: ATTR_CONDITION_RAINY, + WeatherCode.LIGHT_RAIN: ATTR_CONDITION_RAINY, + WeatherCode.DRIZZLE: ATTR_CONDITION_RAINY, + WeatherCode.FOG: ATTR_CONDITION_FOG, + WeatherCode.LIGHT_FOG: ATTR_CONDITION_FOG, + WeatherCode.CLOUDY: ATTR_CONDITION_CLOUDY, + WeatherCode.MOSTLY_CLOUDY: ATTR_CONDITION_CLOUDY, + WeatherCode.PARTLY_CLOUDY: ATTR_CONDITION_PARTLYCLOUDY, +} + +CC_ATTR_TIMESTAMP = "startTime" +CC_ATTR_TEMPERATURE = "temperature" +CC_ATTR_TEMPERATURE_HIGH = "temperatureMax" +CC_ATTR_TEMPERATURE_LOW = "temperatureMin" +CC_ATTR_PRESSURE = "pressureSeaLevel" +CC_ATTR_HUMIDITY = "humidity" +CC_ATTR_WIND_SPEED = "windSpeed" +CC_ATTR_WIND_DIRECTION = "windDirection" +CC_ATTR_OZONE = "pollutantO3" +CC_ATTR_CONDITION = "weatherCode" +CC_ATTR_VISIBILITY = "visibility" +CC_ATTR_PRECIPITATION = "precipitationIntensityAvg" +CC_ATTR_PRECIPITATION_PROBABILITY = "precipitationProbability" + +# V3 constants +CONDITIONS_V3 = { "breezy": ATTR_CONDITION_WINDY, "freezing_rain_heavy": ATTR_CONDITION_SNOWY_RAINY, "freezing_rain": ATTR_CONDITION_SNOWY_RAINY, @@ -58,24 +103,17 @@ "partly_cloudy": ATTR_CONDITION_PARTLYCLOUDY, } -CLEAR_CONDITIONS = {"night": ATTR_CONDITION_CLEAR_NIGHT, "day": ATTR_CONDITION_SUNNY} - -CC_ATTR_TIMESTAMP = "observation_time" -CC_ATTR_TEMPERATURE = "temp" -CC_ATTR_TEMPERATURE_HIGH = "max" -CC_ATTR_TEMPERATURE_LOW = "min" -CC_ATTR_PRESSURE = "baro_pressure" -CC_ATTR_HUMIDITY = "humidity" -CC_ATTR_WIND_SPEED = "wind_speed" -CC_ATTR_WIND_DIRECTION = "wind_direction" -CC_ATTR_OZONE = "o3" -CC_ATTR_CONDITION = "weather_code" -CC_ATTR_VISIBILITY = "visibility" -CC_ATTR_PRECIPITATION = "precipitation" -CC_ATTR_PRECIPITATION_DAILY = "precipitation_accumulation" -CC_ATTR_PRECIPITATION_PROBABILITY = "precipitation_probability" -CC_ATTR_PM_2_5 = "pm25" -CC_ATTR_PM_10 = "pm10" -CC_ATTR_CARBON_MONOXIDE = "co" -CC_ATTR_SULPHUR_DIOXIDE = "so2" -CC_ATTR_NITROGEN_DIOXIDE = "no2" +CC_V3_ATTR_TIMESTAMP = "observation_time" +CC_V3_ATTR_TEMPERATURE = "temp" +CC_V3_ATTR_TEMPERATURE_HIGH = "max" +CC_V3_ATTR_TEMPERATURE_LOW = "min" +CC_V3_ATTR_PRESSURE = "baro_pressure" +CC_V3_ATTR_HUMIDITY = "humidity" +CC_V3_ATTR_WIND_SPEED = "wind_speed" +CC_V3_ATTR_WIND_DIRECTION = "wind_direction" +CC_V3_ATTR_OZONE = "o3" +CC_V3_ATTR_CONDITION = "weather_code" +CC_V3_ATTR_VISIBILITY = "visibility" +CC_V3_ATTR_PRECIPITATION = "precipitation" +CC_V3_ATTR_PRECIPITATION_DAILY = "precipitation_accumulation" +CC_V3_ATTR_PRECIPITATION_PROBABILITY = "precipitation_probability" diff --git a/homeassistant/components/climacell/manifest.json b/homeassistant/components/climacell/manifest.json index f410c2275a970..fd4440e9add0c 100644 --- a/homeassistant/components/climacell/manifest.json +++ b/homeassistant/components/climacell/manifest.json @@ -3,6 +3,6 @@ "name": "ClimaCell", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/climacell", - "requirements": ["pyclimacell==0.14.0"], + "requirements": ["pyclimacell==0.17.0"], "codeowners": ["@raman325"] } diff --git a/homeassistant/components/climacell/strings.json b/homeassistant/components/climacell/strings.json index be80ac4e506a9..f4347d254b704 100644 --- a/homeassistant/components/climacell/strings.json +++ b/homeassistant/components/climacell/strings.json @@ -7,6 +7,7 @@ "data": { "name": "[%key:common::config_flow::data::name%]", "api_key": "[%key:common::config_flow::data::api_key%]", + "api_version": "API Version", "latitude": "[%key:common::config_flow::data::latitude%]", "longitude": "[%key:common::config_flow::data::longitude%]" } @@ -25,8 +26,7 @@ "title": "Update [%key:component::climacell::title%] Options", "description": "If you choose to enable the `nowcast` forecast entity, you can configure the number of minutes between each forecast. The number of forecasts provided depends on the number of minutes chosen between forecasts.", "data": { - "timestep": "Min. Between NowCast Forecasts", - "forecast_types": "Forecast Type(s)" + "timestep": "Min. Between NowCast Forecasts" } } } diff --git a/homeassistant/components/climacell/weather.py b/homeassistant/components/climacell/weather.py index e5a24197d6bad..ccac5df92ff6d 100644 --- a/homeassistant/components/climacell/weather.py +++ b/homeassistant/components/climacell/weather.py @@ -1,7 +1,9 @@ """Weather component that handles meteorological data for your location.""" from datetime import datetime import logging -from typing import Any, Callable, Dict, List, Optional +from typing import Any, Callable, Dict, List, Optional, Union + +from pyclimacell.const import CURRENT, DAILY, FORECASTS, HOURLY, NOWCAST, WeatherCode from homeassistant.components.weather import ( ATTR_FORECAST_CONDITION, @@ -16,6 +18,7 @@ ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( + CONF_API_VERSION, LENGTH_FEET, LENGTH_KILOMETERS, LENGTH_METERS, @@ -31,13 +34,12 @@ from homeassistant.util.distance import convert as distance_convert from homeassistant.util.pressure import convert as pressure_convert -from . import ClimaCellDataUpdateCoordinator, ClimaCellEntity +from . import ClimaCellEntity from .const import ( CC_ATTR_CONDITION, CC_ATTR_HUMIDITY, CC_ATTR_OZONE, CC_ATTR_PRECIPITATION, - CC_ATTR_PRECIPITATION_DAILY, CC_ATTR_PRECIPITATION_PROBABILITY, CC_ATTR_PRESSURE, CC_ATTR_TEMPERATURE, @@ -47,16 +49,26 @@ CC_ATTR_VISIBILITY, CC_ATTR_WIND_DIRECTION, CC_ATTR_WIND_SPEED, + CC_V3_ATTR_CONDITION, + CC_V3_ATTR_HUMIDITY, + CC_V3_ATTR_OZONE, + CC_V3_ATTR_PRECIPITATION, + CC_V3_ATTR_PRECIPITATION_DAILY, + CC_V3_ATTR_PRECIPITATION_PROBABILITY, + CC_V3_ATTR_PRESSURE, + CC_V3_ATTR_TEMPERATURE, + CC_V3_ATTR_TEMPERATURE_HIGH, + CC_V3_ATTR_TEMPERATURE_LOW, + CC_V3_ATTR_TIMESTAMP, + CC_V3_ATTR_VISIBILITY, + CC_V3_ATTR_WIND_DIRECTION, + CC_V3_ATTR_WIND_SPEED, CLEAR_CONDITIONS, CONDITIONS, + CONDITIONS_V3, CONF_TIMESTEP, - CURRENT, - DAILY, - DEFAULT_FORECAST_TYPE, DOMAIN, - FORECASTS, - HOURLY, - NOWCAST, + MAX_FORECASTS, ) # mypy: allow-untyped-defs, no-check-untyped-defs @@ -64,59 +76,6 @@ _LOGGER = logging.getLogger(__name__) -def _translate_condition( - condition: Optional[str], sun_is_up: bool = True -) -> Optional[str]: - """Translate ClimaCell condition into an HA condition.""" - if not condition: - return None - if "clear" in condition.lower(): - if sun_is_up: - return CLEAR_CONDITIONS["day"] - return CLEAR_CONDITIONS["night"] - return CONDITIONS[condition] - - -def _forecast_dict( - hass: HomeAssistantType, - forecast_dt: datetime, - use_datetime: bool, - condition: str, - precipitation: Optional[float], - precipitation_probability: Optional[float], - temp: Optional[float], - temp_low: Optional[float], - wind_direction: Optional[float], - wind_speed: Optional[float], -) -> Dict[str, Any]: - """Return formatted Forecast dict from ClimaCell forecast data.""" - if use_datetime: - translated_condition = _translate_condition(condition, is_up(hass, forecast_dt)) - else: - translated_condition = _translate_condition(condition, True) - - if hass.config.units.is_metric: - if precipitation: - precipitation = ( - distance_convert(precipitation / 12, LENGTH_FEET, LENGTH_METERS) * 1000 - ) - if wind_speed: - wind_speed = distance_convert(wind_speed, LENGTH_MILES, LENGTH_KILOMETERS) - - data = { - ATTR_FORECAST_TIME: forecast_dt.isoformat(), - ATTR_FORECAST_CONDITION: translated_condition, - ATTR_FORECAST_PRECIPITATION: precipitation, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: precipitation_probability, - ATTR_FORECAST_TEMP: temp, - ATTR_FORECAST_TEMP_LOW: temp_low, - ATTR_FORECAST_WIND_BEARING: wind_direction, - ATTR_FORECAST_WIND_SPEED: wind_speed, - } - - return {k: v for k, v in data.items() if v is not None} - - async def async_setup_entry( hass: HomeAssistantType, config_entry: ConfigEntry, @@ -124,49 +83,232 @@ async def async_setup_entry( ) -> None: """Set up a config entry.""" coordinator = hass.data[DOMAIN][config_entry.entry_id] + api_version = config_entry.data[CONF_API_VERSION] + api_class = ClimaCellV3WeatherEntity if api_version == 3 else ClimaCellWeatherEntity entities = [ - ClimaCellWeatherEntity(config_entry, coordinator, forecast_type) + api_class(config_entry, coordinator, forecast_type, api_version) for forecast_type in [DAILY, HOURLY, NOWCAST] ] async_add_entities(entities) -class ClimaCellWeatherEntity(ClimaCellEntity, WeatherEntity): - """Entity that talks to ClimaCell API to retrieve weather data.""" +class BaseClimaCellWeatherEntity(ClimaCellEntity, WeatherEntity): + """Base ClimaCell weather entity.""" - def __init__( + def _forecast_dict( self, - config_entry: ConfigEntry, - coordinator: ClimaCellDataUpdateCoordinator, - forecast_type: str, - ) -> None: - """Initialize ClimaCell weather entity.""" - super().__init__(config_entry, coordinator) - self.forecast_type = forecast_type + forecast_dt: datetime, + use_datetime: bool, + condition: str, + precipitation: Optional[float], + precipitation_probability: Optional[float], + temp: Optional[float], + temp_low: Optional[float], + wind_direction: Optional[float], + wind_speed: Optional[float], + ) -> Dict[str, Any]: + """Return formatted Forecast dict from ClimaCell forecast data.""" + if use_datetime: + translated_condition = self._translate_condition( + condition, is_up(self.hass, forecast_dt) + ) + else: + translated_condition = self._translate_condition(condition, True) + + if self.hass.config.units.is_metric: + if precipitation: + precipitation = ( + distance_convert(precipitation / 12, LENGTH_FEET, LENGTH_METERS) + * 1000 + ) + if wind_speed: + wind_speed = distance_convert( + wind_speed, LENGTH_MILES, LENGTH_KILOMETERS + ) + + data = { + ATTR_FORECAST_TIME: forecast_dt.isoformat(), + ATTR_FORECAST_CONDITION: translated_condition, + ATTR_FORECAST_PRECIPITATION: precipitation, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: precipitation_probability, + ATTR_FORECAST_TEMP: temp, + ATTR_FORECAST_TEMP_LOW: temp_low, + ATTR_FORECAST_WIND_BEARING: wind_direction, + ATTR_FORECAST_WIND_SPEED: wind_speed, + } + + return {k: v for k, v in data.items() if v is not None} + + +class ClimaCellWeatherEntity(BaseClimaCellWeatherEntity): + """Entity that talks to ClimaCell v4 API to retrieve weather data.""" + + @staticmethod + def _translate_condition( + condition: Optional[int], sun_is_up: bool = True + ) -> Optional[str]: + """Translate ClimaCell condition into an HA condition.""" + if condition is None: + return None + # We won't guard here, instead we will fail hard + condition = WeatherCode(condition) + if condition in (WeatherCode.CLEAR, WeatherCode.MOSTLY_CLEAR): + if sun_is_up: + return CLEAR_CONDITIONS["day"] + return CLEAR_CONDITIONS["night"] + return CONDITIONS[condition] + + def _get_current_property( + self, property_name: str + ) -> Optional[Union[int, str, float]]: + """Get property from current conditions.""" + return self.coordinator.data.get(CURRENT, {}).get(property_name) @property - def entity_registry_enabled_default(self) -> bool: - """Return if the entity should be enabled when first added to the entity registry.""" - if self.forecast_type == DEFAULT_FORECAST_TYPE: - return True + def temperature(self): + """Return the platform temperature.""" + return self._get_current_property(CC_ATTR_TEMPERATURE) - return False + @property + def temperature_unit(self): + """Return the unit of measurement.""" + return TEMP_FAHRENHEIT @property - def name(self) -> str: - """Return the name of the entity.""" - return f"{super().name} - {self.forecast_type.title()}" + def pressure(self): + """Return the pressure.""" + pressure = self._get_current_property(CC_ATTR_PRESSURE) + if self.hass.config.units.is_metric and pressure: + return pressure_convert(pressure, PRESSURE_INHG, PRESSURE_HPA) + return pressure @property - def unique_id(self) -> str: - """Return the unique id of the entity.""" - return f"{super().unique_id}_{self.forecast_type}" + def humidity(self): + """Return the humidity.""" + return self._get_current_property(CC_ATTR_HUMIDITY) + + @property + def wind_speed(self): + """Return the wind speed.""" + wind_speed = self._get_current_property(CC_ATTR_WIND_SPEED) + if self.hass.config.units.is_metric and wind_speed: + return distance_convert(wind_speed, LENGTH_MILES, LENGTH_KILOMETERS) + return wind_speed + + @property + def wind_bearing(self): + """Return the wind bearing.""" + return self._get_current_property(CC_ATTR_WIND_DIRECTION) + + @property + def ozone(self): + """Return the O3 (ozone) level.""" + return self._get_current_property(CC_ATTR_OZONE) + + @property + def condition(self): + """Return the condition.""" + return self._translate_condition( + self._get_current_property(CC_ATTR_CONDITION), + is_up(self.hass), + ) + + @property + def visibility(self): + """Return the visibility.""" + visibility = self._get_current_property(CC_ATTR_VISIBILITY) + if self.hass.config.units.is_metric and visibility: + return distance_convert(visibility, LENGTH_MILES, LENGTH_KILOMETERS) + return visibility + + @property + def forecast(self): + """Return the forecast.""" + # Check if forecasts are available + if not self.coordinator.data[FORECASTS].get(self.forecast_type): + return None + + forecasts = [] + max_forecasts = MAX_FORECASTS[self.forecast_type] + forecast_count = 0 + + # Set default values (in cases where keys don't exist), None will be + # returned. Override properties per forecast type as needed + for forecast in self.coordinator.data[FORECASTS][self.forecast_type]: + forecast_dt = dt_util.parse_datetime(forecast[CC_ATTR_TIMESTAMP]) + + # Throw out past data + if forecast_dt < dt_util.utcnow(): + continue + + values = forecast["values"] + use_datetime = True + + condition = values.get(CC_ATTR_CONDITION) + precipitation = values.get(CC_ATTR_PRECIPITATION) + precipitation_probability = values.get(CC_ATTR_PRECIPITATION_PROBABILITY) + + temp = values.get(CC_ATTR_TEMPERATURE_HIGH) + temp_low = values.get(CC_ATTR_TEMPERATURE_LOW) + wind_direction = values.get(CC_ATTR_WIND_DIRECTION) + wind_speed = values.get(CC_ATTR_WIND_SPEED) + + if self.forecast_type == DAILY: + use_datetime = False + if precipitation: + precipitation = precipitation * 24 + elif self.forecast_type == NOWCAST: + # Precipitation is forecasted in CONF_TIMESTEP increments but in a + # per hour rate, so value needs to be converted to an amount. + if precipitation: + precipitation = ( + precipitation / 60 * self._config_entry.options[CONF_TIMESTEP] + ) + + forecasts.append( + self._forecast_dict( + forecast_dt, + use_datetime, + condition, + precipitation, + precipitation_probability, + temp, + temp_low, + wind_direction, + wind_speed, + ) + ) + + forecast_count += 1 + if forecast_count == max_forecasts: + break + + return forecasts + + +class ClimaCellV3WeatherEntity(BaseClimaCellWeatherEntity): + """Entity that talks to ClimaCell v3 API to retrieve weather data.""" + + @staticmethod + def _translate_condition( + condition: Optional[str], sun_is_up: bool = True + ) -> Optional[str]: + """Translate ClimaCell condition into an HA condition.""" + if not condition: + return None + if "clear" in condition.lower(): + if sun_is_up: + return CLEAR_CONDITIONS["day"] + return CLEAR_CONDITIONS["night"] + return CONDITIONS_V3[condition] @property def temperature(self): """Return the platform temperature.""" - return self._get_cc_value(self.coordinator.data[CURRENT], CC_ATTR_TEMPERATURE) + return self._get_cc_value( + self.coordinator.data[CURRENT], CC_V3_ATTR_TEMPERATURE + ) @property def temperature_unit(self): @@ -176,7 +318,9 @@ def temperature_unit(self): @property def pressure(self): """Return the pressure.""" - pressure = self._get_cc_value(self.coordinator.data[CURRENT], CC_ATTR_PRESSURE) + pressure = self._get_cc_value( + self.coordinator.data[CURRENT], CC_V3_ATTR_PRESSURE + ) if self.hass.config.units.is_metric and pressure: return pressure_convert(pressure, PRESSURE_INHG, PRESSURE_HPA) return pressure @@ -184,13 +328,13 @@ def pressure(self): @property def humidity(self): """Return the humidity.""" - return self._get_cc_value(self.coordinator.data[CURRENT], CC_ATTR_HUMIDITY) + return self._get_cc_value(self.coordinator.data[CURRENT], CC_V3_ATTR_HUMIDITY) @property def wind_speed(self): """Return the wind speed.""" wind_speed = self._get_cc_value( - self.coordinator.data[CURRENT], CC_ATTR_WIND_SPEED + self.coordinator.data[CURRENT], CC_V3_ATTR_WIND_SPEED ) if self.hass.config.units.is_metric and wind_speed: return distance_convert(wind_speed, LENGTH_MILES, LENGTH_KILOMETERS) @@ -200,19 +344,19 @@ def wind_speed(self): def wind_bearing(self): """Return the wind bearing.""" return self._get_cc_value( - self.coordinator.data[CURRENT], CC_ATTR_WIND_DIRECTION + self.coordinator.data[CURRENT], CC_V3_ATTR_WIND_DIRECTION ) @property def ozone(self): """Return the O3 (ozone) level.""" - return self._get_cc_value(self.coordinator.data[CURRENT], CC_ATTR_OZONE) + return self._get_cc_value(self.coordinator.data[CURRENT], CC_V3_ATTR_OZONE) @property def condition(self): """Return the condition.""" - return _translate_condition( - self._get_cc_value(self.coordinator.data[CURRENT], CC_ATTR_CONDITION), + return self._translate_condition( + self._get_cc_value(self.coordinator.data[CURRENT], CC_V3_ATTR_CONDITION), is_up(self.hass), ) @@ -220,7 +364,7 @@ def condition(self): def visibility(self): """Return the visibility.""" visibility = self._get_cc_value( - self.coordinator.data[CURRENT], CC_ATTR_VISIBILITY + self.coordinator.data[CURRENT], CC_V3_ATTR_VISIBILITY ) if self.hass.config.units.is_metric and visibility: return distance_convert(visibility, LENGTH_MILES, LENGTH_KILOMETERS) @@ -238,41 +382,42 @@ def forecast(self): # Set default values (in cases where keys don't exist), None will be # returned. Override properties per forecast type as needed for forecast in self.coordinator.data[FORECASTS][self.forecast_type]: + _LOGGER.error(forecast) forecast_dt = dt_util.parse_datetime( - self._get_cc_value(forecast, CC_ATTR_TIMESTAMP) + self._get_cc_value(forecast, CC_V3_ATTR_TIMESTAMP) ) use_datetime = True - condition = self._get_cc_value(forecast, CC_ATTR_CONDITION) - precipitation = self._get_cc_value(forecast, CC_ATTR_PRECIPITATION) + condition = self._get_cc_value(forecast, CC_V3_ATTR_CONDITION) + _LOGGER.error(condition) + precipitation = self._get_cc_value(forecast, CC_V3_ATTR_PRECIPITATION) precipitation_probability = self._get_cc_value( - forecast, CC_ATTR_PRECIPITATION_PROBABILITY + forecast, CC_V3_ATTR_PRECIPITATION_PROBABILITY ) - temp = self._get_cc_value(forecast, CC_ATTR_TEMPERATURE) - temp_low = None - wind_direction = self._get_cc_value(forecast, CC_ATTR_WIND_DIRECTION) - wind_speed = self._get_cc_value(forecast, CC_ATTR_WIND_SPEED) + temp = self._get_cc_value(forecast, CC_V3_ATTR_TEMPERATURE) + wind_direction = self._get_cc_value(forecast, CC_V3_ATTR_WIND_DIRECTION) + wind_speed = self._get_cc_value(forecast, CC_V3_ATTR_WIND_SPEED) if self.forecast_type == DAILY: use_datetime = False forecast_dt = dt_util.start_of_local_day(forecast_dt) precipitation = self._get_cc_value( - forecast, CC_ATTR_PRECIPITATION_DAILY + forecast, CC_V3_ATTR_PRECIPITATION_DAILY ) temp = next( ( - self._get_cc_value(item, CC_ATTR_TEMPERATURE_HIGH) - for item in forecast[CC_ATTR_TEMPERATURE] + self._get_cc_value(item, CC_V3_ATTR_TEMPERATURE_HIGH) + for item in forecast[CC_V3_ATTR_TEMPERATURE] if "max" in item ), temp, ) temp_low = next( ( - self._get_cc_value(item, CC_ATTR_TEMPERATURE_LOW) - for item in forecast[CC_ATTR_TEMPERATURE] + self._get_cc_value(item, CC_V3_ATTR_TEMPERATURE_LOW) + for item in forecast[CC_V3_ATTR_TEMPERATURE] if "min" in item ), - temp_low, + temp, ) elif self.forecast_type == NOWCAST: # Precipitation is forecasted in CONF_TIMESTEP increments but in a @@ -283,8 +428,7 @@ def forecast(self): ) forecasts.append( - _forecast_dict( - self.hass, + self._forecast_dict( forecast_dt, use_datetime, condition, diff --git a/requirements_all.txt b/requirements_all.txt index 99854ac3d9fc7..326067457362a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1308,7 +1308,7 @@ pychromecast==9.1.1 pycketcasts==1.0.0 # homeassistant.components.climacell -pyclimacell==0.14.0 +pyclimacell==0.17.0 # homeassistant.components.cmus pycmus==0.1.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 4517457935ba8..e4109dcc1f037 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -688,7 +688,7 @@ pycfdns==1.2.1 pychromecast==9.1.1 # homeassistant.components.climacell -pyclimacell==0.14.0 +pyclimacell==0.17.0 # homeassistant.components.comfoconnect pycomfoconnect==0.4 From 032706aab4a76aded7c6a67c2a9e640008f227f2 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Sun, 7 Mar 2021 12:29:15 -0500 Subject: [PATCH 02/15] fix tests --- homeassistant/components/climacell/weather.py | 2 +- tests/components/climacell/conftest.py | 16 ++- tests/components/climacell/const.py | 9 +- .../components/climacell/test_config_flow.py | 44 +++++- tests/components/climacell/test_init.py | 125 +++++++++++++++++- 5 files changed, 180 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/climacell/weather.py b/homeassistant/components/climacell/weather.py index ccac5df92ff6d..863aaf78175c2 100644 --- a/homeassistant/components/climacell/weather.py +++ b/homeassistant/components/climacell/weather.py @@ -226,7 +226,7 @@ def visibility(self): def forecast(self): """Return the forecast.""" # Check if forecasts are available - if not self.coordinator.data[FORECASTS].get(self.forecast_type): + if not self.coordinator.data.get(FORECASTS, {}).get(self.forecast_type): return None forecasts = [] diff --git a/tests/components/climacell/conftest.py b/tests/components/climacell/conftest.py index 3666243b4b4a4..416d1cf0fb54d 100644 --- a/tests/components/climacell/conftest.py +++ b/tests/components/climacell/conftest.py @@ -17,7 +17,10 @@ def skip_notifications_fixture(): def climacell_config_flow_connect(): """Mock valid climacell config flow setup.""" with patch( - "homeassistant.components.climacell.config_flow.ClimaCell.realtime", + "homeassistant.components.climacell.config_flow.ClimaCellV3.realtime", + return_value={}, + ), patch( + "homeassistant.components.climacell.config_flow.ClimaCellV4.realtime", return_value={}, ): yield @@ -27,16 +30,19 @@ def climacell_config_flow_connect(): def climacell_config_entry_update_fixture(): """Mock valid climacell config entry setup.""" with patch( - "homeassistant.components.climacell.ClimaCell.realtime", + "homeassistant.components.climacell.ClimaCellV3.realtime", return_value={}, ), patch( - "homeassistant.components.climacell.ClimaCell.forecast_hourly", + "homeassistant.components.climacell.ClimaCellV3.forecast_hourly", return_value=[], ), patch( - "homeassistant.components.climacell.ClimaCell.forecast_daily", + "homeassistant.components.climacell.ClimaCellV3.forecast_daily", return_value=[], ), patch( - "homeassistant.components.climacell.ClimaCell.forecast_nowcast", + "homeassistant.components.climacell.ClimaCellV3.forecast_nowcast", return_value=[], + ), patch( + "homeassistant.components.climacell.ClimaCellV4.realtime_and_all_forecasts", + return_value={}, ): yield diff --git a/tests/components/climacell/const.py b/tests/components/climacell/const.py index ada0ebd1eb5c3..495f5ff7bc22c 100644 --- a/tests/components/climacell/const.py +++ b/tests/components/climacell/const.py @@ -1,9 +1,16 @@ """Constants for climacell tests.""" -from homeassistant.const import CONF_API_KEY +from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME API_KEY = "aa" MIN_CONFIG = { CONF_API_KEY: API_KEY, } + +V1_ENTRY_DATA = { + CONF_NAME: "ClimaCell", + CONF_API_KEY: API_KEY, + CONF_LATITUDE: 80, + CONF_LONGITUDE: 80, +} diff --git a/tests/components/climacell/test_config_flow.py b/tests/components/climacell/test_config_flow.py index a34bf6fd0fde4..0ac1c92caf580 100644 --- a/tests/components/climacell/test_config_flow.py +++ b/tests/components/climacell/test_config_flow.py @@ -21,7 +21,13 @@ DOMAIN, ) from homeassistant.config_entries import SOURCE_USER -from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME +from homeassistant.const import ( + CONF_API_KEY, + CONF_API_VERSION, + CONF_LATITUDE, + CONF_LONGITUDE, + CONF_NAME, +) from homeassistant.helpers.typing import HomeAssistantType from .const import API_KEY, MIN_CONFIG @@ -48,6 +54,32 @@ async def test_user_flow_minimum_fields(hass: HomeAssistantType) -> None: assert result["title"] == DEFAULT_NAME assert result["data"][CONF_NAME] == DEFAULT_NAME assert result["data"][CONF_API_KEY] == API_KEY + assert result["data"][CONF_API_VERSION] == 4 + assert result["data"][CONF_LATITUDE] == hass.config.latitude + assert result["data"][CONF_LONGITUDE] == hass.config.longitude + + +async def test_user_flow_v3(hass: HomeAssistantType) -> None: + """Test user config flow with v3 API.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER} + ) + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "user" + + data = _get_config_schema(hass, MIN_CONFIG)(MIN_CONFIG) + data[CONF_API_VERSION] = 3 + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input=data, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["title"] == DEFAULT_NAME + assert result["data"][CONF_NAME] == DEFAULT_NAME + assert result["data"][CONF_API_KEY] == API_KEY + assert result["data"][CONF_API_VERSION] == 3 assert result["data"][CONF_LATITUDE] == hass.config.latitude assert result["data"][CONF_LONGITUDE] == hass.config.longitude @@ -60,6 +92,7 @@ async def test_user_flow_same_unique_ids(hass: HomeAssistantType) -> None: data=user_input, source=SOURCE_USER, unique_id=_get_unique_id(hass, user_input), + version=2, ).add_to_hass(hass) result = await hass.config_entries.flow.async_init( @@ -75,7 +108,7 @@ async def test_user_flow_same_unique_ids(hass: HomeAssistantType) -> None: async def test_user_flow_cannot_connect(hass: HomeAssistantType) -> None: """Test user config flow when ClimaCell can't connect.""" with patch( - "homeassistant.components.climacell.config_flow.ClimaCell.realtime", + "homeassistant.components.climacell.config_flow.ClimaCellV4.realtime", side_effect=CantConnectException, ): result = await hass.config_entries.flow.async_init( @@ -91,7 +124,7 @@ async def test_user_flow_cannot_connect(hass: HomeAssistantType) -> None: async def test_user_flow_invalid_api(hass: HomeAssistantType) -> None: """Test user config flow when API key is invalid.""" with patch( - "homeassistant.components.climacell.config_flow.ClimaCell.realtime", + "homeassistant.components.climacell.config_flow.ClimaCellV4.realtime", side_effect=InvalidAPIKeyException, ): result = await hass.config_entries.flow.async_init( @@ -107,7 +140,7 @@ async def test_user_flow_invalid_api(hass: HomeAssistantType) -> None: async def test_user_flow_rate_limited(hass: HomeAssistantType) -> None: """Test user config flow when API key is rate limited.""" with patch( - "homeassistant.components.climacell.config_flow.ClimaCell.realtime", + "homeassistant.components.climacell.config_flow.ClimaCellV4.realtime", side_effect=RateLimitedException, ): result = await hass.config_entries.flow.async_init( @@ -123,7 +156,7 @@ async def test_user_flow_rate_limited(hass: HomeAssistantType) -> None: async def test_user_flow_unknown_exception(hass: HomeAssistantType) -> None: """Test user config flow when unknown error occurs.""" with patch( - "homeassistant.components.climacell.config_flow.ClimaCell.realtime", + "homeassistant.components.climacell.config_flow.ClimaCellV4.realtime", side_effect=UnknownException, ): result = await hass.config_entries.flow.async_init( @@ -144,6 +177,7 @@ async def test_options_flow(hass: HomeAssistantType) -> None: data=user_config, source=SOURCE_USER, unique_id=_get_unique_id(hass, user_config), + version=2, ) entry.add_to_hass(hass) diff --git a/tests/components/climacell/test_init.py b/tests/components/climacell/test_init.py index f3d7e490090ad..a9e5061f17414 100644 --- a/tests/components/climacell/test_init.py +++ b/tests/components/climacell/test_init.py @@ -7,11 +7,12 @@ _get_config_schema, _get_unique_id, ) -from homeassistant.components.climacell.const import DOMAIN +from homeassistant.components.climacell.const import CONF_TIMESTEP, DOMAIN from homeassistant.components.weather import DOMAIN as WEATHER_DOMAIN +from homeassistant.const import CONF_API_VERSION from homeassistant.helpers.typing import HomeAssistantType -from .const import MIN_CONFIG +from .const import MIN_CONFIG, V1_ENTRY_DATA from tests.common import MockConfigEntry @@ -23,10 +24,12 @@ async def test_load_and_unload( climacell_config_entry_update: pytest.fixture, ) -> None: """Test loading and unloading entry.""" + data = _get_config_schema(hass)(MIN_CONFIG) config_entry = MockConfigEntry( domain=DOMAIN, - data=_get_config_schema(hass)(MIN_CONFIG), - unique_id=_get_unique_id(hass, _get_config_schema(hass)(MIN_CONFIG)), + data=data, + unique_id=_get_unique_id(hass, data), + version=2, ) config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) @@ -36,3 +39,117 @@ async def test_load_and_unload( assert await hass.config_entries.async_remove(config_entry.entry_id) await hass.async_block_till_done() assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 0 + + +async def test_v3_load_and_unload( + hass: HomeAssistantType, + climacell_config_entry_update: pytest.fixture, +) -> None: + """Test loading and unloading v3 entry.""" + data = _get_config_schema(hass)({**MIN_CONFIG, CONF_API_VERSION: 3}) + config_entry = MockConfigEntry( + domain=DOMAIN, + data=data, + unique_id=_get_unique_id(hass, data), + version=2, + ) + config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 1 + + assert await hass.config_entries.async_remove(config_entry.entry_id) + await hass.async_block_till_done() + assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 0 + + +async def test_migrate_timestep_1( + hass: HomeAssistantType, + climacell_config_entry_update: pytest.fixture, +) -> None: + """Test migration to timestep 1.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + data=V1_ENTRY_DATA, + options={CONF_TIMESTEP: 2}, + unique_id=_get_unique_id(hass, V1_ENTRY_DATA), + version=1, + ) + config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + assert config_entry.version == 2 + assert ( + CONF_API_VERSION in config_entry.data + and config_entry.data[CONF_API_VERSION] == 3 + ) + assert config_entry.options[CONF_TIMESTEP] == 1 + + +async def test_migrate_timestep_5( + hass: HomeAssistantType, + climacell_config_entry_update: pytest.fixture, +) -> None: + """Test migration to timestep 5.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + data=V1_ENTRY_DATA, + options={CONF_TIMESTEP: 7}, + unique_id=_get_unique_id(hass, V1_ENTRY_DATA), + version=1, + ) + config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + assert config_entry.version == 2 + assert ( + CONF_API_VERSION in config_entry.data + and config_entry.data[CONF_API_VERSION] == 3 + ) + assert config_entry.options[CONF_TIMESTEP] == 5 + + +async def test_migrate_timestep_15( + hass: HomeAssistantType, + climacell_config_entry_update: pytest.fixture, +) -> None: + """Test migration to timestep 15.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + data=V1_ENTRY_DATA, + options={CONF_TIMESTEP: 20}, + unique_id=_get_unique_id(hass, V1_ENTRY_DATA), + version=1, + ) + config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + assert config_entry.version == 2 + assert ( + CONF_API_VERSION in config_entry.data + and config_entry.data[CONF_API_VERSION] == 3 + ) + assert config_entry.options[CONF_TIMESTEP] == 15 + + +async def test_migrate_timestep_30( + hass: HomeAssistantType, + climacell_config_entry_update: pytest.fixture, +) -> None: + """Test migration to timestep 30.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + data=V1_ENTRY_DATA, + options={CONF_TIMESTEP: 21}, + unique_id=_get_unique_id(hass, V1_ENTRY_DATA), + version=1, + ) + config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + assert config_entry.version == 2 + assert ( + CONF_API_VERSION in config_entry.data + and config_entry.data[CONF_API_VERSION] == 3 + ) + assert config_entry.options[CONF_TIMESTEP] == 30 From 8e6c322c1b78548a50c55c55354a0ebe94a8da74 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Sun, 7 Mar 2021 12:40:38 -0500 Subject: [PATCH 03/15] use constants --- homeassistant/components/climacell/config_flow.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/climacell/config_flow.py b/homeassistant/components/climacell/config_flow.py index 1aca552cc5cbd..a5fadfe571987 100644 --- a/homeassistant/components/climacell/config_flow.py +++ b/homeassistant/components/climacell/config_flow.py @@ -24,7 +24,13 @@ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.typing import HomeAssistantType -from .const import CONF_TIMESTEP, DEFAULT_NAME, DEFAULT_TIMESTEP +from .const import ( + CC_ATTR_TEMPERATURE, + CC_V3_ATTR_TEMPERATURE, + CONF_TIMESTEP, + DEFAULT_NAME, + DEFAULT_TIMESTEP, +) from .const import DOMAIN # pylint: disable=unused-import _LOGGER = logging.getLogger(__name__) @@ -128,10 +134,10 @@ async def async_step_user( try: if user_input[CONF_API_VERSION] == 3: api_class = ClimaCellV3 - field = "temp" + field = CC_V3_ATTR_TEMPERATURE else: api_class = ClimaCellV4 - field = "temperature" + field = CC_ATTR_TEMPERATURE await api_class( user_input[CONF_API_KEY], str(user_input.get(CONF_LATITUDE, self.hass.config.latitude)), From e764d163c1e293d066975bb97c3bc139dbac3489 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Sun, 7 Mar 2021 13:32:13 -0500 Subject: [PATCH 04/15] fix logic and update tests --- .coveragerc | 1 - homeassistant/components/climacell/weather.py | 4 +- tests/components/climacell/conftest.py | 13 +- tests/components/climacell/const.py | 24 +- tests/components/climacell/test_init.py | 4 +- tests/components/climacell/test_weather.py | 364 ++ .../fixtures/climacell/v3_forecast_daily.json | 2177 +++++++++ .../climacell/v3_forecast_hourly.json | 3702 ++++++++++++++ .../climacell/v3_forecast_nowcast.json | 4232 +++++++++++++++++ tests/fixtures/climacell/v3_realtime.json | 147 + tests/fixtures/climacell/v4.json | 2360 +++++++++ 11 files changed, 13016 insertions(+), 12 deletions(-) create mode 100644 tests/components/climacell/test_weather.py create mode 100644 tests/fixtures/climacell/v3_forecast_daily.json create mode 100644 tests/fixtures/climacell/v3_forecast_hourly.json create mode 100644 tests/fixtures/climacell/v3_forecast_nowcast.json create mode 100644 tests/fixtures/climacell/v3_realtime.json create mode 100644 tests/fixtures/climacell/v4.json diff --git a/.coveragerc b/.coveragerc index 5d502a7503aa6..c1e7b870894ff 100644 --- a/.coveragerc +++ b/.coveragerc @@ -145,7 +145,6 @@ omit = homeassistant/components/clickatell/notify.py homeassistant/components/clicksend/notify.py homeassistant/components/clicksend_tts/notify.py - homeassistant/components/climacell/weather.py homeassistant/components/cmus/media_player.py homeassistant/components/co2signal/* homeassistant/components/coinbase/* diff --git a/homeassistant/components/climacell/weather.py b/homeassistant/components/climacell/weather.py index 863aaf78175c2..8c824f898f842 100644 --- a/homeassistant/components/climacell/weather.py +++ b/homeassistant/components/climacell/weather.py @@ -239,7 +239,7 @@ def forecast(self): forecast_dt = dt_util.parse_datetime(forecast[CC_ATTR_TIMESTAMP]) # Throw out past data - if forecast_dt < dt_util.utcnow(): + if forecast_dt.date() < dt_util.utcnow().date(): continue values = forecast["values"] @@ -382,13 +382,11 @@ def forecast(self): # Set default values (in cases where keys don't exist), None will be # returned. Override properties per forecast type as needed for forecast in self.coordinator.data[FORECASTS][self.forecast_type]: - _LOGGER.error(forecast) forecast_dt = dt_util.parse_datetime( self._get_cc_value(forecast, CC_V3_ATTR_TIMESTAMP) ) use_datetime = True condition = self._get_cc_value(forecast, CC_V3_ATTR_CONDITION) - _LOGGER.error(condition) precipitation = self._get_cc_value(forecast, CC_V3_ATTR_PRECIPITATION) precipitation_probability = self._get_cc_value( forecast, CC_V3_ATTR_PRECIPITATION_PROBABILITY diff --git a/tests/components/climacell/conftest.py b/tests/components/climacell/conftest.py index 416d1cf0fb54d..d4c77c58879f0 100644 --- a/tests/components/climacell/conftest.py +++ b/tests/components/climacell/conftest.py @@ -1,8 +1,11 @@ """Configure py.test.""" +import json from unittest.mock import patch import pytest +from tests.common import load_fixture + @pytest.fixture(name="skip_notifications", autouse=True) def skip_notifications_fixture(): @@ -31,18 +34,18 @@ def climacell_config_entry_update_fixture(): """Mock valid climacell config entry setup.""" with patch( "homeassistant.components.climacell.ClimaCellV3.realtime", - return_value={}, + return_value=json.loads(load_fixture("climacell/v3_realtime.json")), ), patch( "homeassistant.components.climacell.ClimaCellV3.forecast_hourly", - return_value=[], + return_value=json.loads(load_fixture("climacell/v3_forecast_hourly.json")), ), patch( "homeassistant.components.climacell.ClimaCellV3.forecast_daily", - return_value=[], + return_value=json.loads(load_fixture("climacell/v3_forecast_daily.json")), ), patch( "homeassistant.components.climacell.ClimaCellV3.forecast_nowcast", - return_value=[], + return_value=json.loads(load_fixture("climacell/v3_forecast_nowcast.json")), ), patch( "homeassistant.components.climacell.ClimaCellV4.realtime_and_all_forecasts", - return_value={}, + return_value=json.loads(load_fixture("climacell/v4.json")), ): yield diff --git a/tests/components/climacell/const.py b/tests/components/climacell/const.py index 495f5ff7bc22c..be933ecde290f 100644 --- a/tests/components/climacell/const.py +++ b/tests/components/climacell/const.py @@ -1,6 +1,12 @@ """Constants for climacell tests.""" -from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME +from homeassistant.const import ( + CONF_API_KEY, + CONF_API_VERSION, + CONF_LATITUDE, + CONF_LONGITUDE, + CONF_NAME, +) API_KEY = "aa" @@ -14,3 +20,19 @@ CONF_LATITUDE: 80, CONF_LONGITUDE: 80, } + +API_V3_ENTRY_DATA = { + CONF_NAME: "ClimaCell", + CONF_API_KEY: API_KEY, + CONF_LATITUDE: 80, + CONF_LONGITUDE: 80, + CONF_API_VERSION: 3, +} + +API_V4_ENTRY_DATA = { + CONF_NAME: "ClimaCell", + CONF_API_KEY: API_KEY, + CONF_LATITUDE: 80, + CONF_LONGITUDE: 80, + CONF_API_VERSION: 4, +} diff --git a/tests/components/climacell/test_init.py b/tests/components/climacell/test_init.py index a9e5061f17414..622948237ff5f 100644 --- a/tests/components/climacell/test_init.py +++ b/tests/components/climacell/test_init.py @@ -12,7 +12,7 @@ from homeassistant.const import CONF_API_VERSION from homeassistant.helpers.typing import HomeAssistantType -from .const import MIN_CONFIG, V1_ENTRY_DATA +from .const import API_V3_ENTRY_DATA, MIN_CONFIG, V1_ENTRY_DATA from tests.common import MockConfigEntry @@ -46,7 +46,7 @@ async def test_v3_load_and_unload( climacell_config_entry_update: pytest.fixture, ) -> None: """Test loading and unloading v3 entry.""" - data = _get_config_schema(hass)({**MIN_CONFIG, CONF_API_VERSION: 3}) + data = _get_config_schema(hass)(API_V3_ENTRY_DATA) config_entry = MockConfigEntry( domain=DOMAIN, data=data, diff --git a/tests/components/climacell/test_weather.py b/tests/components/climacell/test_weather.py new file mode 100644 index 0000000000000..0028b9e7bb6ab --- /dev/null +++ b/tests/components/climacell/test_weather.py @@ -0,0 +1,364 @@ +"""Tests for Climacell weather entity.""" +import logging +from typing import Any, Dict + +import pytest + +from homeassistant.components.climacell.config_flow import ( + _get_config_schema, + _get_unique_id, +) +from homeassistant.components.climacell.const import ATTRIBUTION, DOMAIN +from homeassistant.components.weather import ( + ATTR_CONDITION_CLOUDY, + ATTR_CONDITION_RAINY, + ATTR_CONDITION_SNOWY, + ATTR_CONDITION_SUNNY, + ATTR_FORECAST, + ATTR_FORECAST_CONDITION, + ATTR_FORECAST_PRECIPITATION, + ATTR_FORECAST_PRECIPITATION_PROBABILITY, + ATTR_FORECAST_TEMP, + ATTR_FORECAST_TEMP_LOW, + ATTR_FORECAST_TIME, + ATTR_FORECAST_WIND_BEARING, + ATTR_FORECAST_WIND_SPEED, + ATTR_WEATHER_HUMIDITY, + ATTR_WEATHER_OZONE, + ATTR_WEATHER_PRESSURE, + ATTR_WEATHER_TEMPERATURE, + ATTR_WEATHER_VISIBILITY, + ATTR_WEATHER_WIND_BEARING, + ATTR_WEATHER_WIND_SPEED, + DOMAIN as WEATHER_DOMAIN, +) +from homeassistant.const import ATTR_ATTRIBUTION, ATTR_FRIENDLY_NAME +from homeassistant.core import State +from homeassistant.helpers.typing import HomeAssistantType + +from .const import API_V3_ENTRY_DATA, API_V4_ENTRY_DATA + +from tests.common import MockConfigEntry + +_LOGGER = logging.getLogger(__name__) + + +async def _setup(hass: HomeAssistantType, config: Dict[str, Any]) -> State: + """Set up entry and return entity state.""" + data = _get_config_schema(hass)(config) + config_entry = MockConfigEntry( + domain=DOMAIN, + data=data, + unique_id=_get_unique_id(hass, data), + version=2, + ) + config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 1 + + return hass.states.get("weather.climacell_daily") + + +async def test_v3_load_and_unload( + hass: HomeAssistantType, + climacell_config_entry_update: pytest.fixture, +) -> None: + """Test loading and unloading v3 entry.""" + weather_state = await _setup(hass, API_V3_ENTRY_DATA) + assert weather_state.state == ATTR_CONDITION_SUNNY + assert weather_state.attributes == { + ATTR_ATTRIBUTION: ATTRIBUTION, + ATTR_FORECAST: [ + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_SUNNY, + ATTR_FORECAST_TIME: "2021-03-07T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 7, + ATTR_FORECAST_TEMP_LOW: -5, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-08T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 10, + ATTR_FORECAST_TEMP_LOW: -4, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-09T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 19, + ATTR_FORECAST_TEMP_LOW: 0, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-10T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 18, + ATTR_FORECAST_TEMP_LOW: 3, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-11T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 5, + ATTR_FORECAST_TEMP: 20, + ATTR_FORECAST_TEMP_LOW: 9, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-12T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0.04572, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25, + ATTR_FORECAST_TEMP: 20, + ATTR_FORECAST_TEMP_LOW: 12, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-13T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25, + ATTR_FORECAST_TEMP: 16, + ATTR_FORECAST_TEMP_LOW: 7, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_RAINY, + ATTR_FORECAST_TIME: "2021-03-14T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 1.07442, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 75, + ATTR_FORECAST_TEMP: 6, + ATTR_FORECAST_TEMP_LOW: 3, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_SNOWY, + ATTR_FORECAST_TIME: "2021-03-15T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 7.305040000000001, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 95, + ATTR_FORECAST_TEMP: 1, + ATTR_FORECAST_TEMP_LOW: 0, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-16T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0.00508, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 5, + ATTR_FORECAST_TEMP: 6, + ATTR_FORECAST_TEMP_LOW: -2, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-17T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 11, + ATTR_FORECAST_TEMP_LOW: 1, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-18T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 5, + ATTR_FORECAST_TEMP: 12, + ATTR_FORECAST_TEMP_LOW: 6, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-19T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0.043179999999999996, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 20, + ATTR_FORECAST_TEMP: 19, + ATTR_FORECAST_TEMP_LOW: 10, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_RAINY, + ATTR_FORECAST_TIME: "2021-03-20T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 1.2319, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 55, + ATTR_FORECAST_TEMP: 5, + ATTR_FORECAST_TEMP_LOW: 3, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-21T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0.043179999999999996, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 20, + ATTR_FORECAST_TEMP: 7, + ATTR_FORECAST_TEMP_LOW: 1, + }, + ], + ATTR_FRIENDLY_NAME: "ClimaCell - Daily", + ATTR_WEATHER_HUMIDITY: 24, + ATTR_WEATHER_OZONE: 51.4375, + ATTR_WEATHER_PRESSURE: 1028.6258179170002, + ATTR_WEATHER_TEMPERATURE: 7, + ATTR_WEATHER_VISIBILITY: 9.994026240000002, + ATTR_WEATHER_WIND_BEARING: 315.81, + ATTR_WEATHER_WIND_SPEED: 11.24931456, + } + + +async def test_v4_load_and_unload( + hass: HomeAssistantType, + climacell_config_entry_update: pytest.fixture, +) -> None: + """Test loading and unloading v3 entry.""" + weather_state = await _setup(hass, API_V4_ENTRY_DATA) + assert weather_state.state == ATTR_CONDITION_SUNNY + assert weather_state.attributes == { + ATTR_ATTRIBUTION: ATTRIBUTION, + ATTR_FORECAST: [ + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_SUNNY, + ATTR_FORECAST_TIME: "2021-03-07T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 8, + ATTR_FORECAST_TEMP_LOW: -3, + ATTR_FORECAST_WIND_BEARING: 239.6, + ATTR_FORECAST_WIND_SPEED: 15.272674560000002, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-08T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 10, + ATTR_FORECAST_TEMP_LOW: -3, + ATTR_FORECAST_WIND_BEARING: 262.82, + ATTR_FORECAST_WIND_SPEED: 11.65165056, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-09T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 19, + ATTR_FORECAST_TEMP_LOW: 0, + ATTR_FORECAST_WIND_BEARING: 229.3, + ATTR_FORECAST_WIND_SPEED: 11.3458752, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-10T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 18, + ATTR_FORECAST_TEMP_LOW: 3, + ATTR_FORECAST_WIND_BEARING: 149.91, + ATTR_FORECAST_WIND_SPEED: 17.123420160000002, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-11T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 19, + ATTR_FORECAST_TEMP_LOW: 9, + ATTR_FORECAST_WIND_BEARING: 210.45, + ATTR_FORECAST_WIND_SPEED: 25.250607360000004, + }, + { + ATTR_FORECAST_CONDITION: "rainy", + ATTR_FORECAST_TIME: "2021-03-12T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0.12192000000000001, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25, + ATTR_FORECAST_TEMP: 20, + ATTR_FORECAST_TEMP_LOW: 12, + ATTR_FORECAST_WIND_BEARING: 217.98, + ATTR_FORECAST_WIND_SPEED: 19.794931200000004, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-13T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25, + ATTR_FORECAST_TEMP: 12, + ATTR_FORECAST_TEMP_LOW: 6, + ATTR_FORECAST_WIND_BEARING: 58.79, + ATTR_FORECAST_WIND_SPEED: 15.642823680000001, + }, + { + ATTR_FORECAST_CONDITION: "snowy", + ATTR_FORECAST_TIME: "2021-03-14T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 23.95728, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 95, + ATTR_FORECAST_TEMP: 6, + ATTR_FORECAST_TEMP_LOW: 1, + ATTR_FORECAST_WIND_BEARING: 70.25, + ATTR_FORECAST_WIND_SPEED: 26.15184, + }, + { + ATTR_FORECAST_CONDITION: "snowy", + ATTR_FORECAST_TIME: "2021-03-15T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 1.46304, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 55, + ATTR_FORECAST_TEMP: 6, + ATTR_FORECAST_TEMP_LOW: -1, + ATTR_FORECAST_WIND_BEARING: 84.47, + ATTR_FORECAST_WIND_SPEED: 25.57247616, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-16T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 6, + ATTR_FORECAST_TEMP_LOW: -2, + ATTR_FORECAST_WIND_BEARING: 103.85, + ATTR_FORECAST_WIND_SPEED: 10.79869824, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-17T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 11, + ATTR_FORECAST_TEMP_LOW: 1, + ATTR_FORECAST_WIND_BEARING: 145.41, + ATTR_FORECAST_WIND_SPEED: 11.69993088, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-18T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 10, + ATTR_FORECAST_TEMP: 12, + ATTR_FORECAST_TEMP_LOW: 5, + ATTR_FORECAST_WIND_BEARING: 62.99, + ATTR_FORECAST_WIND_SPEED: 10.58948352, + }, + { + ATTR_FORECAST_CONDITION: "rainy", + ATTR_FORECAST_TIME: "2021-03-19T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 2.92608, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 55, + ATTR_FORECAST_TEMP: 9, + ATTR_FORECAST_TEMP_LOW: 4, + ATTR_FORECAST_WIND_BEARING: 68.54, + ATTR_FORECAST_WIND_SPEED: 22.38597504, + }, + { + ATTR_FORECAST_CONDITION: "snowy", + ATTR_FORECAST_TIME: "2021-03-20T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 1.2192, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 33.3, + ATTR_FORECAST_TEMP: 5, + ATTR_FORECAST_TEMP_LOW: 2, + ATTR_FORECAST_WIND_BEARING: 56.98, + ATTR_FORECAST_WIND_SPEED: 27.922118400000002, + }, + ], + ATTR_FRIENDLY_NAME: "ClimaCell - Daily", + ATTR_WEATHER_HUMIDITY: 23, + ATTR_WEATHER_OZONE: 46.53, + ATTR_WEATHER_PRESSURE: 1027.7690615000001, + ATTR_WEATHER_TEMPERATURE: 7, + ATTR_WEATHER_VISIBILITY: 13.116153600000002, + ATTR_WEATHER_WIND_BEARING: 315.14, + ATTR_WEATHER_WIND_SPEED: 15.01517952, + } diff --git a/tests/fixtures/climacell/v3_forecast_daily.json b/tests/fixtures/climacell/v3_forecast_daily.json new file mode 100644 index 0000000000000..ae238a34d558f --- /dev/null +++ b/tests/fixtures/climacell/v3_forecast_daily.json @@ -0,0 +1,2177 @@ +[ + { + "temp": [ + { + "observation_time": "2021-03-07T11:00:00Z", + "min": { + "value": 23.47, + "units": "F" + } + }, + { + "observation_time": "2021-03-07T21:00:00Z", + "max": { + "value": 44.88, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-07T02:00:00Z", + "max": { + "value": 0, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-07T11:00:00Z", + "min": { + "value": 16.68, + "units": "F" + } + }, + { + "observation_time": "2021-03-07T21:00:00Z", + "max": { + "value": 44.88, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-07T21:00:00Z", + "min": { + "value": 31.5, + "units": "%" + } + }, + { + "observation_time": "2021-03-07T11:00:00Z", + "max": { + "value": 73.85, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-07T02:00:00Z", + "min": { + "value": 30.23, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-07T14:00:00Z", + "max": { + "value": 30.39, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-08T00:00:00Z", + "min": { + "value": 2.58, + "units": "mph" + } + }, + { + "observation_time": "2021-03-07T19:00:00Z", + "max": { + "value": 7.67, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-08T00:00:00Z", + "min": { + "value": 72.1, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-07T19:00:00Z", + "max": { + "value": 313.49, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-07T02:00:00Z", + "min": { + "value": 9.94, + "units": "mi" + } + }, + { + "observation_time": "2021-03-07T02:00:00Z", + "max": { + "value": 9.94, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-07" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-08T11:00:00Z", + "min": { + "value": 24.79, + "units": "F" + } + }, + { + "observation_time": "2021-03-08T21:00:00Z", + "max": { + "value": 49.42, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-08T02:00:00Z", + "max": { + "value": 0, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-08T12:00:00Z", + "min": { + "value": 19.14, + "units": "F" + } + }, + { + "observation_time": "2021-03-08T21:00:00Z", + "max": { + "value": 49.42, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-08T20:00:00Z", + "min": { + "value": 30.54, + "units": "%" + } + }, + { + "observation_time": "2021-03-08T07:00:00Z", + "max": { + "value": 80.18, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-08T02:00:00Z", + "min": { + "value": 30.4, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-08T15:00:00Z", + "max": { + "value": 30.52, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-08T22:00:00Z", + "min": { + "value": 1.97, + "units": "mph" + } + }, + { + "observation_time": "2021-03-08T13:00:00Z", + "max": { + "value": 7.24, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-08T22:00:00Z", + "min": { + "value": 268.74, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-08T13:00:00Z", + "max": { + "value": 324.8, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-08T02:00:00Z", + "min": { + "value": 9.94, + "units": "mi" + } + }, + { + "observation_time": "2021-03-08T02:00:00Z", + "max": { + "value": 9.94, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "weather_code": { + "value": "cloudy" + }, + "observation_time": { + "value": "2021-03-08" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-09T11:00:00Z", + "min": { + "value": 31.48, + "units": "F" + } + }, + { + "observation_time": "2021-03-09T21:00:00Z", + "max": { + "value": 66.98, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-09T02:00:00Z", + "max": { + "value": 0, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-09T11:00:00Z", + "min": { + "value": 27.32, + "units": "F" + } + }, + { + "observation_time": "2021-03-09T21:00:00Z", + "max": { + "value": 66.98, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-09T20:00:00Z", + "min": { + "value": 40.39, + "units": "%" + } + }, + { + "observation_time": "2021-03-09T11:00:00Z", + "max": { + "value": 76.96, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-09T21:00:00Z", + "min": { + "value": 30.33, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-09T02:00:00Z", + "max": { + "value": 30.44, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-09T22:00:00Z", + "min": { + "value": 3.35, + "units": "mph" + } + }, + { + "observation_time": "2021-03-09T19:00:00Z", + "max": { + "value": 7.05, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-09T22:00:00Z", + "min": { + "value": 279.37, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-09T19:00:00Z", + "max": { + "value": 253.12, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-09T02:00:00Z", + "min": { + "value": 9.94, + "units": "mi" + } + }, + { + "observation_time": "2021-03-09T02:00:00Z", + "max": { + "value": 9.94, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-09T11:27:39.839Z" + }, + "sunset": { + "value": "2021-03-09T23:08:59.218Z" + }, + "weather_code": { + "value": "mostly_cloudy" + }, + "observation_time": { + "value": "2021-03-09" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-10T11:00:00Z", + "min": { + "value": 37.32, + "units": "F" + } + }, + { + "observation_time": "2021-03-10T20:00:00Z", + "max": { + "value": 65.28, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-10T02:00:00Z", + "max": { + "value": 0, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-10T11:00:00Z", + "min": { + "value": 33.97, + "units": "F" + } + }, + { + "observation_time": "2021-03-10T20:00:00Z", + "max": { + "value": 65.28, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-10T20:00:00Z", + "min": { + "value": 35.91, + "units": "%" + } + }, + { + "observation_time": "2021-03-10T11:00:00Z", + "max": { + "value": 92.39, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-10T22:00:00Z", + "min": { + "value": 30.32, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-10T15:00:00Z", + "max": { + "value": 30.44, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-10T05:00:00Z", + "min": { + "value": 2.13, + "units": "mph" + } + }, + { + "observation_time": "2021-03-10T21:00:00Z", + "max": { + "value": 9.42, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-10T05:00:00Z", + "min": { + "value": 342.01, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-10T21:00:00Z", + "max": { + "value": 193.22, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-10T02:00:00Z", + "min": { + "value": 9.94, + "units": "mi" + } + }, + { + "observation_time": "2021-03-11T01:00:00Z", + "max": { + "value": 15, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-10T11:26:07.817Z" + }, + "sunset": { + "value": "2021-03-10T23:09:59.710Z" + }, + "weather_code": { + "value": "cloudy" + }, + "observation_time": { + "value": "2021-03-10" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-11T12:00:00Z", + "min": { + "value": 48.69, + "units": "F" + } + }, + { + "observation_time": "2021-03-11T21:00:00Z", + "max": { + "value": 67.37, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-11T02:00:00Z", + "max": { + "value": 0, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 5, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-11T12:00:00Z", + "min": { + "value": 48.69, + "units": "F" + } + }, + { + "observation_time": "2021-03-11T21:00:00Z", + "max": { + "value": 67.37, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-11T20:00:00Z", + "min": { + "value": 37.42, + "units": "%" + } + }, + { + "observation_time": "2021-03-11T12:00:00Z", + "max": { + "value": 70.02, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-11T22:00:00Z", + "min": { + "value": 30.21, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-11T02:00:00Z", + "max": { + "value": 30.37, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-11T02:00:00Z", + "min": { + "value": 8.82, + "units": "mph" + } + }, + { + "observation_time": "2021-03-12T01:00:00Z", + "max": { + "value": 14.47, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-11T02:00:00Z", + "min": { + "value": 176.84, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-12T01:00:00Z", + "max": { + "value": 210.63, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-11T05:00:00Z", + "min": { + "value": 15, + "units": "mi" + } + }, + { + "observation_time": "2021-03-11T16:00:00Z", + "max": { + "value": 15, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-11T11:24:35.417Z" + }, + "sunset": { + "value": "2021-03-11T23:10:59.980Z" + }, + "weather_code": { + "value": "cloudy" + }, + "observation_time": { + "value": "2021-03-11" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-12T12:00:00Z", + "min": { + "value": 53.83, + "units": "F" + } + }, + { + "observation_time": "2021-03-12T18:00:00Z", + "max": { + "value": 67.91, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0.0018, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-13T00:00:00Z", + "max": { + "value": 0.0009, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 25, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-12T12:00:00Z", + "min": { + "value": 53.83, + "units": "F" + } + }, + { + "observation_time": "2021-03-12T18:00:00Z", + "max": { + "value": 67.91, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-12T18:00:00Z", + "min": { + "value": 45.58, + "units": "%" + } + }, + { + "observation_time": "2021-03-13T00:00:00Z", + "max": { + "value": 78.58, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-12T21:00:00Z", + "min": { + "value": 30.18, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-12T03:00:00Z", + "max": { + "value": 30.26, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-13T00:00:00Z", + "min": { + "value": 4.98, + "units": "mph" + } + }, + { + "observation_time": "2021-03-12T02:00:00Z", + "max": { + "value": 15.69, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-13T00:00:00Z", + "min": { + "value": 329.35, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-12T02:00:00Z", + "max": { + "value": 211.47, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-12T04:00:00Z", + "min": { + "value": 15, + "units": "mi" + } + }, + { + "observation_time": "2021-03-13T00:00:00Z", + "max": { + "value": 15, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-12T11:23:02.671Z" + }, + "sunset": { + "value": "2021-03-12T23:12:00.036Z" + }, + "weather_code": { + "value": "cloudy" + }, + "observation_time": { + "value": "2021-03-12" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-14T00:00:00Z", + "min": { + "value": 45.48, + "units": "F" + } + }, + { + "observation_time": "2021-03-13T03:00:00Z", + "max": { + "value": 60.42, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-13T03:00:00Z", + "max": { + "value": 0, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 25, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-14T00:00:00Z", + "min": { + "value": 45.48, + "units": "F" + } + }, + { + "observation_time": "2021-03-13T03:00:00Z", + "max": { + "value": 60.42, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-13T21:00:00Z", + "min": { + "value": 56.16, + "units": "%" + } + }, + { + "observation_time": "2021-03-13T12:00:00Z", + "max": { + "value": 88.2, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-13T21:00:00Z", + "min": { + "value": 30.09, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-13T03:00:00Z", + "max": { + "value": 30.22, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-13T03:00:00Z", + "min": { + "value": 2.91, + "units": "mph" + } + }, + { + "observation_time": "2021-03-13T21:00:00Z", + "max": { + "value": 9.72, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-13T03:00:00Z", + "min": { + "value": 202.04, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-13T21:00:00Z", + "max": { + "value": 64.38, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-13T18:00:00Z", + "min": { + "value": 15, + "units": "mi" + } + }, + { + "observation_time": "2021-03-13T03:00:00Z", + "max": { + "value": 15, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-13T11:21:29.611Z" + }, + "sunset": { + "value": "2021-03-13T23:12:59.890Z" + }, + "weather_code": { + "value": "cloudy" + }, + "observation_time": { + "value": "2021-03-13" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-15T00:00:00Z", + "min": { + "value": 37.81, + "units": "F" + } + }, + { + "observation_time": "2021-03-14T03:00:00Z", + "max": { + "value": 43.58, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0.0423, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-15T00:00:00Z", + "max": { + "value": 0.0198, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 75, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-15T00:00:00Z", + "min": { + "value": 29.02, + "units": "F" + } + }, + { + "observation_time": "2021-03-14T03:00:00Z", + "max": { + "value": 43.58, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-14T03:00:00Z", + "min": { + "value": 76.24, + "units": "%" + } + }, + { + "observation_time": "2021-03-14T18:00:00Z", + "max": { + "value": 87.2, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-15T00:00:00Z", + "min": { + "value": 29.95, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-14T03:00:00Z", + "max": { + "value": 30.11, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-14T06:00:00Z", + "min": { + "value": 5.34, + "units": "mph" + } + }, + { + "observation_time": "2021-03-14T21:00:00Z", + "max": { + "value": 16.25, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-14T06:00:00Z", + "min": { + "value": 57.52, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-14T21:00:00Z", + "max": { + "value": 83.23, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-15T00:00:00Z", + "min": { + "value": 8.81, + "units": "mi" + } + }, + { + "observation_time": "2021-03-14T09:00:00Z", + "max": { + "value": 15, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-14T11:19:56.268Z" + }, + "sunset": { + "value": "2021-03-14T23:13:59.551Z" + }, + "weather_code": { + "value": "rain_light" + }, + "observation_time": { + "value": "2021-03-14" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-16T00:00:00Z", + "min": { + "value": 32.31, + "units": "F" + } + }, + { + "observation_time": "2021-03-15T09:00:00Z", + "max": { + "value": 34.21, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0.2876, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-15T03:00:00Z", + "max": { + "value": 0.1737, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 95, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-15T12:00:00Z", + "min": { + "value": 22.15, + "units": "F" + } + }, + { + "observation_time": "2021-03-15T09:00:00Z", + "max": { + "value": 25.37, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-15T21:00:00Z", + "min": { + "value": 79.46, + "units": "%" + } + }, + { + "observation_time": "2021-03-15T03:00:00Z", + "max": { + "value": 94.18, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-15T09:00:00Z", + "min": { + "value": 29.99, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-16T00:00:00Z", + "max": { + "value": 30.24, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-16T00:00:00Z", + "min": { + "value": 11.7, + "units": "mph" + } + }, + { + "observation_time": "2021-03-15T18:00:00Z", + "max": { + "value": 15.89, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-16T00:00:00Z", + "min": { + "value": 63.67, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-15T18:00:00Z", + "max": { + "value": 59.49, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-15T03:00:00Z", + "min": { + "value": 2, + "units": "mi" + } + }, + { + "observation_time": "2021-03-15T09:00:00Z", + "max": { + "value": 15, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-15T11:18:22.673Z" + }, + "sunset": { + "value": "2021-03-15T23:14:59.028Z" + }, + "weather_code": { + "value": "snow_heavy" + }, + "observation_time": { + "value": "2021-03-15" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-16T12:00:00Z", + "min": { + "value": 29.1, + "units": "F" + } + }, + { + "observation_time": "2021-03-16T21:00:00Z", + "max": { + "value": 43, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0.0002, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-16T06:00:00Z", + "max": { + "value": 0.0002, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 5, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-16T12:00:00Z", + "min": { + "value": 22.49, + "units": "F" + } + }, + { + "observation_time": "2021-03-16T21:00:00Z", + "max": { + "value": 43, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-16T18:00:00Z", + "min": { + "value": 35.44, + "units": "%" + } + }, + { + "observation_time": "2021-03-16T03:00:00Z", + "max": { + "value": 82.86, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-16T03:00:00Z", + "min": { + "value": 30.32, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-16T15:00:00Z", + "max": { + "value": 30.42, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-16T18:00:00Z", + "min": { + "value": 4.98, + "units": "mph" + } + }, + { + "observation_time": "2021-03-16T03:00:00Z", + "max": { + "value": 9.77, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-16T18:00:00Z", + "min": { + "value": 80.47, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-16T03:00:00Z", + "max": { + "value": 58.98, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-16T18:00:00Z", + "min": { + "value": 15, + "units": "mi" + } + }, + { + "observation_time": "2021-03-16T21:00:00Z", + "max": { + "value": 15, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-16T11:16:48.856Z" + }, + "sunset": { + "value": "2021-03-16T23:15:58.333Z" + }, + "weather_code": { + "value": "cloudy" + }, + "observation_time": { + "value": "2021-03-16" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-17T12:00:00Z", + "min": { + "value": 34.32, + "units": "F" + } + }, + { + "observation_time": "2021-03-17T21:00:00Z", + "max": { + "value": 52.4, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-17T03:00:00Z", + "max": { + "value": 0, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-17T12:00:00Z", + "min": { + "value": 29.46, + "units": "F" + } + }, + { + "observation_time": "2021-03-17T21:00:00Z", + "max": { + "value": 52.4, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-17T18:00:00Z", + "min": { + "value": 53.88, + "units": "%" + } + }, + { + "observation_time": "2021-03-17T09:00:00Z", + "max": { + "value": 83.16, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-18T00:00:00Z", + "min": { + "value": 30.18, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-17T03:00:00Z", + "max": { + "value": 30.39, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-18T00:00:00Z", + "min": { + "value": 4.49, + "units": "mph" + } + }, + { + "observation_time": "2021-03-17T03:00:00Z", + "max": { + "value": 6.71, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-18T00:00:00Z", + "min": { + "value": 116.64, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-17T03:00:00Z", + "max": { + "value": 111.51, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-17T18:00:00Z", + "min": { + "value": 15, + "units": "mi" + } + }, + { + "observation_time": "2021-03-17T15:00:00Z", + "max": { + "value": 15, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-17T11:15:14.849Z" + }, + "sunset": { + "value": "2021-03-17T23:16:57.476Z" + }, + "weather_code": { + "value": "cloudy" + }, + "observation_time": { + "value": "2021-03-17" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-18T12:00:00Z", + "min": { + "value": 41.99, + "units": "F" + } + }, + { + "observation_time": "2021-03-18T21:00:00Z", + "max": { + "value": 54.07, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-18T03:00:00Z", + "max": { + "value": 0, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 5, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-18T12:00:00Z", + "min": { + "value": 41.99, + "units": "F" + } + }, + { + "observation_time": "2021-03-18T21:00:00Z", + "max": { + "value": 54.07, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-18T21:00:00Z", + "min": { + "value": 57.46, + "units": "%" + } + }, + { + "observation_time": "2021-03-18T09:00:00Z", + "max": { + "value": 85.04, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-18T21:00:00Z", + "min": { + "value": 30.12, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-18T15:00:00Z", + "max": { + "value": 30.21, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-18T06:00:00Z", + "min": { + "value": 2.77, + "units": "mph" + } + }, + { + "observation_time": "2021-03-18T03:00:00Z", + "max": { + "value": 5.22, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-18T06:00:00Z", + "min": { + "value": 119.5, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-18T03:00:00Z", + "max": { + "value": 135.5, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-18T12:00:00Z", + "min": { + "value": 15, + "units": "mi" + } + }, + { + "observation_time": "2021-03-18T06:00:00Z", + "max": { + "value": 15, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-18T11:13:40.683Z" + }, + "sunset": { + "value": "2021-03-18T23:17:56.466Z" + }, + "weather_code": { + "value": "cloudy" + }, + "observation_time": { + "value": "2021-03-18" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-19T12:00:00Z", + "min": { + "value": 50.56, + "units": "F" + } + }, + { + "observation_time": "2021-03-19T21:00:00Z", + "max": { + "value": 65.71, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0.0017, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-19T03:00:00Z", + "max": { + "value": 0.0011, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 20, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-19T12:00:00Z", + "min": { + "value": 50.56, + "units": "F" + } + }, + { + "observation_time": "2021-03-19T21:00:00Z", + "max": { + "value": 65.71, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-19T18:00:00Z", + "min": { + "value": 32.98, + "units": "%" + } + }, + { + "observation_time": "2021-03-19T03:00:00Z", + "max": { + "value": 98.02, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-19T03:00:00Z", + "min": { + "value": 29.84, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-19T12:00:00Z", + "max": { + "value": 29.96, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-20T00:00:00Z", + "min": { + "value": 3.42, + "units": "mph" + } + }, + { + "observation_time": "2021-03-19T21:00:00Z", + "max": { + "value": 8.99, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-20T00:00:00Z", + "min": { + "value": 250.61, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-19T21:00:00Z", + "max": { + "value": 244.8, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-19T09:00:00Z", + "min": { + "value": 15, + "units": "mi" + } + }, + { + "observation_time": "2021-03-19T15:00:00Z", + "max": { + "value": 15, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-19T11:12:06.387Z" + }, + "sunset": { + "value": "2021-03-19T23:18:55.314Z" + }, + "weather_code": { + "value": "cloudy" + }, + "observation_time": { + "value": "2021-03-19" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-21T00:00:00Z", + "min": { + "value": 37.56, + "units": "F" + } + }, + { + "observation_time": "2021-03-20T03:00:00Z", + "max": { + "value": 41.05, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0.0485, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-20T03:00:00Z", + "max": { + "value": 0.0138, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 55, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-21T00:00:00Z", + "min": { + "value": 28, + "units": "F" + } + }, + { + "observation_time": "2021-03-20T03:00:00Z", + "max": { + "value": 41.05, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-20T15:00:00Z", + "min": { + "value": 59.94, + "units": "%" + } + }, + { + "observation_time": "2021-03-20T03:00:00Z", + "max": { + "value": 77.4, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-20T09:00:00Z", + "min": { + "value": 30.03, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-21T00:00:00Z", + "max": { + "value": 30.12, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-20T03:00:00Z", + "min": { + "value": 10.9, + "units": "mph" + } + }, + { + "observation_time": "2021-03-20T21:00:00Z", + "max": { + "value": 17.35, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-20T03:00:00Z", + "min": { + "value": 70.56, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-20T21:00:00Z", + "max": { + "value": 58.55, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-20T03:00:00Z", + "min": { + "value": 12.51, + "units": "mi" + } + }, + { + "observation_time": "2021-03-20T21:00:00Z", + "max": { + "value": 15, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-20T11:10:31.992Z" + }, + "sunset": { + "value": "2021-03-20T23:19:54.031Z" + }, + "weather_code": { + "value": "drizzle" + }, + "observation_time": { + "value": "2021-03-20" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ + { + "observation_time": "2021-03-21T12:00:00Z", + "min": { + "value": 33.66, + "units": "F" + } + }, + { + "observation_time": "2021-03-21T21:00:00Z", + "max": { + "value": 44.3, + "units": "F" + } + } + ], + "precipitation_accumulation": { + "value": 0.0017, + "units": "in" + }, + "precipitation": [ + { + "observation_time": "2021-03-21T03:00:00Z", + "max": { + "value": 0.0011, + "units": "in/hr" + } + } + ], + "precipitation_probability": { + "value": 20, + "units": "%" + }, + "feels_like": [ + { + "observation_time": "2021-03-21T12:00:00Z", + "min": { + "value": 23.68, + "units": "F" + } + }, + { + "observation_time": "2021-03-21T21:00:00Z", + "max": { + "value": 44.3, + "units": "F" + } + } + ], + "humidity": [ + { + "observation_time": "2021-03-21T21:00:00Z", + "min": { + "value": 34.4, + "units": "%" + } + }, + { + "observation_time": "2021-03-21T03:00:00Z", + "max": { + "value": 73.1, + "units": "%" + } + } + ], + "baro_pressure": [ + { + "observation_time": "2021-03-21T03:00:00Z", + "min": { + "value": 30.15, + "units": "inHg" + } + }, + { + "observation_time": "2021-03-22T00:00:00Z", + "max": { + "value": 30.26, + "units": "inHg" + } + } + ], + "wind_speed": [ + { + "observation_time": "2021-03-22T00:00:00Z", + "min": { + "value": 8.65, + "units": "mph" + } + }, + { + "observation_time": "2021-03-21T03:00:00Z", + "max": { + "value": 16.53, + "units": "mph" + } + } + ], + "wind_direction": [ + { + "observation_time": "2021-03-22T00:00:00Z", + "min": { + "value": 64.92, + "units": "degrees" + } + }, + { + "observation_time": "2021-03-21T03:00:00Z", + "max": { + "value": 57.74, + "units": "degrees" + } + } + ], + "visibility": [ + { + "observation_time": "2021-03-21T09:00:00Z", + "min": { + "value": 15, + "units": "mi" + } + }, + { + "observation_time": "2021-03-21T12:00:00Z", + "max": { + "value": 15, + "units": "mi" + } + } + ], + "sunrise": { + "value": "2021-03-21T11:08:57.528Z" + }, + "sunset": { + "value": "2021-03-21T23:20:52.627Z" + }, + "weather_code": { + "value": "cloudy" + }, + "observation_time": { + "value": "2021-03-21" + }, + "lat": 38.90694, + "lon": -77.03012 + } +] \ No newline at end of file diff --git a/tests/fixtures/climacell/v3_forecast_hourly.json b/tests/fixtures/climacell/v3_forecast_hourly.json new file mode 100644 index 0000000000000..6578a7e0a38ec --- /dev/null +++ b/tests/fixtures/climacell/v3_forecast_hourly.json @@ -0,0 +1,3702 @@ +[ + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 41.58, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 41.58, + "units": "F" + }, + "humidity": { + "value": 26.79, + "units": "%" + }, + "baro_pressure": { + "value": 30.35, + "units": "inHg" + }, + "dewpoint": { + "value": 8.22, + "units": "F" + }, + "wind_speed": { + "value": 6.98, + "units": "mph" + }, + "wind_gust": { + "value": 13.41, + "units": "mph" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "moon_phase": { + "value": "last_quarter" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-07T17:00:00.000Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 43.6, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 43.6, + "units": "F" + }, + "humidity": { + "value": 23.21, + "units": "%" + }, + "baro_pressure": { + "value": 30.34, + "units": "inHg" + }, + "dewpoint": { + "value": 6.79, + "units": "F" + }, + "wind_speed": { + "value": 9.29, + "units": "mph" + }, + "wind_gust": { + "value": 13.3, + "units": "mph" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "moon_phase": { + "value": "last_quarter" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-07T18:00:00.000Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 45.13, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 45.13, + "units": "F" + }, + "humidity": { + "value": 19.34, + "units": "%" + }, + "baro_pressure": { + "value": 30.34, + "units": "inHg" + }, + "dewpoint": { + "value": 4.2, + "units": "F" + }, + "wind_speed": { + "value": 8.74, + "units": "mph" + }, + "wind_gust": { + "value": 13.2, + "units": "mph" + }, + "wind_direction": { + "value": 321.71, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 710.154, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "moon_phase": { + "value": "last_quarter" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-07T19:00:00.000Z" + }, + "epa_aqi": { + "value": 39.41585 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.571106 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 5.0204105, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 7.3341646, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.58481, + "units": "ppb" + }, + "no2": { + "value": 2.2947683, + "units": "ppb" + }, + "co": { + "value": 0.15286006, + "units": "ppm" + }, + "so2": { + "value": 0.9708922, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 45.93, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 45.93, + "units": "F" + }, + "humidity": { + "value": 16.7, + "units": "%" + }, + "baro_pressure": { + "value": 30.35, + "units": "inHg" + }, + "dewpoint": { + "value": 1.99, + "units": "F" + }, + "wind_speed": { + "value": 8.94, + "units": "mph" + }, + "wind_gust": { + "value": 12.43, + "units": "mph" + }, + "wind_direction": { + "value": 323.37, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 574.154, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-07T20:00:00.000Z" + }, + "epa_aqi": { + "value": 39.580303 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.734327 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 5.0495143, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 7.3923726, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.899986, + "units": "ppb" + }, + "no2": { + "value": 2.5215073, + "units": "ppb" + }, + "co": { + "value": 0.15353242, + "units": "ppm" + }, + "so2": { + "value": 0.96701145, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 45.18, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 45.18, + "units": "F" + }, + "humidity": { + "value": 16.67, + "units": "%" + }, + "baro_pressure": { + "value": 30.34, + "units": "inHg" + }, + "dewpoint": { + "value": 1.67, + "units": "F" + }, + "wind_speed": { + "value": 9.49, + "units": "mph" + }, + "wind_gust": { + "value": 13.23, + "units": "mph" + }, + "wind_direction": { + "value": 318.43, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 392.06396, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-07T21:00:00.000Z" + }, + "epa_aqi": { + "value": 39.66671 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.897547 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 5.0931697, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 7.4796834, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 44.215164, + "units": "ppb" + }, + "no2": { + "value": 2.7482464, + "units": "ppb" + }, + "co": { + "value": 0.15420479, + "units": "ppm" + }, + "so2": { + "value": 0.9631308, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 44.42, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 44.42, + "units": "F" + }, + "humidity": { + "value": 18.27, + "units": "%" + }, + "baro_pressure": { + "value": 30.34, + "units": "inHg" + }, + "dewpoint": { + "value": 3.58, + "units": "F" + }, + "wind_speed": { + "value": 7.7, + "units": "mph" + }, + "wind_gust": { + "value": 11.75, + "units": "mph" + }, + "wind_direction": { + "value": 320.9, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 180.51251, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-07T22:00:00.000Z" + }, + "epa_aqi": { + "value": 36.92238 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 16.534292 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 5.573383, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 8.178176, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 31.927721, + "units": "ppb" + }, + "no2": { + "value": 12.739268, + "units": "ppb" + }, + "co": { + "value": 0.2289039, + "units": "ppm" + }, + "so2": { + "value": 1.1788304, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 41.33, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 41.33, + "units": "F" + }, + "humidity": { + "value": 20.88, + "units": "%" + }, + "baro_pressure": { + "value": 30.38, + "units": "inHg" + }, + "dewpoint": { + "value": 5.71, + "units": "F" + }, + "wind_speed": { + "value": 3.53, + "units": "mph" + }, + "wind_gust": { + "value": 9.94, + "units": "mph" + }, + "wind_direction": { + "value": 322.11, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 2.3181324, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-07T23:00:00.000Z" + }, + "epa_aqi": { + "value": 32.690754 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 18.051374 + }, + "china_primary_pollutant": { + "value": "no2" + }, + "pm25": { + "value": 10.41917, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 15.075783, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 19.640276, + "units": "ppb" + }, + "no2": { + "value": 22.730291, + "units": "ppb" + }, + "co": { + "value": 0.30360302, + "units": "ppm" + }, + "so2": { + "value": 1.3945299, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 38.25, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 34.17, + "units": "F" + }, + "humidity": { + "value": 26.43, + "units": "%" + }, + "baro_pressure": { + "value": 30.37, + "units": "inHg" + }, + "dewpoint": { + "value": 9.44, + "units": "F" + }, + "wind_speed": { + "value": 5.31, + "units": "mph" + }, + "wind_gust": { + "value": 7.62, + "units": "mph" + }, + "wind_direction": { + "value": 295.94, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-08T00:00:00.000Z" + }, + "epa_aqi": { + "value": 49.333385 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 25.985796 + }, + "china_primary_pollutant": { + "value": "no2" + }, + "pm25": { + "value": 15.832482, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 22.817402, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 7.352833, + "units": "ppb" + }, + "no2": { + "value": 32.721313, + "units": "ppb" + }, + "co": { + "value": 0.37830213, + "units": "ppm" + }, + "so2": { + "value": 1.6102295, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 35.66, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 30.82, + "units": "F" + }, + "humidity": { + "value": 28.46, + "units": "%" + }, + "baro_pressure": { + "value": 30.4, + "units": "inHg" + }, + "dewpoint": { + "value": 8.24, + "units": "F" + }, + "wind_speed": { + "value": 5.69, + "units": "mph" + }, + "wind_gust": { + "value": 9, + "units": "mph" + }, + "wind_direction": { + "value": 11.94, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-08T01:00:00.000Z" + }, + "epa_aqi": { + "value": 54.983437 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 26.878548 + }, + "china_primary_pollutant": { + "value": "no2" + }, + "pm25": { + "value": 16.822012, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 24.214386, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 5.618587, + "units": "ppb" + }, + "no2": { + "value": 33.845467, + "units": "ppb" + }, + "co": { + "value": 0.39017758, + "units": "ppm" + }, + "so2": { + "value": 1.6278896, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 33.98, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 28.93, + "units": "F" + }, + "humidity": { + "value": 33.01, + "units": "%" + }, + "baro_pressure": { + "value": 30.39, + "units": "inHg" + }, + "dewpoint": { + "value": 9.69, + "units": "F" + }, + "wind_speed": { + "value": 5.56, + "units": "mph" + }, + "wind_gust": { + "value": 11.5, + "units": "mph" + }, + "wind_direction": { + "value": 13.68, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-08T02:00:00.000Z" + }, + "epa_aqi": { + "value": 58.082386 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 27.7713 + }, + "china_primary_pollutant": { + "value": "no2" + }, + "pm25": { + "value": 17.229465, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 24.796461, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 3.884342, + "units": "ppb" + }, + "no2": { + "value": 34.96962, + "units": "ppb" + }, + "co": { + "value": 0.40205303, + "units": "ppm" + }, + "so2": { + "value": 1.6455498, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 32.61, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 27.45, + "units": "F" + }, + "humidity": { + "value": 38.8, + "units": "%" + }, + "baro_pressure": { + "value": 30.41, + "units": "inHg" + }, + "dewpoint": { + "value": 12.22, + "units": "F" + }, + "wind_speed": { + "value": 5.39, + "units": "mph" + }, + "wind_gust": { + "value": 12.12, + "units": "mph" + }, + "wind_direction": { + "value": 14.92, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-08T03:00:00.000Z" + }, + "epa_aqi": { + "value": 61.062588 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 28.664051 + }, + "china_primary_pollutant": { + "value": "no2" + }, + "pm25": { + "value": 18.568241, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 26.659107, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 2.150097, + "units": "ppb" + }, + "no2": { + "value": 36.093773, + "units": "ppb" + }, + "co": { + "value": 0.41392848, + "units": "ppm" + }, + "so2": { + "value": 1.6632099, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 31.74, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 27.31, + "units": "F" + }, + "humidity": { + "value": 43.64, + "units": "%" + }, + "baro_pressure": { + "value": 30.42, + "units": "inHg" + }, + "dewpoint": { + "value": 14.01, + "units": "F" + }, + "wind_speed": { + "value": 4.44, + "units": "mph" + }, + "wind_gust": { + "value": 10.4, + "units": "mph" + }, + "wind_direction": { + "value": 26.07, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-08T04:00:00.000Z" + }, + "epa_aqi": { + "value": 64.79185 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 29.685905 + }, + "china_primary_pollutant": { + "value": "pm10" + }, + "pm25": { + "value": 20.663717, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 29.685905, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 1.573819, + "units": "ppb" + }, + "no2": { + "value": 35.859207, + "units": "ppb" + }, + "co": { + "value": 0.43030822, + "units": "ppm" + }, + "so2": { + "value": 1.899448, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 28.54, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 28.54, + "units": "F" + }, + "humidity": { + "value": 46.57, + "units": "%" + }, + "baro_pressure": { + "value": 30.43, + "units": "inHg" + }, + "dewpoint": { + "value": 13.96, + "units": "F" + }, + "wind_speed": { + "value": 2.16, + "units": "mph" + }, + "wind_gust": { + "value": 6.48, + "units": "mph" + }, + "wind_direction": { + "value": 51.27, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-08T05:00:00.000Z" + }, + "epa_aqi": { + "value": 69.08222 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 32.945534 + }, + "china_primary_pollutant": { + "value": "pm10" + }, + "pm25": { + "value": 22.933817, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 32.945534, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 0.9975411, + "units": "ppb" + }, + "no2": { + "value": 35.624638, + "units": "ppb" + }, + "co": { + "value": 0.44668797, + "units": "ppm" + }, + "so2": { + "value": 2.1356862, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 27.08, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 22.87, + "units": "F" + }, + "humidity": { + "value": 49.49, + "units": "%" + }, + "baro_pressure": { + "value": 30.43, + "units": "inHg" + }, + "dewpoint": { + "value": 14.3, + "units": "F" + }, + "wind_speed": { + "value": 3.62, + "units": "mph" + }, + "wind_gust": { + "value": 6.08, + "units": "mph" + }, + "wind_direction": { + "value": 343.25, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-08T06:00:00.000Z" + }, + "epa_aqi": { + "value": 74.2753 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 36.903652 + }, + "china_primary_pollutant": { + "value": "pm10" + }, + "pm25": { + "value": 25.785992, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 36.903652, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 0.42126322, + "units": "ppb" + }, + "no2": { + "value": 35.39007, + "units": "ppb" + }, + "co": { + "value": 0.4630677, + "units": "ppm" + }, + "so2": { + "value": 2.3719242, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 26.65, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 21.36, + "units": "F" + }, + "humidity": { + "value": 52.83, + "units": "%" + }, + "baro_pressure": { + "value": 30.44, + "units": "inHg" + }, + "dewpoint": { + "value": 14.98, + "units": "F" + }, + "wind_speed": { + "value": 4.46, + "units": "mph" + }, + "wind_gust": { + "value": 6.84, + "units": "mph" + }, + "wind_direction": { + "value": 341.46, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-08T07:00:00.000Z" + }, + "epa_aqi": { + "value": 80.29285 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 41.560265 + }, + "china_primary_pollutant": { + "value": "pm10" + }, + "pm25": { + "value": 28.987413, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 41.560265, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 0.38954195, + "units": "ppb" + }, + "no2": { + "value": 34.47689, + "units": "ppb" + }, + "co": { + "value": 0.46904066, + "units": "ppm" + }, + "so2": { + "value": 2.4906406, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 26.33, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 22.44, + "units": "F" + }, + "humidity": { + "value": 55.95, + "units": "%" + }, + "baro_pressure": { + "value": 30.44, + "units": "inHg" + }, + "dewpoint": { + "value": 15.89, + "units": "F" + }, + "wind_speed": { + "value": 3.31, + "units": "mph" + }, + "wind_gust": { + "value": 5.48, + "units": "mph" + }, + "wind_direction": { + "value": 322.34, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-08T08:00:00.000Z" + }, + "epa_aqi": { + "value": 86.16294 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 45.401974 + }, + "china_primary_pollutant": { + "value": "pm10" + }, + "pm25": { + "value": 31.664965, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 45.401974, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 0.35782072, + "units": "ppb" + }, + "no2": { + "value": 33.56371, + "units": "ppb" + }, + "co": { + "value": 0.47501358, + "units": "ppm" + }, + "so2": { + "value": 2.6093574, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 26.12, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 21.61, + "units": "F" + }, + "humidity": { + "value": 59.9, + "units": "%" + }, + "baro_pressure": { + "value": 30.45, + "units": "inHg" + }, + "dewpoint": { + "value": 17.27, + "units": "F" + }, + "wind_speed": { + "value": 3.74, + "units": "mph" + }, + "wind_gust": { + "value": 4.74, + "units": "mph" + }, + "wind_direction": { + "value": 294.69, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-08T09:00:00.000Z" + }, + "epa_aqi": { + "value": 89.595604 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 45.984047 + }, + "china_primary_pollutant": { + "value": "pm10" + }, + "pm25": { + "value": 32.130627, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 45.984047, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 0.3260995, + "units": "ppb" + }, + "no2": { + "value": 32.650528, + "units": "ppb" + }, + "co": { + "value": 0.48098654, + "units": "ppm" + }, + "so2": { + "value": 2.7280738, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 31.08, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 28.16, + "units": "F" + }, + "humidity": { + "value": 74.17, + "units": "%" + }, + "baro_pressure": { + "value": 30.47, + "units": "inHg" + }, + "dewpoint": { + "value": 24.76, + "units": "F" + }, + "wind_speed": { + "value": 3.08, + "units": "mph" + }, + "wind_gust": { + "value": 5.45, + "units": "mph" + }, + "wind_direction": { + "value": 325.32, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-08T10:00:00.000Z" + }, + "epa_aqi": { + "value": 89.81894 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 44.00499 + }, + "china_primary_pollutant": { + "value": "pm10" + }, + "pm25": { + "value": 30.73364, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 44.00499, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 1.7127336, + "units": "ppb" + }, + "no2": { + "value": 31.258957, + "units": "ppb" + }, + "co": { + "value": 0.46572694, + "units": "ppm" + }, + "so2": { + "value": 2.5945883, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": null, + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": null, + "units": "%" + }, + "road_risk_conditions": { + "value": null, + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 31.02, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 31.02, + "units": "F" + }, + "humidity": { + "value": 75.36, + "units": "%" + }, + "baro_pressure": { + "value": 30.49, + "units": "inHg" + }, + "dewpoint": { + "value": 25.02, + "units": "F" + }, + "wind_speed": { + "value": 2.8, + "units": "mph" + }, + "wind_gust": { + "value": 5.9, + "units": "mph" + }, + "wind_direction": { + "value": 322.27, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "observation_time": { + "value": "2021-03-08T11:00:00.000Z" + }, + "epa_aqi": { + "value": 89.30731 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 43.190083 + }, + "china_primary_pollutant": { + "value": "pm10" + }, + "pm25": { + "value": 30.151566, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 43.190083, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 3.0993679, + "units": "ppb" + }, + "no2": { + "value": 29.867388, + "units": "ppb" + }, + "co": { + "value": 0.45046738, + "units": "ppm" + }, + "so2": { + "value": 2.461103, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": null, + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": null, + "units": "%" + }, + "road_risk_conditions": { + "value": null, + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 26.28, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 19.14, + "units": "F" + }, + "humidity": { + "value": 74.55, + "units": "%" + }, + "baro_pressure": { + "value": 30.5, + "units": "inHg" + }, + "dewpoint": { + "value": 19.31, + "units": "F" + }, + "wind_speed": { + "value": 6.3, + "units": "mph" + }, + "wind_gust": { + "value": 11.68, + "units": "mph" + }, + "wind_direction": { + "value": 310.14, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 1.56, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 0, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "clear" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-08T12:00:00.000Z" + }, + "epa_aqi": { + "value": 89.370415 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 43.655743 + }, + "china_primary_pollutant": { + "value": "pm10" + }, + "pm25": { + "value": 30.50081, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 43.655743, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 4.486002, + "units": "ppb" + }, + "no2": { + "value": 28.475817, + "units": "ppb" + }, + "co": { + "value": 0.43520778, + "units": "ppm" + }, + "so2": { + "value": 2.3276174, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": null, + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": null, + "units": "%" + }, + "road_risk_conditions": { + "value": null, + "units": "ClimaCell Road Risk Conditions" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 29.95, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 22.82, + "units": "F" + }, + "humidity": { + "value": 65.05, + "units": "%" + }, + "baro_pressure": { + "value": 30.52, + "units": "inHg" + }, + "dewpoint": { + "value": 19.64, + "units": "F" + }, + "wind_speed": { + "value": 7.24, + "units": "mph" + }, + "wind_gust": { + "value": 15.38, + "units": "mph" + }, + "wind_direction": { + "value": 324.8, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 18.75, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 147.34, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "mostly_clear" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-08T13:00:00.000Z" + }, + "epa_aqi": { + "value": 86.14332 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 38.99913 + }, + "china_primary_pollutant": { + "value": "pm10" + }, + "pm25": { + "value": 27.182976, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 38.99913, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 14.964584, + "units": "ppb" + }, + "no2": { + "value": 21.307568, + "units": "ppb" + }, + "co": { + "value": 0.36020884, + "units": "ppm" + }, + "so2": { + "value": 2.3993974, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": null, + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": null, + "units": "%" + }, + "road_risk_conditions": { + "value": null, + "units": "ClimaCell Road Risk Conditions" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 34.02, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 28.39, + "units": "F" + }, + "humidity": { + "value": 55.89, + "units": "%" + }, + "baro_pressure": { + "value": 30.52, + "units": "inHg" + }, + "dewpoint": { + "value": 19.94, + "units": "F" + }, + "wind_speed": { + "value": 6.28, + "units": "mph" + }, + "wind_gust": { + "value": 15.15, + "units": "mph" + }, + "wind_direction": { + "value": 335.16, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 42.19, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 349.58, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "partly_cloudy" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-08T14:00:00.000Z" + }, + "epa_aqi": { + "value": 76.13227 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 25.960615 + }, + "china_primary_pollutant": { + "value": "pm10" + }, + "pm25": { + "value": 18.102581, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 25.960615, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 25.443167, + "units": "ppb" + }, + "no2": { + "value": 14.139319, + "units": "ppb" + }, + "co": { + "value": 0.28520986, + "units": "ppm" + }, + "so2": { + "value": 2.4711773, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": null, + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": null, + "units": "%" + }, + "road_risk_conditions": { + "value": null, + "units": "ClimaCell Road Risk Conditions" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 37.78, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 33.23, + "units": "F" + }, + "humidity": { + "value": 48.11, + "units": "%" + }, + "baro_pressure": { + "value": 30.52, + "units": "inHg" + }, + "dewpoint": { + "value": 19.92, + "units": "F" + }, + "wind_speed": { + "value": 5.8, + "units": "mph" + }, + "wind_gust": { + "value": 15.11, + "units": "mph" + }, + "wind_direction": { + "value": 324.49, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 84.38, + "units": "%" + }, + "cloud_ceiling": { + "value": 27290.35, + "units": "ft" + }, + "cloud_base": { + "value": 25980.47, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 535.61, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "cloudy" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-08T15:00:00.000Z" + }, + "epa_aqi": { + "value": 61.3304 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 18.602667 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 11.146766, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 16.065313, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 35.92175, + "units": "ppb" + }, + "no2": { + "value": 6.9710712, + "units": "ppb" + }, + "co": { + "value": 0.21021092, + "units": "ppm" + }, + "so2": { + "value": 2.5429573, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": null, + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": null, + "units": "%" + }, + "road_risk_conditions": { + "value": null, + "units": "ClimaCell Road Risk Conditions" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 40.57, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 40.57, + "units": "F" + }, + "humidity": { + "value": 41.41, + "units": "%" + }, + "baro_pressure": { + "value": 30.51, + "units": "inHg" + }, + "dewpoint": { + "value": 18.96, + "units": "F" + }, + "wind_speed": { + "value": 5.5, + "units": "mph" + }, + "wind_gust": { + "value": 14.93, + "units": "mph" + }, + "wind_direction": { + "value": 310.68, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 74.22, + "units": "%" + }, + "cloud_ceiling": { + "value": 22565.84, + "units": "ft" + }, + "cloud_base": { + "value": 21612.75, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 656.5, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "mostly_cloudy" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-08T16:00:00.000Z" + }, + "epa_aqi": { + "value": 52.542942 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 20.38958 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 9.080394, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 13.067619, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 39.37228, + "units": "ppb" + }, + "no2": { + "value": 5.853747, + "units": "ppb" + }, + "co": { + "value": 0.19491518, + "units": "ppm" + }, + "so2": { + "value": 2.3049417, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": null, + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": null, + "units": "%" + }, + "road_risk_conditions": { + "value": null, + "units": "ClimaCell Road Risk Conditions" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 42.83, + "units": "F" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, + "feels_like": { + "value": 42.83, + "units": "F" + }, + "humidity": { + "value": 36.82, + "units": "%" + }, + "baro_pressure": { + "value": 30.5, + "units": "inHg" + }, + "dewpoint": { + "value": 18.26, + "units": "F" + }, + "wind_speed": { + "value": 5.47, + "units": "mph" + }, + "wind_gust": { + "value": 15.02, + "units": "mph" + }, + "wind_direction": { + "value": 304.18, + "units": "degrees" + }, + "visibility": { + "value": 9.94, + "units": "mi" + }, + "cloud_cover": { + "value": 33.59, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": 24056.89, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 720.78, + "units": "w/sqm" + }, + "sunrise": { + "value": "2021-03-08T11:29:11.454Z" + }, + "sunset": { + "value": "2021-03-08T23:07:58.495Z" + }, + "moon_phase": { + "value": "waning_crescent" + }, + "weather_code": { + "value": "mostly_clear" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-08T17:00:00.000Z" + }, + "epa_aqi": { + "value": 52.542942 + }, + "epa_primary_pollutant": { + "value": "pm25" + }, + "china_aqi": { + "value": 20.38958 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 9.080394, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 13.067619, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 39.37228, + "units": "ppb" + }, + "no2": { + "value": 5.853747, + "units": "ppb" + }, + "co": { + "value": 0.19491518, + "units": "ppm" + }, + "so2": { + "value": 2.3049417, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Moderate" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": null, + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": null, + "units": "%" + }, + "road_risk_conditions": { + "value": null, + "units": "ClimaCell Road Risk Conditions" + } + } +] \ No newline at end of file diff --git a/tests/fixtures/climacell/v3_forecast_nowcast.json b/tests/fixtures/climacell/v3_forecast_nowcast.json new file mode 100644 index 0000000000000..db62f1393f01a --- /dev/null +++ b/tests/fixtures/climacell/v3_forecast_nowcast.json @@ -0,0 +1,4232 @@ +[ + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.2, + "units": "F" + }, + "feels_like": { + "value": 43.2, + "units": "F" + }, + "dewpoint": { + "value": 7.07, + "units": "F" + }, + "wind_speed": { + "value": 8.84, + "units": "mph" + }, + "wind_gust": { + "value": 13.32, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3389, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "humidity": { + "value": 23.92, + "units": "%" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:48:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.23, + "units": "F" + }, + "feels_like": { + "value": 43.23, + "units": "F" + }, + "dewpoint": { + "value": 7.05, + "units": "F" + }, + "wind_speed": { + "value": 8.87, + "units": "mph" + }, + "wind_gust": { + "value": 13.32, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3387, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "humidity": { + "value": 23.86, + "units": "%" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:49:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.27, + "units": "F" + }, + "feels_like": { + "value": 43.27, + "units": "F" + }, + "dewpoint": { + "value": 7.03, + "units": "F" + }, + "wind_speed": { + "value": 8.91, + "units": "mph" + }, + "wind_gust": { + "value": 13.32, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3386, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "humidity": { + "value": 23.8, + "units": "%" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:50:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.3, + "units": "F" + }, + "feels_like": { + "value": 43.3, + "units": "F" + }, + "dewpoint": { + "value": 7, + "units": "F" + }, + "wind_speed": { + "value": 8.95, + "units": "mph" + }, + "wind_gust": { + "value": 13.32, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3384, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "humidity": { + "value": 23.74, + "units": "%" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:51:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.34, + "units": "F" + }, + "feels_like": { + "value": 43.34, + "units": "F" + }, + "dewpoint": { + "value": 6.98, + "units": "F" + }, + "wind_speed": { + "value": 8.99, + "units": "mph" + }, + "wind_gust": { + "value": 13.31, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3383, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "humidity": { + "value": 23.68, + "units": "%" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:52:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.37, + "units": "F" + }, + "feels_like": { + "value": 43.37, + "units": "F" + }, + "dewpoint": { + "value": 6.96, + "units": "F" + }, + "wind_speed": { + "value": 9.03, + "units": "mph" + }, + "wind_gust": { + "value": 13.31, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3381, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "humidity": { + "value": 23.62, + "units": "%" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:53:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.4, + "units": "F" + }, + "feels_like": { + "value": 43.4, + "units": "F" + }, + "dewpoint": { + "value": 6.93, + "units": "F" + }, + "wind_speed": { + "value": 9.07, + "units": "mph" + }, + "wind_gust": { + "value": 13.31, + "units": "mph" + }, + "baro_pressure": { + "value": 30.338, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "humidity": { + "value": 23.56, + "units": "%" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:54:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.44, + "units": "F" + }, + "feels_like": { + "value": 43.44, + "units": "F" + }, + "dewpoint": { + "value": 6.91, + "units": "F" + }, + "wind_speed": { + "value": 9.11, + "units": "mph" + }, + "wind_gust": { + "value": 13.31, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3378, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "humidity": { + "value": 23.5, + "units": "%" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:55:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.47, + "units": "F" + }, + "feels_like": { + "value": 43.47, + "units": "F" + }, + "dewpoint": { + "value": 6.88, + "units": "F" + }, + "wind_speed": { + "value": 9.14, + "units": "mph" + }, + "wind_gust": { + "value": 13.31, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3377, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "humidity": { + "value": 23.44, + "units": "%" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:56:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.5, + "units": "F" + }, + "feels_like": { + "value": 43.5, + "units": "F" + }, + "dewpoint": { + "value": 6.86, + "units": "F" + }, + "wind_speed": { + "value": 9.18, + "units": "mph" + }, + "wind_gust": { + "value": 13.3, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3375, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "humidity": { + "value": 23.38, + "units": "%" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:57:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.54, + "units": "F" + }, + "feels_like": { + "value": 43.54, + "units": "F" + }, + "dewpoint": { + "value": 6.84, + "units": "F" + }, + "wind_speed": { + "value": 9.22, + "units": "mph" + }, + "wind_gust": { + "value": 13.3, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3374, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "humidity": { + "value": 23.32, + "units": "%" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:58:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.57, + "units": "F" + }, + "feels_like": { + "value": 43.57, + "units": "F" + }, + "dewpoint": { + "value": 6.81, + "units": "F" + }, + "wind_speed": { + "value": 9.26, + "units": "mph" + }, + "wind_gust": { + "value": 13.3, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3372, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5986, + "units": "w/sqm" + }, + "humidity": { + "value": 23.26, + "units": "%" + }, + "wind_direction": { + "value": 315.38, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:59:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.6, + "units": "F" + }, + "feels_like": { + "value": 43.6, + "units": "F" + }, + "dewpoint": { + "value": 6.79, + "units": "F" + }, + "wind_speed": { + "value": 9.29, + "units": "mph" + }, + "wind_gust": { + "value": 13.3, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3371, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 23.2, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:00:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.63, + "units": "F" + }, + "feels_like": { + "value": 43.63, + "units": "F" + }, + "dewpoint": { + "value": 6.74, + "units": "F" + }, + "wind_speed": { + "value": 9.28, + "units": "mph" + }, + "wind_gust": { + "value": 13.3, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3371, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 23.14, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:01:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.65, + "units": "F" + }, + "feels_like": { + "value": 43.65, + "units": "F" + }, + "dewpoint": { + "value": 6.7, + "units": "F" + }, + "wind_speed": { + "value": 9.27, + "units": "mph" + }, + "wind_gust": { + "value": 13.29, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3371, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 23.07, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:02:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.68, + "units": "F" + }, + "feels_like": { + "value": 43.68, + "units": "F" + }, + "dewpoint": { + "value": 6.66, + "units": "F" + }, + "wind_speed": { + "value": 9.27, + "units": "mph" + }, + "wind_gust": { + "value": 13.29, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3371, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 23.01, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:03:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.71, + "units": "F" + }, + "feels_like": { + "value": 43.71, + "units": "F" + }, + "dewpoint": { + "value": 6.61, + "units": "F" + }, + "wind_speed": { + "value": 9.26, + "units": "mph" + }, + "wind_gust": { + "value": 13.29, + "units": "mph" + }, + "baro_pressure": { + "value": 30.337, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.94, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:04:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.73, + "units": "F" + }, + "feels_like": { + "value": 43.73, + "units": "F" + }, + "dewpoint": { + "value": 6.57, + "units": "F" + }, + "wind_speed": { + "value": 9.25, + "units": "mph" + }, + "wind_gust": { + "value": 13.29, + "units": "mph" + }, + "baro_pressure": { + "value": 30.337, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.88, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:05:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.76, + "units": "F" + }, + "feels_like": { + "value": 43.76, + "units": "F" + }, + "dewpoint": { + "value": 6.53, + "units": "F" + }, + "wind_speed": { + "value": 9.24, + "units": "mph" + }, + "wind_gust": { + "value": 13.29, + "units": "mph" + }, + "baro_pressure": { + "value": 30.337, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.81, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:06:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.78, + "units": "F" + }, + "feels_like": { + "value": 43.78, + "units": "F" + }, + "dewpoint": { + "value": 6.49, + "units": "F" + }, + "wind_speed": { + "value": 9.23, + "units": "mph" + }, + "wind_gust": { + "value": 13.29, + "units": "mph" + }, + "baro_pressure": { + "value": 30.337, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.75, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:07:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.81, + "units": "F" + }, + "feels_like": { + "value": 43.81, + "units": "F" + }, + "dewpoint": { + "value": 6.44, + "units": "F" + }, + "wind_speed": { + "value": 9.22, + "units": "mph" + }, + "wind_gust": { + "value": 13.29, + "units": "mph" + }, + "baro_pressure": { + "value": 30.337, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.68, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:08:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.83, + "units": "F" + }, + "feels_like": { + "value": 43.83, + "units": "F" + }, + "dewpoint": { + "value": 6.4, + "units": "F" + }, + "wind_speed": { + "value": 9.21, + "units": "mph" + }, + "wind_gust": { + "value": 13.28, + "units": "mph" + }, + "baro_pressure": { + "value": 30.337, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.62, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:09:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.86, + "units": "F" + }, + "feels_like": { + "value": 43.86, + "units": "F" + }, + "dewpoint": { + "value": 6.36, + "units": "F" + }, + "wind_speed": { + "value": 9.2, + "units": "mph" + }, + "wind_gust": { + "value": 13.28, + "units": "mph" + }, + "baro_pressure": { + "value": 30.337, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.55, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:10:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.88, + "units": "F" + }, + "feels_like": { + "value": 43.88, + "units": "F" + }, + "dewpoint": { + "value": 6.31, + "units": "F" + }, + "wind_speed": { + "value": 9.19, + "units": "mph" + }, + "wind_gust": { + "value": 13.28, + "units": "mph" + }, + "baro_pressure": { + "value": 30.337, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.49, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:11:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.91, + "units": "F" + }, + "feels_like": { + "value": 43.91, + "units": "F" + }, + "dewpoint": { + "value": 6.27, + "units": "F" + }, + "wind_speed": { + "value": 9.18, + "units": "mph" + }, + "wind_gust": { + "value": 13.28, + "units": "mph" + }, + "baro_pressure": { + "value": 30.337, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.43, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:12:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.93, + "units": "F" + }, + "feels_like": { + "value": 43.93, + "units": "F" + }, + "dewpoint": { + "value": 6.23, + "units": "F" + }, + "wind_speed": { + "value": 9.17, + "units": "mph" + }, + "wind_gust": { + "value": 13.28, + "units": "mph" + }, + "baro_pressure": { + "value": 30.337, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.36, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:13:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.96, + "units": "F" + }, + "feels_like": { + "value": 43.96, + "units": "F" + }, + "dewpoint": { + "value": 6.18, + "units": "F" + }, + "wind_speed": { + "value": 9.16, + "units": "mph" + }, + "wind_gust": { + "value": 13.28, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3369, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.3, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:14:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.99, + "units": "F" + }, + "feels_like": { + "value": 43.99, + "units": "F" + }, + "dewpoint": { + "value": 6.14, + "units": "F" + }, + "wind_speed": { + "value": 9.15, + "units": "mph" + }, + "wind_gust": { + "value": 13.27, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3369, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.23, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:15:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 44.01, + "units": "F" + }, + "feels_like": { + "value": 44.01, + "units": "F" + }, + "dewpoint": { + "value": 6.1, + "units": "F" + }, + "wind_speed": { + "value": 9.15, + "units": "mph" + }, + "wind_gust": { + "value": 13.27, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3369, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.17, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:16:06.409Z" + }, + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 44.04, + "units": "F" + }, + "feels_like": { + "value": 44.04, + "units": "F" + }, + "dewpoint": { + "value": 6.05, + "units": "F" + }, + "wind_speed": { + "value": 9.14, + "units": "mph" + }, + "wind_gust": { + "value": 13.27, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3369, + "units": "inHg" + }, + "visibility": { + "value": 6.21371, + "units": "mi" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 787.18353, + "units": "w/sqm" + }, + "humidity": { + "value": 22.1, + "units": "%" + }, + "wind_direction": { + "value": 315.14, + "units": "degrees" + }, + "precipitation_type": { + "value": "none" + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "epa_aqi": { + "value": 38.39714 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 22.407887 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 4.4674377, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 6.5192575, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 43.26963, + "units": "ppb" + }, + "no2": { + "value": 2.0680292, + "units": "ppb" + }, + "co": { + "value": 0.15218769, + "units": "ppm" + }, + "so2": { + "value": 0.9747729, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T18:17:06.409Z" + }, + "weather_code": { + "value": "clear" + } + } +] \ No newline at end of file diff --git a/tests/fixtures/climacell/v3_realtime.json b/tests/fixtures/climacell/v3_realtime.json new file mode 100644 index 0000000000000..dca7f8bd6d049 --- /dev/null +++ b/tests/fixtures/climacell/v3_realtime.json @@ -0,0 +1,147 @@ +{ + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 43.93, + "units": "F" + }, + "feels_like": { + "value": 43.93, + "units": "F" + }, + "dewpoint": { + "value": 9.95, + "units": "F" + }, + "wind_speed": { + "value": 6.99, + "units": "mph" + }, + "wind_gust": { + "value": 13.42, + "units": "mph" + }, + "baro_pressure": { + "value": 30.3753, + "units": "inHg" + }, + "visibility": { + "value": 6.21, + "units": "mi" + }, + "humidity": { + "value": 24.5, + "units": "%" + }, + "wind_direction": { + "value": 315.81, + "units": "degrees" + }, + "precipitation": { + "value": 0, + "units": "in/hr" + }, + "precipitation_type": { + "value": "none" + }, + "cloud_cover": { + "value": 0, + "units": "%" + }, + "cloud_ceiling": { + "value": null, + "units": "ft" + }, + "cloud_base": { + "value": null, + "units": "ft" + }, + "surface_shortwave_radiation": { + "value": 800.5, + "units": "w/sqm" + }, + "fire_index": { + "value": 16.375 + }, + "sunrise": { + "value": "2021-03-07T11:30:42.625Z" + }, + "sunset": { + "value": "2021-03-07T23:06:57.532Z" + }, + "moon_phase": { + "value": "last_quarter" + }, + "weather_code": { + "value": "clear" + }, + "road_risk_score": { + "value": "Low risk", + "units": "ClimaCell Road Risk Score" + }, + "road_risk_confidence": { + "value": 100, + "units": "%" + }, + "road_risk_conditions": { + "value": "Clear", + "units": "ClimaCell Road Risk Conditions" + }, + "epa_aqi": { + "value": 36.625 + }, + "epa_primary_pollutant": { + "value": "o3" + }, + "china_aqi": { + "value": 26.375 + }, + "china_primary_pollutant": { + "value": "o3" + }, + "pm25": { + "value": 11.625, + "units": "\u00b5g/m3" + }, + "pm10": { + "value": 19.5625, + "units": "\u00b5g/m3" + }, + "o3": { + "value": 51.4375, + "units": "ppb" + }, + "no2": { + "value": 3.75, + "units": "ppb" + }, + "co": { + "value": 0.4375, + "units": "ppm" + }, + "so2": { + "value": 2.25, + "units": "ppb" + }, + "epa_health_concern": { + "value": "Good" + }, + "china_health_concern": { + "value": "Good" + }, + "pollen_tree": { + "value": 1, + "units": "Climacell Pollen Index" + }, + "pollen_weed": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "pollen_grass": { + "value": 0, + "units": "Climacell Pollen Index" + }, + "observation_time": { + "value": "2021-03-07T17:48:05.777Z" + } +} \ No newline at end of file diff --git a/tests/fixtures/climacell/v4.json b/tests/fixtures/climacell/v4.json new file mode 100644 index 0000000000000..d667284a4ad89 --- /dev/null +++ b/tests/fixtures/climacell/v4.json @@ -0,0 +1,2360 @@ +{ + "current": { + "temperature": 44.13, + "humidity": 22.71, + "pressureSeaLevel": 30.35, + "windSpeed": 9.33, + "windDirection": 315.14, + "weatherCode": 1000, + "visibility": 8.15, + "pollutantO3": 46.53 + }, + "forecasts": { + "nowcast": [ + { + "startTime": "2021-03-07T17:48:00Z", + "values": { + "temperatureMin": 44.13, + "temperatureMax": 44.13, + "windSpeed": 9.33, + "windDirection": 315.14, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T17:53:00Z", + "values": { + "temperatureMin": 43.9, + "temperatureMax": 43.9, + "windSpeed": 9.31, + "windDirection": 315.14, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T17:58:00Z", + "values": { + "temperatureMin": 43.68, + "temperatureMax": 43.68, + "windSpeed": 9.28, + "windDirection": 315.14, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:03:00Z", + "values": { + "temperatureMin": 43.66, + "temperatureMax": 43.66, + "windSpeed": 9.26, + "windDirection": 315.14, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:08:00Z", + "values": { + "temperatureMin": 43.79, + "temperatureMax": 43.79, + "windSpeed": 9.22, + "windDirection": 315.14, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:13:00Z", + "values": { + "temperatureMin": 43.92, + "temperatureMax": 43.92, + "windSpeed": 9.17, + "windDirection": 315.14, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:18:00Z", + "values": { + "temperatureMin": 44.04, + "temperatureMax": 44.04, + "windSpeed": 9.13, + "windDirection": 315.14, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:23:00Z", + "values": { + "temperatureMin": 44.17, + "temperatureMax": 44.17, + "windSpeed": 9.06, + "windDirection": 315.14, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:28:00Z", + "values": { + "temperatureMin": 44.31, + "temperatureMax": 44.31, + "windSpeed": 9.02, + "windDirection": 315.14, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:33:00Z", + "values": { + "temperatureMin": 44.44, + "temperatureMax": 44.44, + "windSpeed": 8.97, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:38:00Z", + "values": { + "temperatureMin": 44.56, + "temperatureMax": 44.56, + "windSpeed": 8.93, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:43:00Z", + "values": { + "temperatureMin": 44.69, + "temperatureMax": 44.69, + "windSpeed": 8.88, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:48:00Z", + "values": { + "temperatureMin": 44.82, + "temperatureMax": 44.82, + "windSpeed": 8.84, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:53:00Z", + "values": { + "temperatureMin": 44.94, + "temperatureMax": 44.94, + "windSpeed": 8.79, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:58:00Z", + "values": { + "temperatureMin": 45.07, + "temperatureMax": 45.07, + "windSpeed": 8.75, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:03:00Z", + "values": { + "temperatureMin": 45.16, + "temperatureMax": 45.16, + "windSpeed": 8.75, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:08:00Z", + "values": { + "temperatureMin": 45.23, + "temperatureMax": 45.23, + "windSpeed": 8.75, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:13:00Z", + "values": { + "temperatureMin": 45.28, + "temperatureMax": 45.28, + "windSpeed": 8.77, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:18:00Z", + "values": { + "temperatureMin": 45.36, + "temperatureMax": 45.36, + "windSpeed": 8.79, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:23:00Z", + "values": { + "temperatureMin": 45.43, + "temperatureMax": 45.43, + "windSpeed": 8.81, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:28:00Z", + "values": { + "temperatureMin": 45.5, + "temperatureMax": 45.5, + "windSpeed": 8.81, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:33:00Z", + "values": { + "temperatureMin": 45.55, + "temperatureMax": 45.55, + "windSpeed": 8.84, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:38:00Z", + "values": { + "temperatureMin": 45.63, + "temperatureMax": 45.63, + "windSpeed": 8.86, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:43:00Z", + "values": { + "temperatureMin": 45.7, + "temperatureMax": 45.7, + "windSpeed": 8.88, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:48:00Z", + "values": { + "temperatureMin": 45.75, + "temperatureMax": 45.75, + "windSpeed": 8.9, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:53:00Z", + "values": { + "temperatureMin": 45.82, + "temperatureMax": 45.82, + "windSpeed": 8.9, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:58:00Z", + "values": { + "temperatureMin": 45.9, + "temperatureMax": 45.9, + "windSpeed": 8.93, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:03:00Z", + "values": { + "temperatureMin": 45.88, + "temperatureMax": 45.88, + "windSpeed": 8.97, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:08:00Z", + "values": { + "temperatureMin": 45.82, + "temperatureMax": 45.82, + "windSpeed": 9.02, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:13:00Z", + "values": { + "temperatureMin": 45.75, + "temperatureMax": 45.75, + "windSpeed": 9.06, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:18:00Z", + "values": { + "temperatureMin": 45.7, + "temperatureMax": 45.7, + "windSpeed": 9.1, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:23:00Z", + "values": { + "temperatureMin": 45.63, + "temperatureMax": 45.63, + "windSpeed": 9.15, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:28:00Z", + "values": { + "temperatureMin": 45.57, + "temperatureMax": 45.57, + "windSpeed": 9.19, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:33:00Z", + "values": { + "temperatureMin": 45.5, + "temperatureMax": 45.5, + "windSpeed": 9.24, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:38:00Z", + "values": { + "temperatureMin": 45.45, + "temperatureMax": 45.45, + "windSpeed": 9.28, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:43:00Z", + "values": { + "temperatureMin": 45.39, + "temperatureMax": 45.39, + "windSpeed": 9.33, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:48:00Z", + "values": { + "temperatureMin": 45.32, + "temperatureMax": 45.32, + "windSpeed": 9.37, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:53:00Z", + "values": { + "temperatureMin": 45.27, + "temperatureMax": 45.27, + "windSpeed": 9.42, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:58:00Z", + "values": { + "temperatureMin": 45.19, + "temperatureMax": 45.19, + "windSpeed": 9.46, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:03:00Z", + "values": { + "temperatureMin": 45.14, + "temperatureMax": 45.14, + "windSpeed": 9.4, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:08:00Z", + "values": { + "temperatureMin": 45.07, + "temperatureMax": 45.07, + "windSpeed": 9.24, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:13:00Z", + "values": { + "temperatureMin": 45.01, + "temperatureMax": 45.01, + "windSpeed": 9.08, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:18:00Z", + "values": { + "temperatureMin": 44.94, + "temperatureMax": 44.94, + "windSpeed": 8.95, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:23:00Z", + "values": { + "temperatureMin": 44.89, + "temperatureMax": 44.89, + "windSpeed": 8.79, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:28:00Z", + "values": { + "temperatureMin": 44.82, + "temperatureMax": 44.82, + "windSpeed": 8.63, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:33:00Z", + "values": { + "temperatureMin": 44.76, + "temperatureMax": 44.76, + "windSpeed": 8.5, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:38:00Z", + "values": { + "temperatureMin": 44.69, + "temperatureMax": 44.69, + "windSpeed": 8.34, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:43:00Z", + "values": { + "temperatureMin": 44.64, + "temperatureMax": 44.64, + "windSpeed": 8.19, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:48:00Z", + "values": { + "temperatureMin": 44.56, + "temperatureMax": 44.56, + "windSpeed": 8.05, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:53:00Z", + "values": { + "temperatureMin": 44.51, + "temperatureMax": 44.51, + "windSpeed": 7.9, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:58:00Z", + "values": { + "temperatureMin": 44.44, + "temperatureMax": 44.44, + "windSpeed": 7.74, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:03:00Z", + "values": { + "temperatureMin": 44.26, + "temperatureMax": 44.26, + "windSpeed": 7.47, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:08:00Z", + "values": { + "temperatureMin": 44.01, + "temperatureMax": 44.01, + "windSpeed": 7.14, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:13:00Z", + "values": { + "temperatureMin": 43.74, + "temperatureMax": 43.74, + "windSpeed": 6.78, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:18:00Z", + "values": { + "temperatureMin": 43.48, + "temperatureMax": 43.48, + "windSpeed": 6.44, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:23:00Z", + "values": { + "temperatureMin": 43.23, + "temperatureMax": 43.23, + "windSpeed": 6.08, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:28:00Z", + "values": { + "temperatureMin": 42.98, + "temperatureMax": 42.98, + "windSpeed": 5.75, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:33:00Z", + "values": { + "temperatureMin": 42.71, + "temperatureMax": 42.71, + "windSpeed": 5.39, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:38:00Z", + "values": { + "temperatureMin": 42.46, + "temperatureMax": 42.46, + "windSpeed": 5.06, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:43:00Z", + "values": { + "temperatureMin": 42.21, + "temperatureMax": 42.21, + "windSpeed": 4.7, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:48:00Z", + "values": { + "temperatureMin": 41.94, + "temperatureMax": 41.94, + "windSpeed": 4.36, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:53:00Z", + "values": { + "temperatureMin": 41.68, + "temperatureMax": 41.68, + "windSpeed": 4, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:58:00Z", + "values": { + "temperatureMin": 41.43, + "temperatureMax": 41.43, + "windSpeed": 3.67, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T23:03:00Z", + "values": { + "temperatureMin": 41.16, + "temperatureMax": 41.16, + "windSpeed": 3.6, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T23:08:00Z", + "values": { + "temperatureMin": 40.91, + "temperatureMax": 40.91, + "windSpeed": 3.76, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T23:13:00Z", + "values": { + "temperatureMin": 40.66, + "temperatureMax": 40.66, + "windSpeed": 3.91, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T23:18:00Z", + "values": { + "temperatureMin": 40.41, + "temperatureMax": 40.41, + "windSpeed": 4.05, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T23:23:00Z", + "values": { + "temperatureMin": 40.14, + "temperatureMax": 40.14, + "windSpeed": 4.21, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T23:28:00Z", + "values": { + "temperatureMin": 39.88, + "temperatureMax": 39.88, + "windSpeed": 4.36, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T23:33:00Z", + "values": { + "temperatureMin": 39.63, + "temperatureMax": 39.63, + "windSpeed": 4.5, + "windDirection": 295.94, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T23:38:00Z", + "values": { + "temperatureMin": 39.38, + "temperatureMax": 39.38, + "windSpeed": 4.65, + "windDirection": 295.94, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T23:43:00Z", + "values": { + "temperatureMin": 39.11, + "temperatureMax": 39.11, + "windSpeed": 4.79, + "windDirection": 295.94, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + } + ], + "hourly": [ + { + "startTime": "2021-03-07T17:48:00Z", + "values": { + "temperatureMin": 44.13, + "temperatureMax": 44.13, + "windSpeed": 9.33, + "windDirection": 315.14, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T18:48:00Z", + "values": { + "temperatureMin": 44.82, + "temperatureMax": 44.82, + "windSpeed": 8.84, + "windDirection": 321.71, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T19:48:00Z", + "values": { + "temperatureMin": 45.75, + "temperatureMax": 45.75, + "windSpeed": 8.9, + "windDirection": 323.38, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T20:48:00Z", + "values": { + "temperatureMin": 45.32, + "temperatureMax": 45.32, + "windSpeed": 9.37, + "windDirection": 318.43, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T21:48:00Z", + "values": { + "temperatureMin": 44.56, + "temperatureMax": 44.56, + "windSpeed": 8.05, + "windDirection": 320.9, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T22:48:00Z", + "values": { + "temperatureMin": 41.94, + "temperatureMax": 41.94, + "windSpeed": 4.36, + "windDirection": 322.11, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-07T23:48:00Z", + "values": { + "temperatureMin": 38.86, + "temperatureMax": 38.86, + "windSpeed": 4.94, + "windDirection": 295.94, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T00:48:00Z", + "values": { + "temperatureMin": 36.18, + "temperatureMax": 36.18, + "windSpeed": 5.59, + "windDirection": 11.94, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T01:48:00Z", + "values": { + "temperatureMin": 34.3, + "temperatureMax": 34.3, + "windSpeed": 5.57, + "windDirection": 13.68, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T02:48:00Z", + "values": { + "temperatureMin": 32.88, + "temperatureMax": 32.88, + "windSpeed": 5.41, + "windDirection": 14.93, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T03:48:00Z", + "values": { + "temperatureMin": 31.91, + "temperatureMax": 31.91, + "windSpeed": 4.61, + "windDirection": 26.07, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T04:48:00Z", + "values": { + "temperatureMin": 29.17, + "temperatureMax": 29.17, + "windSpeed": 2.59, + "windDirection": 51.27, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T05:48:00Z", + "values": { + "temperatureMin": 27.37, + "temperatureMax": 27.37, + "windSpeed": 3.31, + "windDirection": 343.25, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T06:48:00Z", + "values": { + "temperatureMin": 26.73, + "temperatureMax": 26.73, + "windSpeed": 4.27, + "windDirection": 341.46, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T07:48:00Z", + "values": { + "temperatureMin": 26.38, + "temperatureMax": 26.38, + "windSpeed": 3.53, + "windDirection": 322.34, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T08:48:00Z", + "values": { + "temperatureMin": 26.15, + "temperatureMax": 26.15, + "windSpeed": 3.65, + "windDirection": 294.69, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T09:48:00Z", + "values": { + "temperatureMin": 30.07, + "temperatureMax": 30.07, + "windSpeed": 3.2, + "windDirection": 325.32, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T10:48:00Z", + "values": { + "temperatureMin": 31.03, + "temperatureMax": 31.03, + "windSpeed": 2.84, + "windDirection": 322.27, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T11:48:00Z", + "values": { + "temperatureMin": 27.23, + "temperatureMax": 27.23, + "windSpeed": 5.59, + "windDirection": 310.14, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T12:48:00Z", + "values": { + "temperatureMin": 29.21, + "temperatureMax": 29.21, + "windSpeed": 7.05, + "windDirection": 324.8, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T13:48:00Z", + "values": { + "temperatureMin": 33.19, + "temperatureMax": 33.19, + "windSpeed": 6.46, + "windDirection": 335.16, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T14:48:00Z", + "values": { + "temperatureMin": 37.02, + "temperatureMax": 37.02, + "windSpeed": 5.88, + "windDirection": 324.49, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T15:48:00Z", + "values": { + "temperatureMin": 40.01, + "temperatureMax": 40.01, + "windSpeed": 5.55, + "windDirection": 310.68, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T16:48:00Z", + "values": { + "temperatureMin": 42.37, + "temperatureMax": 42.37, + "windSpeed": 5.46, + "windDirection": 304.18, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T17:48:00Z", + "values": { + "temperatureMin": 44.62, + "temperatureMax": 44.62, + "windSpeed": 4.99, + "windDirection": 301.19, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T18:48:00Z", + "values": { + "temperatureMin": 46.78, + "temperatureMax": 46.78, + "windSpeed": 4.72, + "windDirection": 295.05, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T19:48:00Z", + "values": { + "temperatureMin": 48.42, + "temperatureMax": 48.42, + "windSpeed": 4.81, + "windDirection": 287.4, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T20:48:00Z", + "values": { + "temperatureMin": 49.28, + "temperatureMax": 49.28, + "windSpeed": 4.74, + "windDirection": 282.48, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T21:48:00Z", + "values": { + "temperatureMin": 48.72, + "temperatureMax": 48.72, + "windSpeed": 2.51, + "windDirection": 268.74, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T22:48:00Z", + "values": { + "temperatureMin": 44.37, + "temperatureMax": 44.37, + "windSpeed": 3.56, + "windDirection": 180.04, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T23:48:00Z", + "values": { + "temperatureMin": 39.9, + "temperatureMax": 39.9, + "windSpeed": 4.68, + "windDirection": 177.89, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T00:48:00Z", + "values": { + "temperatureMin": 37.87, + "temperatureMax": 37.87, + "windSpeed": 5.21, + "windDirection": 197.47, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T01:48:00Z", + "values": { + "temperatureMin": 36.91, + "temperatureMax": 36.91, + "windSpeed": 5.46, + "windDirection": 209.77, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T02:48:00Z", + "values": { + "temperatureMin": 36.64, + "temperatureMax": 36.64, + "windSpeed": 6.11, + "windDirection": 210.14, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T03:48:00Z", + "values": { + "temperatureMin": 36.63, + "temperatureMax": 36.63, + "windSpeed": 6.4, + "windDirection": 216, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T04:48:00Z", + "values": { + "temperatureMin": 36.23, + "temperatureMax": 36.23, + "windSpeed": 6.22, + "windDirection": 223.92, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T05:48:00Z", + "values": { + "temperatureMin": 35.58, + "temperatureMax": 35.58, + "windSpeed": 5.75, + "windDirection": 229.68, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T06:48:00Z", + "values": { + "temperatureMin": 34.68, + "temperatureMax": 34.68, + "windSpeed": 5.21, + "windDirection": 235.24, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T07:48:00Z", + "values": { + "temperatureMin": 33.69, + "temperatureMax": 33.69, + "windSpeed": 4.81, + "windDirection": 237.24, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T08:48:00Z", + "values": { + "temperatureMin": 32.74, + "temperatureMax": 32.74, + "windSpeed": 4.52, + "windDirection": 239.35, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T09:48:00Z", + "values": { + "temperatureMin": 32.05, + "temperatureMax": 32.05, + "windSpeed": 4.32, + "windDirection": 245.68, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T10:48:00Z", + "values": { + "temperatureMin": 31.57, + "temperatureMax": 31.57, + "windSpeed": 4.14, + "windDirection": 248.11, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T11:48:00Z", + "values": { + "temperatureMin": 32.92, + "temperatureMax": 32.92, + "windSpeed": 4.32, + "windDirection": 249.54, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T12:48:00Z", + "values": { + "temperatureMin": 38.5, + "temperatureMax": 38.5, + "windSpeed": 4.7, + "windDirection": 253.3, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T13:48:00Z", + "values": { + "temperatureMin": 46.08, + "temperatureMax": 46.08, + "windSpeed": 4.41, + "windDirection": 258.49, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T14:48:00Z", + "values": { + "temperatureMin": 53.26, + "temperatureMax": 53.26, + "windSpeed": 4.9, + "windDirection": 260.49, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T15:48:00Z", + "values": { + "temperatureMin": 58.15, + "temperatureMax": 58.15, + "windSpeed": 5.55, + "windDirection": 261.29, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T16:48:00Z", + "values": { + "temperatureMin": 61.56, + "temperatureMax": 61.56, + "windSpeed": 6.35, + "windDirection": 264.3, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T17:48:00Z", + "values": { + "temperatureMin": 64, + "temperatureMax": 64, + "windSpeed": 6.6, + "windDirection": 257.54, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T18:48:00Z", + "values": { + "temperatureMin": 65.79, + "temperatureMax": 65.79, + "windSpeed": 6.96, + "windDirection": 253.12, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T19:48:00Z", + "values": { + "temperatureMin": 66.74, + "temperatureMax": 66.74, + "windSpeed": 6.8, + "windDirection": 259.46, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T20:48:00Z", + "values": { + "temperatureMin": 66.96, + "temperatureMax": 66.96, + "windSpeed": 6.33, + "windDirection": 294.25, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T21:48:00Z", + "values": { + "temperatureMin": 64.35, + "temperatureMax": 64.35, + "windSpeed": 3.91, + "windDirection": 279.37, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T22:48:00Z", + "values": { + "temperatureMin": 61.07, + "temperatureMax": 61.07, + "windSpeed": 3.65, + "windDirection": 218.19, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T23:48:00Z", + "values": { + "temperatureMin": 56.3, + "temperatureMax": 56.3, + "windSpeed": 4.09, + "windDirection": 208.3, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T00:48:00Z", + "values": { + "temperatureMin": 53.19, + "temperatureMax": 53.19, + "windSpeed": 4.21, + "windDirection": 216.42, + "weatherCode": 1102, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T01:48:00Z", + "values": { + "temperatureMin": 51.94, + "temperatureMax": 51.94, + "windSpeed": 3.38, + "windDirection": 257.19, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T02:48:00Z", + "values": { + "temperatureMin": 49.82, + "temperatureMax": 49.82, + "windSpeed": 2.71, + "windDirection": 288.85, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T03:48:00Z", + "values": { + "temperatureMin": 48.24, + "temperatureMax": 48.24, + "windSpeed": 2.8, + "windDirection": 334.41, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T04:48:00Z", + "values": { + "temperatureMin": 47.44, + "temperatureMax": 47.44, + "windSpeed": 2.26, + "windDirection": 342.01, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T05:48:00Z", + "values": { + "temperatureMin": 45.59, + "temperatureMax": 45.59, + "windSpeed": 2.35, + "windDirection": 2.43, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T06:48:00Z", + "values": { + "temperatureMin": 43.43, + "temperatureMax": 43.43, + "windSpeed": 2.3, + "windDirection": 336.56, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T07:48:00Z", + "values": { + "temperatureMin": 41.11, + "temperatureMax": 41.11, + "windSpeed": 2.71, + "windDirection": 4.41, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T08:48:00Z", + "values": { + "temperatureMin": 39.58, + "temperatureMax": 39.58, + "windSpeed": 3.4, + "windDirection": 21.26, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T09:48:00Z", + "values": { + "temperatureMin": 39.85, + "temperatureMax": 39.85, + "windSpeed": 3.31, + "windDirection": 22.76, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T10:48:00Z", + "values": { + "temperatureMin": 37.85, + "temperatureMax": 37.85, + "windSpeed": 4.03, + "windDirection": 29.3, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T11:48:00Z", + "values": { + "temperatureMin": 38.97, + "temperatureMax": 38.97, + "windSpeed": 3.15, + "windDirection": 21.82, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T12:48:00Z", + "values": { + "temperatureMin": 44.31, + "temperatureMax": 44.31, + "windSpeed": 3.53, + "windDirection": 14.25, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T13:48:00Z", + "values": { + "temperatureMin": 50.25, + "temperatureMax": 50.25, + "windSpeed": 2.82, + "windDirection": 42.41, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T14:48:00Z", + "values": { + "temperatureMin": 54.97, + "temperatureMax": 54.97, + "windSpeed": 2.53, + "windDirection": 87.81, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T15:48:00Z", + "values": { + "temperatureMin": 58.46, + "temperatureMax": 58.46, + "windSpeed": 3.09, + "windDirection": 125.82, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T16:48:00Z", + "values": { + "temperatureMin": 61.21, + "temperatureMax": 61.21, + "windSpeed": 4.03, + "windDirection": 157.54, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T17:48:00Z", + "values": { + "temperatureMin": 63.36, + "temperatureMax": 63.36, + "windSpeed": 5.21, + "windDirection": 166.66, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T18:48:00Z", + "values": { + "temperatureMin": 64.83, + "temperatureMax": 64.83, + "windSpeed": 6.93, + "windDirection": 189.24, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T19:48:00Z", + "values": { + "temperatureMin": 65.23, + "temperatureMax": 65.23, + "windSpeed": 8.95, + "windDirection": 194.58, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T20:48:00Z", + "values": { + "temperatureMin": 64.98, + "temperatureMax": 64.98, + "windSpeed": 9.4, + "windDirection": 193.22, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T21:48:00Z", + "values": { + "temperatureMin": 64.06, + "temperatureMax": 64.06, + "windSpeed": 8.55, + "windDirection": 186.39, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T22:48:00Z", + "values": { + "temperatureMin": 61.9, + "temperatureMax": 61.9, + "windSpeed": 7.49, + "windDirection": 171.81, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T23:48:00Z", + "values": { + "temperatureMin": 59.4, + "temperatureMax": 59.4, + "windSpeed": 7.54, + "windDirection": 165.51, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T00:48:00Z", + "values": { + "temperatureMin": 57.63, + "temperatureMax": 57.63, + "windSpeed": 8.12, + "windDirection": 171.94, + "weatherCode": 1102, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T01:48:00Z", + "values": { + "temperatureMin": 56.17, + "temperatureMax": 56.17, + "windSpeed": 8.7, + "windDirection": 176.84, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T02:48:00Z", + "values": { + "temperatureMin": 55.36, + "temperatureMax": 55.36, + "windSpeed": 9.42, + "windDirection": 184.14, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T03:48:00Z", + "values": { + "temperatureMin": 54.88, + "temperatureMax": 54.88, + "windSpeed": 10, + "windDirection": 195.54, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T04:48:00Z", + "values": { + "temperatureMin": 54.14, + "temperatureMax": 54.14, + "windSpeed": 10.4, + "windDirection": 200.56, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T05:48:00Z", + "values": { + "temperatureMin": 53.46, + "temperatureMax": 53.46, + "windSpeed": 10.04, + "windDirection": 198.08, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T06:48:00Z", + "values": { + "temperatureMin": 52.11, + "temperatureMax": 52.11, + "windSpeed": 10.02, + "windDirection": 199.54, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T07:48:00Z", + "values": { + "temperatureMin": 51.64, + "temperatureMax": 51.64, + "windSpeed": 10.51, + "windDirection": 202.73, + "weatherCode": 1102, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T08:48:00Z", + "values": { + "temperatureMin": 50.79, + "temperatureMax": 50.79, + "windSpeed": 10.38, + "windDirection": 203.35, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T09:48:00Z", + "values": { + "temperatureMin": 49.93, + "temperatureMax": 49.93, + "windSpeed": 9.51, + "windDirection": 210.36, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T10:48:00Z", + "values": { + "temperatureMin": 49.1, + "temperatureMax": 49.1, + "windSpeed": 8.61, + "windDirection": 210.6, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T11:48:00Z", + "values": { + "temperatureMin": 48.42, + "temperatureMax": 48.42, + "windSpeed": 9.15, + "windDirection": 211.29, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T12:48:00Z", + "values": { + "temperatureMin": 48.9, + "temperatureMax": 48.9, + "windSpeed": 10.25, + "windDirection": 215.59, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T13:48:00Z", + "values": { + "temperatureMin": 50.54, + "temperatureMax": 50.54, + "windSpeed": 10.18, + "windDirection": 215.48, + "weatherCode": 1102, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T14:48:00Z", + "values": { + "temperatureMin": 53.19, + "temperatureMax": 53.19, + "windSpeed": 9.4, + "windDirection": 208.76, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T15:48:00Z", + "values": { + "temperatureMin": 56.19, + "temperatureMax": 56.19, + "windSpeed": 9.73, + "windDirection": 197.59, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T16:48:00Z", + "values": { + "temperatureMin": 59.34, + "temperatureMax": 59.34, + "windSpeed": 10.69, + "windDirection": 204.29, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T17:48:00Z", + "values": { + "temperatureMin": 62.35, + "temperatureMax": 62.35, + "windSpeed": 11.81, + "windDirection": 204.56, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T18:48:00Z", + "values": { + "temperatureMin": 64.6, + "temperatureMax": 64.6, + "windSpeed": 13.09, + "windDirection": 206.85, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T19:48:00Z", + "values": { + "temperatureMin": 65.91, + "temperatureMax": 65.91, + "windSpeed": 13.82, + "windDirection": 204.82, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T20:48:00Z", + "values": { + "temperatureMin": 66.22, + "temperatureMax": 66.22, + "windSpeed": 14.54, + "windDirection": 208.43, + "weatherCode": 1100, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T21:48:00Z", + "values": { + "temperatureMin": 65.46, + "temperatureMax": 65.46, + "windSpeed": 13.2, + "windDirection": 208.3, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T22:48:00Z", + "values": { + "temperatureMin": 64.35, + "temperatureMax": 64.35, + "windSpeed": 12.35, + "windDirection": 208.58, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T23:48:00Z", + "values": { + "temperatureMin": 62.85, + "temperatureMax": 62.85, + "windSpeed": 12.86, + "windDirection": 205.39, + "weatherCode": 1101, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-12T00:48:00Z", + "values": { + "temperatureMin": 61.75, + "temperatureMax": 61.75, + "windSpeed": 14.7, + "windDirection": 209.51, + "weatherCode": 1102, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-12T01:48:00Z", + "values": { + "temperatureMin": 61.2, + "temperatureMax": 61.2, + "windSpeed": 15.57, + "windDirection": 211.47, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-12T02:48:00Z", + "values": { + "temperatureMin": 60.46, + "temperatureMax": 60.46, + "windSpeed": 14.94, + "windDirection": 211.57, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-12T03:48:00Z", + "values": { + "temperatureMin": 59.94, + "temperatureMax": 59.94, + "windSpeed": 14.29, + "windDirection": 208.93, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-12T04:48:00Z", + "values": { + "temperatureMin": 59.52, + "temperatureMax": 59.52, + "windSpeed": 14.36, + "windDirection": 217.91, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + } + ], + "daily": [ + { + "startTime": "2021-03-07T11:00:00Z", + "values": { + "temperatureMin": 26.11, + "temperatureMax": 45.93, + "windSpeed": 9.49, + "windDirection": 239.6, + "weatherCode": 1000, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-08T11:00:00Z", + "values": { + "temperatureMin": 26.28, + "temperatureMax": 49.42, + "windSpeed": 7.24, + "windDirection": 262.82, + "weatherCode": 1102, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-09T11:00:00Z", + "values": { + "temperatureMin": 31.48, + "temperatureMax": 66.98, + "windSpeed": 7.05, + "windDirection": 229.3, + "weatherCode": 1102, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-10T11:00:00Z", + "values": { + "temperatureMin": 37.32, + "temperatureMax": 65.28, + "windSpeed": 10.64, + "windDirection": 149.91, + "weatherCode": 1102, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-11T11:00:00Z", + "values": { + "temperatureMin": 48.29, + "temperatureMax": 66.25, + "windSpeed": 15.69, + "windDirection": 210.45, + "weatherCode": 1102, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-12T11:00:00Z", + "values": { + "temperatureMin": 53.83, + "temperatureMax": 67.91, + "windSpeed": 12.3, + "windDirection": 217.98, + "weatherCode": 4000, + "precipitationIntensityAvg": 0.0002, + "precipitationProbability": 25 + } + }, + { + "startTime": "2021-03-13T11:00:00Z", + "values": { + "temperatureMin": 42.91, + "temperatureMax": 54.48, + "windSpeed": 9.72, + "windDirection": 58.79, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 25 + } + }, + { + "startTime": "2021-03-14T10:00:00Z", + "values": { + "temperatureMin": 33.35, + "temperatureMax": 42.91, + "windSpeed": 16.25, + "windDirection": 70.25, + "weatherCode": 5101, + "precipitationIntensityAvg": 0.0393, + "precipitationProbability": 95 + } + }, + { + "startTime": "2021-03-15T10:00:00Z", + "values": { + "temperatureMin": 29.35, + "temperatureMax": 43.67, + "windSpeed": 15.89, + "windDirection": 84.47, + "weatherCode": 5001, + "precipitationIntensityAvg": 0.0024, + "precipitationProbability": 55 + } + }, + { + "startTime": "2021-03-16T10:00:00Z", + "values": { + "temperatureMin": 29.1, + "temperatureMax": 43, + "windSpeed": 6.71, + "windDirection": 103.85, + "weatherCode": 1102, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-17T10:00:00Z", + "values": { + "temperatureMin": 34.32, + "temperatureMax": 52.4, + "windSpeed": 7.27, + "windDirection": 145.41, + "weatherCode": 1102, + "precipitationIntensityAvg": 0, + "precipitationProbability": 0 + } + }, + { + "startTime": "2021-03-18T10:00:00Z", + "values": { + "temperatureMin": 41.32, + "temperatureMax": 54.07, + "windSpeed": 6.58, + "windDirection": 62.99, + "weatherCode": 1001, + "precipitationIntensityAvg": 0, + "precipitationProbability": 10 + } + }, + { + "startTime": "2021-03-19T10:00:00Z", + "values": { + "temperatureMin": 39.4, + "temperatureMax": 48.94, + "windSpeed": 13.91, + "windDirection": 68.54, + "weatherCode": 4000, + "precipitationIntensityAvg": 0.0048, + "precipitationProbability": 55 + } + }, + { + "startTime": "2021-03-20T10:00:00Z", + "values": { + "temperatureMin": 35.06, + "temperatureMax": 40.12, + "windSpeed": 17.35, + "windDirection": 56.98, + "weatherCode": 5001, + "precipitationIntensityAvg": 0.002, + "precipitationProbability": 33.3 + } + }, + { + "startTime": "2021-03-21T10:00:00Z", + "values": { + "temperatureMin": 33.66, + "temperatureMax": 66.54, + "windSpeed": 15.93, + "windDirection": 82.57, + "weatherCode": 5001, + "precipitationIntensityAvg": 0.0004, + "precipitationProbability": 45 + } + } + ] + } +} \ No newline at end of file From 32463f0f00f83c70fa1c1cf1142327e47b806ff7 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Sun, 7 Mar 2021 13:43:12 -0500 Subject: [PATCH 05/15] revert accidental changes and enable hourly and nowcast forecast entities in test --- homeassistant/components/climacell/weather.py | 3 ++- tests/components/climacell/test_weather.py | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/climacell/weather.py b/homeassistant/components/climacell/weather.py index 8c824f898f842..222b8ca6ec5b5 100644 --- a/homeassistant/components/climacell/weather.py +++ b/homeassistant/components/climacell/weather.py @@ -392,6 +392,7 @@ def forecast(self): forecast, CC_V3_ATTR_PRECIPITATION_PROBABILITY ) temp = self._get_cc_value(forecast, CC_V3_ATTR_TEMPERATURE) + temp_low = None wind_direction = self._get_cc_value(forecast, CC_V3_ATTR_WIND_DIRECTION) wind_speed = self._get_cc_value(forecast, CC_V3_ATTR_WIND_SPEED) @@ -415,7 +416,7 @@ def forecast(self): for item in forecast[CC_V3_ATTR_TEMPERATURE] if "min" in item ), - temp, + temp_low, ) elif self.forecast_type == NOWCAST: # Precipitation is forecasted in CONF_TIMESTEP increments but in a diff --git a/tests/components/climacell/test_weather.py b/tests/components/climacell/test_weather.py index 0028b9e7bb6ab..f5e653d69c20b 100644 --- a/tests/components/climacell/test_weather.py +++ b/tests/components/climacell/test_weather.py @@ -34,6 +34,7 @@ ) from homeassistant.const import ATTR_ATTRIBUTION, ATTR_FRIENDLY_NAME from homeassistant.core import State +from homeassistant.helpers.entity_registry import async_get from homeassistant.helpers.typing import HomeAssistantType from .const import API_V3_ENTRY_DATA, API_V4_ENTRY_DATA @@ -43,6 +44,17 @@ _LOGGER = logging.getLogger(__name__) +async def _enable_entity(hass: HomeAssistantType, entity_name: str) -> None: + """Enable disabled entity.""" + ent_reg = async_get(hass) + entry = ent_reg.async_get(entity_name) + updated_entry = ent_reg.async_update_entity( + entry.entity_id, **{"disabled_by": None} + ) + assert updated_entry != entry + assert updated_entry.disabled is False + + async def _setup(hass: HomeAssistantType, config: Dict[str, Any]) -> State: """Set up entry and return entity state.""" data = _get_config_schema(hass)(config) @@ -55,7 +67,11 @@ async def _setup(hass: HomeAssistantType, config: Dict[str, Any]) -> State: config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() - assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 1 + await _enable_entity(hass, "weather.climacell_hourly") + await _enable_entity(hass, "weather.climacell_nowcast") + assert await hass.config_entries.async_reload(config_entry.entry_id) + await hass.async_block_till_done() + assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 3 return hass.states.get("weather.climacell_daily") From 893ef6f802e52dd723596a5661c30e9c32a3c750 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Sun, 7 Mar 2021 13:46:58 -0500 Subject: [PATCH 06/15] use variable instead of accessing dictionary multiple times --- homeassistant/components/climacell/weather.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/climacell/weather.py b/homeassistant/components/climacell/weather.py index 222b8ca6ec5b5..48f712e74e83e 100644 --- a/homeassistant/components/climacell/weather.py +++ b/homeassistant/components/climacell/weather.py @@ -226,7 +226,8 @@ def visibility(self): def forecast(self): """Return the forecast.""" # Check if forecasts are available - if not self.coordinator.data.get(FORECASTS, {}).get(self.forecast_type): + raw_forecasts = self.coordinator.data.get(FORECASTS, {}).get(self.forecast_type) + if not raw_forecasts: return None forecasts = [] @@ -235,7 +236,7 @@ def forecast(self): # Set default values (in cases where keys don't exist), None will be # returned. Override properties per forecast type as needed - for forecast in self.coordinator.data[FORECASTS][self.forecast_type]: + for forecast in raw_forecasts: forecast_dt = dt_util.parse_datetime(forecast[CC_ATTR_TIMESTAMP]) # Throw out past data @@ -374,14 +375,15 @@ def visibility(self): def forecast(self): """Return the forecast.""" # Check if forecasts are available - if not self.coordinator.data[FORECASTS].get(self.forecast_type): + raw_forecasts = self.coordinator.data.get(FORECASTS, {}).get(self.forecast_type) + if not raw_forecasts: return None forecasts = [] # Set default values (in cases where keys don't exist), None will be # returned. Override properties per forecast type as needed - for forecast in self.coordinator.data[FORECASTS][self.forecast_type]: + for forecast in raw_forecasts: forecast_dt = dt_util.parse_datetime( self._get_cc_value(forecast, CC_V3_ATTR_TIMESTAMP) ) From 6956d04620ef56c5e19e352aadacbef237a8878c Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Sun, 7 Mar 2021 14:04:13 -0500 Subject: [PATCH 07/15] only grab necessary fields --- .../components/climacell/__init__.py | 62 +- tests/components/climacell/test_weather.py | 16 +- .../fixtures/climacell/v3_forecast_daily.json | 1291 +----- .../climacell/v3_forecast_hourly.json | 3300 +------------- .../climacell/v3_forecast_nowcast.json | 3984 ++--------------- tests/fixtures/climacell/v3_realtime.json | 119 +- 6 files changed, 555 insertions(+), 8217 deletions(-) diff --git a/homeassistant/components/climacell/__init__.py b/homeassistant/components/climacell/__init__.py index ab32e5722358d..64fd64de28f4d 100644 --- a/homeassistant/components/climacell/__init__.py +++ b/homeassistant/components/climacell/__init__.py @@ -6,17 +6,7 @@ from typing import Any, Dict, Optional, Union from pyclimacell import ClimaCellV3, ClimaCellV4 -from pyclimacell.const import ( - CURRENT, - DAILY, - FORECAST_DAILY, - FORECAST_HOURLY, - FORECAST_NOWCAST, - FORECASTS, - HOURLY, - NOWCAST, - REALTIME, -) +from pyclimacell.const import CURRENT, DAILY, FORECASTS, HOURLY, NOWCAST from pyclimacell.exceptions import ( CantConnectException, InvalidAPIKeyException, @@ -56,6 +46,17 @@ CC_ATTR_VISIBILITY, CC_ATTR_WIND_DIRECTION, CC_ATTR_WIND_SPEED, + CC_V3_ATTR_CONDITION, + CC_V3_ATTR_HUMIDITY, + CC_V3_ATTR_OZONE, + CC_V3_ATTR_PRECIPITATION, + CC_V3_ATTR_PRECIPITATION_DAILY, + CC_V3_ATTR_PRECIPITATION_PROBABILITY, + CC_V3_ATTR_PRESSURE, + CC_V3_ATTR_TEMPERATURE, + CC_V3_ATTR_VISIBILITY, + CC_V3_ATTR_WIND_DIRECTION, + CC_V3_ATTR_WIND_SPEED, CONF_TIMESTEP, DEFAULT_FORECAST_TYPE, DEFAULT_TIMESTEP, @@ -240,20 +241,51 @@ async def _async_update_data(self) -> Dict[str, Any]: try: if self._api_version == 3: data[CURRENT] = await self._api.realtime( - self._api.available_fields(REALTIME) + [ + CC_V3_ATTR_TEMPERATURE, + CC_V3_ATTR_HUMIDITY, + CC_V3_ATTR_PRESSURE, + CC_V3_ATTR_WIND_SPEED, + CC_V3_ATTR_WIND_DIRECTION, + CC_V3_ATTR_CONDITION, + CC_V3_ATTR_VISIBILITY, + CC_V3_ATTR_OZONE, + ] ) data[FORECASTS][HOURLY] = await self._api.forecast_hourly( - self._api.available_fields(FORECAST_HOURLY), + [ + CC_V3_ATTR_TEMPERATURE, + CC_V3_ATTR_WIND_SPEED, + CC_V3_ATTR_WIND_DIRECTION, + CC_V3_ATTR_CONDITION, + CC_V3_ATTR_PRECIPITATION, + CC_V3_ATTR_PRECIPITATION_PROBABILITY, + ], None, timedelta(hours=24), ) data[FORECASTS][DAILY] = await self._api.forecast_daily( - self._api.available_fields(FORECAST_DAILY), None, timedelta(days=14) + [ + CC_V3_ATTR_TEMPERATURE, + CC_V3_ATTR_WIND_SPEED, + CC_V3_ATTR_WIND_DIRECTION, + CC_V3_ATTR_CONDITION, + CC_V3_ATTR_PRECIPITATION_DAILY, + CC_V3_ATTR_PRECIPITATION_PROBABILITY, + ], + None, + timedelta(days=14), ) data[FORECASTS][NOWCAST] = await self._api.forecast_nowcast( - self._api.available_fields(FORECAST_NOWCAST), + [ + CC_V3_ATTR_TEMPERATURE, + CC_V3_ATTR_WIND_SPEED, + CC_V3_ATTR_WIND_DIRECTION, + CC_V3_ATTR_CONDITION, + CC_V3_ATTR_PRECIPITATION, + ], None, timedelta( minutes=min(300, self._config_entry.options[CONF_TIMESTEP] * 30) diff --git a/tests/components/climacell/test_weather.py b/tests/components/climacell/test_weather.py index f5e653d69c20b..4f08a2b65be40 100644 --- a/tests/components/climacell/test_weather.py +++ b/tests/components/climacell/test_weather.py @@ -185,10 +185,10 @@ async def test_v3_load_and_unload( { ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, ATTR_FORECAST_TIME: "2021-03-19T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0.043179999999999996, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 20, - ATTR_FORECAST_TEMP: 19, - ATTR_FORECAST_TEMP_LOW: 10, + ATTR_FORECAST_PRECIPITATION: 0.1778, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 45, + ATTR_FORECAST_TEMP: 9, + ATTR_FORECAST_TEMP_LOW: 5, }, { ATTR_FORECAST_CONDITION: ATTR_CONDITION_RAINY, @@ -209,12 +209,12 @@ async def test_v3_load_and_unload( ], ATTR_FRIENDLY_NAME: "ClimaCell - Daily", ATTR_WEATHER_HUMIDITY: 24, - ATTR_WEATHER_OZONE: 51.4375, - ATTR_WEATHER_PRESSURE: 1028.6258179170002, + ATTR_WEATHER_OZONE: 52.625, + ATTR_WEATHER_PRESSURE: 1028.124632345, ATTR_WEATHER_TEMPERATURE: 7, ATTR_WEATHER_VISIBILITY: 9.994026240000002, - ATTR_WEATHER_WIND_BEARING: 315.81, - ATTR_WEATHER_WIND_SPEED: 11.24931456, + ATTR_WEATHER_WIND_BEARING: 320.31, + ATTR_WEATHER_WIND_SPEED: 14.62893696, } diff --git a/tests/fixtures/climacell/v3_forecast_daily.json b/tests/fixtures/climacell/v3_forecast_daily.json index ae238a34d558f..18f2d77e0cf97 100644 --- a/tests/fixtures/climacell/v3_forecast_daily.json +++ b/tests/fixtures/climacell/v3_forecast_daily.json @@ -20,67 +20,10 @@ "value": 0, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-07T02:00:00Z", - "max": { - "value": 0, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-07T11:00:00Z", - "min": { - "value": 16.68, - "units": "F" - } - }, - { - "observation_time": "2021-03-07T21:00:00Z", - "max": { - "value": 44.88, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-07T21:00:00Z", - "min": { - "value": 31.5, - "units": "%" - } - }, - { - "observation_time": "2021-03-07T11:00:00Z", - "max": { - "value": 73.85, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-07T02:00:00Z", - "min": { - "value": 30.23, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-07T14:00:00Z", - "max": { - "value": 30.39, - "units": "inHg" - } - } - ], "wind_speed": [ { "observation_time": "2021-03-08T00:00:00Z", @@ -113,28 +56,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-07T02:00:00Z", - "min": { - "value": 9.94, - "units": "mi" - } - }, - { - "observation_time": "2021-03-07T02:00:00Z", - "max": { - "value": 9.94, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, "weather_code": { "value": "clear" }, @@ -165,67 +86,10 @@ "value": 0, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-08T02:00:00Z", - "max": { - "value": 0, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-08T12:00:00Z", - "min": { - "value": 19.14, - "units": "F" - } - }, - { - "observation_time": "2021-03-08T21:00:00Z", - "max": { - "value": 49.42, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-08T20:00:00Z", - "min": { - "value": 30.54, - "units": "%" - } - }, - { - "observation_time": "2021-03-08T07:00:00Z", - "max": { - "value": 80.18, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-08T02:00:00Z", - "min": { - "value": 30.4, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-08T15:00:00Z", - "max": { - "value": 30.52, - "units": "inHg" - } - } - ], "wind_speed": [ { "observation_time": "2021-03-08T22:00:00Z", @@ -258,28 +122,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-08T02:00:00Z", - "min": { - "value": 9.94, - "units": "mi" - } - }, - { - "observation_time": "2021-03-08T02:00:00Z", - "max": { - "value": 9.94, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, "weather_code": { "value": "cloudy" }, @@ -310,67 +152,10 @@ "value": 0, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-09T02:00:00Z", - "max": { - "value": 0, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-09T11:00:00Z", - "min": { - "value": 27.32, - "units": "F" - } - }, - { - "observation_time": "2021-03-09T21:00:00Z", - "max": { - "value": 66.98, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-09T20:00:00Z", - "min": { - "value": 40.39, - "units": "%" - } - }, - { - "observation_time": "2021-03-09T11:00:00Z", - "max": { - "value": 76.96, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-09T21:00:00Z", - "min": { - "value": 30.33, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-09T02:00:00Z", - "max": { - "value": 30.44, - "units": "inHg" - } - } - ], "wind_speed": [ { "observation_time": "2021-03-09T22:00:00Z", @@ -403,28 +188,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-09T02:00:00Z", - "min": { - "value": 9.94, - "units": "mi" - } - }, - { - "observation_time": "2021-03-09T02:00:00Z", - "max": { - "value": 9.94, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-09T11:27:39.839Z" - }, - "sunset": { - "value": "2021-03-09T23:08:59.218Z" - }, "weather_code": { "value": "mostly_cloudy" }, @@ -455,67 +218,10 @@ "value": 0, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-10T02:00:00Z", - "max": { - "value": 0, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-10T11:00:00Z", - "min": { - "value": 33.97, - "units": "F" - } - }, - { - "observation_time": "2021-03-10T20:00:00Z", - "max": { - "value": 65.28, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-10T20:00:00Z", - "min": { - "value": 35.91, - "units": "%" - } - }, - { - "observation_time": "2021-03-10T11:00:00Z", - "max": { - "value": 92.39, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-10T22:00:00Z", - "min": { - "value": 30.32, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-10T15:00:00Z", - "max": { - "value": 30.44, - "units": "inHg" - } - } - ], "wind_speed": [ { "observation_time": "2021-03-10T05:00:00Z", @@ -548,28 +254,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-10T02:00:00Z", - "min": { - "value": 9.94, - "units": "mi" - } - }, - { - "observation_time": "2021-03-11T01:00:00Z", - "max": { - "value": 15, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-10T11:26:07.817Z" - }, - "sunset": { - "value": "2021-03-10T23:09:59.710Z" - }, "weather_code": { "value": "cloudy" }, @@ -600,67 +284,10 @@ "value": 0, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-11T02:00:00Z", - "max": { - "value": 0, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 5, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-11T12:00:00Z", - "min": { - "value": 48.69, - "units": "F" - } - }, - { - "observation_time": "2021-03-11T21:00:00Z", - "max": { - "value": 67.37, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-11T20:00:00Z", - "min": { - "value": 37.42, - "units": "%" - } - }, - { - "observation_time": "2021-03-11T12:00:00Z", - "max": { - "value": 70.02, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-11T22:00:00Z", - "min": { - "value": 30.21, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-11T02:00:00Z", - "max": { - "value": 30.37, - "units": "inHg" - } - } - ], "wind_speed": [ { "observation_time": "2021-03-11T02:00:00Z", @@ -693,28 +320,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-11T05:00:00Z", - "min": { - "value": 15, - "units": "mi" - } - }, - { - "observation_time": "2021-03-11T16:00:00Z", - "max": { - "value": 15, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-11T11:24:35.417Z" - }, - "sunset": { - "value": "2021-03-11T23:10:59.980Z" - }, "weather_code": { "value": "cloudy" }, @@ -745,68 +350,11 @@ "value": 0.0018, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-13T00:00:00Z", - "max": { - "value": 0.0009, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 25, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-12T12:00:00Z", - "min": { - "value": 53.83, - "units": "F" - } - }, - { - "observation_time": "2021-03-12T18:00:00Z", - "max": { - "value": 67.91, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-12T18:00:00Z", - "min": { - "value": 45.58, - "units": "%" - } - }, - { - "observation_time": "2021-03-13T00:00:00Z", - "max": { - "value": 78.58, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-12T21:00:00Z", - "min": { - "value": 30.18, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-12T03:00:00Z", - "max": { - "value": 30.26, - "units": "inHg" - } - } - ], - "wind_speed": [ + "wind_speed": [ { "observation_time": "2021-03-13T00:00:00Z", "min": { @@ -838,28 +386,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-12T04:00:00Z", - "min": { - "value": 15, - "units": "mi" - } - }, - { - "observation_time": "2021-03-13T00:00:00Z", - "max": { - "value": 15, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-12T11:23:02.671Z" - }, - "sunset": { - "value": "2021-03-12T23:12:00.036Z" - }, "weather_code": { "value": "cloudy" }, @@ -890,67 +416,10 @@ "value": 0, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-13T03:00:00Z", - "max": { - "value": 0, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 25, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-14T00:00:00Z", - "min": { - "value": 45.48, - "units": "F" - } - }, - { - "observation_time": "2021-03-13T03:00:00Z", - "max": { - "value": 60.42, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-13T21:00:00Z", - "min": { - "value": 56.16, - "units": "%" - } - }, - { - "observation_time": "2021-03-13T12:00:00Z", - "max": { - "value": 88.2, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-13T21:00:00Z", - "min": { - "value": 30.09, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-13T03:00:00Z", - "max": { - "value": 30.22, - "units": "inHg" - } - } - ], "wind_speed": [ { "observation_time": "2021-03-13T03:00:00Z", @@ -983,28 +452,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-13T18:00:00Z", - "min": { - "value": 15, - "units": "mi" - } - }, - { - "observation_time": "2021-03-13T03:00:00Z", - "max": { - "value": 15, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-13T11:21:29.611Z" - }, - "sunset": { - "value": "2021-03-13T23:12:59.890Z" - }, "weather_code": { "value": "cloudy" }, @@ -1035,67 +482,10 @@ "value": 0.0423, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-15T00:00:00Z", - "max": { - "value": 0.0198, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 75, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-15T00:00:00Z", - "min": { - "value": 29.02, - "units": "F" - } - }, - { - "observation_time": "2021-03-14T03:00:00Z", - "max": { - "value": 43.58, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-14T03:00:00Z", - "min": { - "value": 76.24, - "units": "%" - } - }, - { - "observation_time": "2021-03-14T18:00:00Z", - "max": { - "value": 87.2, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-15T00:00:00Z", - "min": { - "value": 29.95, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-14T03:00:00Z", - "max": { - "value": 30.11, - "units": "inHg" - } - } - ], "wind_speed": [ { "observation_time": "2021-03-14T06:00:00Z", @@ -1128,28 +518,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-15T00:00:00Z", - "min": { - "value": 8.81, - "units": "mi" - } - }, - { - "observation_time": "2021-03-14T09:00:00Z", - "max": { - "value": 15, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-14T11:19:56.268Z" - }, - "sunset": { - "value": "2021-03-14T23:13:59.551Z" - }, "weather_code": { "value": "rain_light" }, @@ -1180,67 +548,10 @@ "value": 0.2876, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-15T03:00:00Z", - "max": { - "value": 0.1737, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 95, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-15T12:00:00Z", - "min": { - "value": 22.15, - "units": "F" - } - }, - { - "observation_time": "2021-03-15T09:00:00Z", - "max": { - "value": 25.37, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-15T21:00:00Z", - "min": { - "value": 79.46, - "units": "%" - } - }, - { - "observation_time": "2021-03-15T03:00:00Z", - "max": { - "value": 94.18, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-15T09:00:00Z", - "min": { - "value": 29.99, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-16T00:00:00Z", - "max": { - "value": 30.24, - "units": "inHg" - } - } - ], "wind_speed": [ { "observation_time": "2021-03-16T00:00:00Z", @@ -1273,28 +584,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-15T03:00:00Z", - "min": { - "value": 2, - "units": "mi" - } - }, - { - "observation_time": "2021-03-15T09:00:00Z", - "max": { - "value": 15, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-15T11:18:22.673Z" - }, - "sunset": { - "value": "2021-03-15T23:14:59.028Z" - }, "weather_code": { "value": "snow_heavy" }, @@ -1325,217 +614,81 @@ "value": 0.0002, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-16T06:00:00Z", - "max": { - "value": 0.0002, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 5, "units": "%" }, - "feels_like": [ + "wind_speed": [ { - "observation_time": "2021-03-16T12:00:00Z", + "observation_time": "2021-03-16T18:00:00Z", "min": { - "value": 22.49, - "units": "F" + "value": 4.98, + "units": "mph" } }, { - "observation_time": "2021-03-16T21:00:00Z", + "observation_time": "2021-03-16T03:00:00Z", "max": { - "value": 43, - "units": "F" + "value": 9.77, + "units": "mph" } } ], - "humidity": [ + "wind_direction": [ { "observation_time": "2021-03-16T18:00:00Z", "min": { - "value": 35.44, - "units": "%" + "value": 80.47, + "units": "degrees" } }, { "observation_time": "2021-03-16T03:00:00Z", "max": { - "value": 82.86, - "units": "%" + "value": 58.98, + "units": "degrees" } } ], - "baro_pressure": [ + "weather_code": { + "value": "cloudy" + }, + "observation_time": { + "value": "2021-03-16" + }, + "lat": 38.90694, + "lon": -77.03012 + }, + { + "temp": [ { - "observation_time": "2021-03-16T03:00:00Z", + "observation_time": "2021-03-17T12:00:00Z", "min": { - "value": 30.32, - "units": "inHg" + "value": 34.32, + "units": "F" } }, { - "observation_time": "2021-03-16T15:00:00Z", + "observation_time": "2021-03-17T21:00:00Z", "max": { - "value": 30.42, - "units": "inHg" + "value": 52.4, + "units": "F" } } ], + "precipitation_accumulation": { + "value": 0, + "units": "in" + }, + "precipitation_probability": { + "value": 0, + "units": "%" + }, "wind_speed": [ { - "observation_time": "2021-03-16T18:00:00Z", + "observation_time": "2021-03-18T00:00:00Z", "min": { - "value": 4.98, - "units": "mph" - } - }, - { - "observation_time": "2021-03-16T03:00:00Z", - "max": { - "value": 9.77, - "units": "mph" - } - } - ], - "wind_direction": [ - { - "observation_time": "2021-03-16T18:00:00Z", - "min": { - "value": 80.47, - "units": "degrees" - } - }, - { - "observation_time": "2021-03-16T03:00:00Z", - "max": { - "value": 58.98, - "units": "degrees" - } - } - ], - "visibility": [ - { - "observation_time": "2021-03-16T18:00:00Z", - "min": { - "value": 15, - "units": "mi" - } - }, - { - "observation_time": "2021-03-16T21:00:00Z", - "max": { - "value": 15, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-16T11:16:48.856Z" - }, - "sunset": { - "value": "2021-03-16T23:15:58.333Z" - }, - "weather_code": { - "value": "cloudy" - }, - "observation_time": { - "value": "2021-03-16" - }, - "lat": 38.90694, - "lon": -77.03012 - }, - { - "temp": [ - { - "observation_time": "2021-03-17T12:00:00Z", - "min": { - "value": 34.32, - "units": "F" - } - }, - { - "observation_time": "2021-03-17T21:00:00Z", - "max": { - "value": 52.4, - "units": "F" - } - } - ], - "precipitation_accumulation": { - "value": 0, - "units": "in" - }, - "precipitation": [ - { - "observation_time": "2021-03-17T03:00:00Z", - "max": { - "value": 0, - "units": "in/hr" - } - } - ], - "precipitation_probability": { - "value": 0, - "units": "%" - }, - "feels_like": [ - { - "observation_time": "2021-03-17T12:00:00Z", - "min": { - "value": 29.46, - "units": "F" - } - }, - { - "observation_time": "2021-03-17T21:00:00Z", - "max": { - "value": 52.4, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-17T18:00:00Z", - "min": { - "value": 53.88, - "units": "%" - } - }, - { - "observation_time": "2021-03-17T09:00:00Z", - "max": { - "value": 83.16, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-18T00:00:00Z", - "min": { - "value": 30.18, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-17T03:00:00Z", - "max": { - "value": 30.39, - "units": "inHg" - } - } - ], - "wind_speed": [ - { - "observation_time": "2021-03-18T00:00:00Z", - "min": { - "value": 4.49, + "value": 4.49, "units": "mph" } }, @@ -1563,28 +716,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-17T18:00:00Z", - "min": { - "value": 15, - "units": "mi" - } - }, - { - "observation_time": "2021-03-17T15:00:00Z", - "max": { - "value": 15, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-17T11:15:14.849Z" - }, - "sunset": { - "value": "2021-03-17T23:16:57.476Z" - }, "weather_code": { "value": "cloudy" }, @@ -1615,67 +746,10 @@ "value": 0, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-18T03:00:00Z", - "max": { - "value": 0, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 5, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-18T12:00:00Z", - "min": { - "value": 41.99, - "units": "F" - } - }, - { - "observation_time": "2021-03-18T21:00:00Z", - "max": { - "value": 54.07, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-18T21:00:00Z", - "min": { - "value": 57.46, - "units": "%" - } - }, - { - "observation_time": "2021-03-18T09:00:00Z", - "max": { - "value": 85.04, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-18T21:00:00Z", - "min": { - "value": 30.12, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-18T15:00:00Z", - "max": { - "value": 30.21, - "units": "inHg" - } - } - ], "wind_speed": [ { "observation_time": "2021-03-18T06:00:00Z", @@ -1708,28 +782,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-18T12:00:00Z", - "min": { - "value": 15, - "units": "mi" - } - }, - { - "observation_time": "2021-03-18T06:00:00Z", - "max": { - "value": 15, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-18T11:13:40.683Z" - }, - "sunset": { - "value": "2021-03-18T23:17:56.466Z" - }, "weather_code": { "value": "cloudy" }, @@ -1744,137 +796,58 @@ { "observation_time": "2021-03-19T12:00:00Z", "min": { - "value": 50.56, + "value": 40.48, "units": "F" } }, { - "observation_time": "2021-03-19T21:00:00Z", + "observation_time": "2021-03-19T18:00:00Z", "max": { - "value": 65.71, + "value": 48.94, "units": "F" } } ], "precipitation_accumulation": { - "value": 0.0017, + "value": 0.007, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-19T03:00:00Z", - "max": { - "value": 0.0011, - "units": "in/hr" - } - } - ], "precipitation_probability": { - "value": 20, + "value": 45, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-19T12:00:00Z", - "min": { - "value": 50.56, - "units": "F" - } - }, - { - "observation_time": "2021-03-19T21:00:00Z", - "max": { - "value": 65.71, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-19T18:00:00Z", - "min": { - "value": 32.98, - "units": "%" - } - }, - { - "observation_time": "2021-03-19T03:00:00Z", - "max": { - "value": 98.02, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-19T03:00:00Z", - "min": { - "value": 29.84, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-19T12:00:00Z", - "max": { - "value": 29.96, - "units": "inHg" - } - } - ], "wind_speed": [ { - "observation_time": "2021-03-20T00:00:00Z", + "observation_time": "2021-03-19T03:00:00Z", "min": { - "value": 3.42, + "value": 5.43, "units": "mph" } }, { - "observation_time": "2021-03-19T21:00:00Z", + "observation_time": "2021-03-20T00:00:00Z", "max": { - "value": 8.99, + "value": 11.1, "units": "mph" } } ], "wind_direction": [ { - "observation_time": "2021-03-20T00:00:00Z", + "observation_time": "2021-03-19T03:00:00Z", "min": { - "value": 250.61, + "value": 50.18, "units": "degrees" } }, { - "observation_time": "2021-03-19T21:00:00Z", + "observation_time": "2021-03-20T00:00:00Z", "max": { - "value": 244.8, + "value": 86.96, "units": "degrees" } } ], - "visibility": [ - { - "observation_time": "2021-03-19T09:00:00Z", - "min": { - "value": 15, - "units": "mi" - } - }, - { - "observation_time": "2021-03-19T15:00:00Z", - "max": { - "value": 15, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-19T11:12:06.387Z" - }, - "sunset": { - "value": "2021-03-19T23:18:55.314Z" - }, "weather_code": { "value": "cloudy" }, @@ -1905,67 +878,10 @@ "value": 0.0485, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-20T03:00:00Z", - "max": { - "value": 0.0138, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 55, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-21T00:00:00Z", - "min": { - "value": 28, - "units": "F" - } - }, - { - "observation_time": "2021-03-20T03:00:00Z", - "max": { - "value": 41.05, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-20T15:00:00Z", - "min": { - "value": 59.94, - "units": "%" - } - }, - { - "observation_time": "2021-03-20T03:00:00Z", - "max": { - "value": 77.4, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-20T09:00:00Z", - "min": { - "value": 30.03, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-21T00:00:00Z", - "max": { - "value": 30.12, - "units": "inHg" - } - } - ], "wind_speed": [ { "observation_time": "2021-03-20T03:00:00Z", @@ -1998,28 +914,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-20T03:00:00Z", - "min": { - "value": 12.51, - "units": "mi" - } - }, - { - "observation_time": "2021-03-20T21:00:00Z", - "max": { - "value": 15, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-20T11:10:31.992Z" - }, - "sunset": { - "value": "2021-03-20T23:19:54.031Z" - }, "weather_code": { "value": "drizzle" }, @@ -2050,67 +944,10 @@ "value": 0.0017, "units": "in" }, - "precipitation": [ - { - "observation_time": "2021-03-21T03:00:00Z", - "max": { - "value": 0.0011, - "units": "in/hr" - } - } - ], "precipitation_probability": { "value": 20, "units": "%" }, - "feels_like": [ - { - "observation_time": "2021-03-21T12:00:00Z", - "min": { - "value": 23.68, - "units": "F" - } - }, - { - "observation_time": "2021-03-21T21:00:00Z", - "max": { - "value": 44.3, - "units": "F" - } - } - ], - "humidity": [ - { - "observation_time": "2021-03-21T21:00:00Z", - "min": { - "value": 34.4, - "units": "%" - } - }, - { - "observation_time": "2021-03-21T03:00:00Z", - "max": { - "value": 73.1, - "units": "%" - } - } - ], - "baro_pressure": [ - { - "observation_time": "2021-03-21T03:00:00Z", - "min": { - "value": 30.15, - "units": "inHg" - } - }, - { - "observation_time": "2021-03-22T00:00:00Z", - "max": { - "value": 30.26, - "units": "inHg" - } - } - ], "wind_speed": [ { "observation_time": "2021-03-22T00:00:00Z", @@ -2143,28 +980,6 @@ } } ], - "visibility": [ - { - "observation_time": "2021-03-21T09:00:00Z", - "min": { - "value": 15, - "units": "mi" - } - }, - { - "observation_time": "2021-03-21T12:00:00Z", - "max": { - "value": 15, - "units": "mi" - } - } - ], - "sunrise": { - "value": "2021-03-21T11:08:57.528Z" - }, - "sunset": { - "value": "2021-03-21T23:20:52.627Z" - }, "weather_code": { "value": "cloudy" }, diff --git a/tests/fixtures/climacell/v3_forecast_hourly.json b/tests/fixtures/climacell/v3_forecast_hourly.json index 6578a7e0a38ec..a550c7f4302fc 100644 --- a/tests/fixtures/climacell/v3_forecast_hourly.json +++ b/tests/fixtures/climacell/v3_forecast_hourly.json @@ -3,1628 +3,300 @@ "lon": -77.03012, "lat": 38.90694, "temp": { - "value": 41.58, + "value": 42.75, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 41.58, - "units": "F" - }, - "humidity": { - "value": 26.79, - "units": "%" - }, - "baro_pressure": { - "value": 30.35, - "units": "inHg" - }, - "dewpoint": { - "value": 8.22, - "units": "F" - }, "wind_speed": { - "value": 6.98, - "units": "mph" - }, - "wind_gust": { - "value": 13.41, + "value": 8.99, "units": "mph" }, "wind_direction": { - "value": 315.38, + "value": 320.22, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "moon_phase": { - "value": "last_quarter" - }, "weather_code": { "value": "clear" }, "observation_time": { - "value": "2021-03-07T17:00:00.000Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "value": "2021-03-07T18:00:00.000Z" } }, { "lon": -77.03012, "lat": 38.90694, "temp": { - "value": 43.6, + "value": 44.29, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 43.6, - "units": "F" - }, - "humidity": { - "value": 23.21, - "units": "%" - }, - "baro_pressure": { - "value": 30.34, - "units": "inHg" - }, - "dewpoint": { - "value": 6.79, - "units": "F" - }, "wind_speed": { - "value": 9.29, - "units": "mph" - }, - "wind_gust": { - "value": 13.3, + "value": 9.65, "units": "mph" }, "wind_direction": { - "value": 315.14, + "value": 326.14, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "moon_phase": { - "value": "last_quarter" - }, "weather_code": { "value": "clear" }, "observation_time": { - "value": "2021-03-07T18:00:00.000Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "value": "2021-03-07T19:00:00.000Z" } }, { "lon": -77.03012, "lat": 38.90694, "temp": { - "value": 45.13, + "value": 45.3, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 45.13, - "units": "F" - }, - "humidity": { - "value": 19.34, - "units": "%" - }, - "baro_pressure": { - "value": 30.34, - "units": "inHg" - }, - "dewpoint": { - "value": 4.2, - "units": "F" - }, "wind_speed": { - "value": 8.74, - "units": "mph" - }, - "wind_gust": { - "value": 13.2, + "value": 9.28, "units": "mph" }, "wind_direction": { - "value": 321.71, + "value": 322.01, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 710.154, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "moon_phase": { - "value": "last_quarter" - }, "weather_code": { "value": "clear" }, "observation_time": { - "value": "2021-03-07T19:00:00.000Z" - }, - "epa_aqi": { - "value": 39.41585 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.571106 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 5.0204105, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 7.3341646, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.58481, - "units": "ppb" - }, - "no2": { - "value": 2.2947683, - "units": "ppb" - }, - "co": { - "value": 0.15286006, - "units": "ppm" - }, - "so2": { - "value": 0.9708922, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "value": "2021-03-07T20:00:00.000Z" } }, { "lon": -77.03012, "lat": 38.90694, "temp": { - "value": 45.93, + "value": 45.26, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 45.93, - "units": "F" - }, - "humidity": { - "value": 16.7, - "units": "%" - }, - "baro_pressure": { - "value": 30.35, - "units": "inHg" - }, - "dewpoint": { - "value": 1.99, - "units": "F" - }, "wind_speed": { - "value": 8.94, - "units": "mph" - }, - "wind_gust": { - "value": 12.43, + "value": 9.12, "units": "mph" }, "wind_direction": { - "value": 323.37, + "value": 323.71, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 574.154, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "clear" }, "observation_time": { - "value": "2021-03-07T20:00:00.000Z" - }, - "epa_aqi": { - "value": 39.580303 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.734327 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 5.0495143, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 7.3923726, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.899986, - "units": "ppb" - }, - "no2": { - "value": 2.5215073, - "units": "ppb" - }, - "co": { - "value": 0.15353242, - "units": "ppm" - }, - "so2": { - "value": 0.96701145, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" + "value": "2021-03-07T21:00:00.000Z" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 44.83, + "units": "F" }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" + "precipitation": { + "value": 0, + "units": "in/hr" }, - "road_risk_confidence": { - "value": 100, + "precipitation_probability": { + "value": 0, "units": "%" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "wind_speed": { + "value": 7.27, + "units": "mph" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 319.88, + "units": "degrees" }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" + "weather_code": { + "value": "clear" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "observation_time": { + "value": "2021-03-07T22:00:00.000Z" } }, { "lon": -77.03012, "lat": 38.90694, "temp": { - "value": 45.18, + "value": 41.7, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 45.18, - "units": "F" - }, - "humidity": { - "value": 16.67, - "units": "%" - }, - "baro_pressure": { - "value": 30.34, - "units": "inHg" - }, - "dewpoint": { - "value": 1.67, - "units": "F" - }, "wind_speed": { - "value": 9.49, - "units": "mph" - }, - "wind_gust": { - "value": 13.23, + "value": 4.37, "units": "mph" }, "wind_direction": { - "value": 318.43, + "value": 320.69, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 392.06396, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "clear" }, "observation_time": { - "value": "2021-03-07T21:00:00.000Z" - }, - "epa_aqi": { - "value": 39.66671 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.897547 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 5.0931697, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 7.4796834, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 44.215164, - "units": "ppb" - }, - "no2": { - "value": 2.7482464, - "units": "ppb" - }, - "co": { - "value": 0.15420479, - "units": "ppm" - }, - "so2": { - "value": 0.9631308, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" + "value": "2021-03-07T23:00:00.000Z" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 38.04, + "units": "F" }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" + "precipitation": { + "value": 0, + "units": "in/hr" }, - "road_risk_confidence": { - "value": 100, + "precipitation_probability": { + "value": 0, "units": "%" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "wind_speed": { + "value": 5.45, + "units": "mph" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 351.54, + "units": "degrees" }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" + "weather_code": { + "value": "clear" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "observation_time": { + "value": "2021-03-08T00:00:00.000Z" } }, { "lon": -77.03012, "lat": 38.90694, "temp": { - "value": 44.42, + "value": 35.88, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 44.42, - "units": "F" - }, - "humidity": { - "value": 18.27, - "units": "%" - }, - "baro_pressure": { - "value": 30.34, - "units": "inHg" - }, - "dewpoint": { - "value": 3.58, - "units": "F" - }, "wind_speed": { - "value": 7.7, - "units": "mph" - }, - "wind_gust": { - "value": 11.75, + "value": 5.31, "units": "mph" }, "wind_direction": { - "value": 320.9, + "value": 20.6, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 180.51251, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, - "weather_code": { - "value": "clear" - }, - "observation_time": { - "value": "2021-03-07T22:00:00.000Z" - }, - "epa_aqi": { - "value": 36.92238 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 16.534292 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 5.573383, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 8.178176, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 31.927721, - "units": "ppb" - }, - "no2": { - "value": 12.739268, - "units": "ppb" - }, - "co": { - "value": 0.2289039, - "units": "ppm" - }, - "so2": { - "value": 1.1788304, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - } - }, - { - "lon": -77.03012, - "lat": 38.90694, - "temp": { - "value": 41.33, - "units": "F" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "precipitation_type": { - "value": "none" - }, - "precipitation_probability": { - "value": 0, - "units": "%" - }, - "feels_like": { - "value": 41.33, - "units": "F" - }, - "humidity": { - "value": 20.88, - "units": "%" - }, - "baro_pressure": { - "value": 30.38, - "units": "inHg" - }, - "dewpoint": { - "value": 5.71, - "units": "F" - }, - "wind_speed": { - "value": 3.53, - "units": "mph" - }, - "wind_gust": { - "value": 9.94, - "units": "mph" - }, - "wind_direction": { - "value": 322.11, - "units": "degrees" - }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 2.3181324, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, - "weather_code": { - "value": "clear" - }, - "observation_time": { - "value": "2021-03-07T23:00:00.000Z" - }, - "epa_aqi": { - "value": 32.690754 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 18.051374 - }, - "china_primary_pollutant": { - "value": "no2" - }, - "pm25": { - "value": 10.41917, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 15.075783, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 19.640276, - "units": "ppb" - }, - "no2": { - "value": 22.730291, - "units": "ppb" - }, - "co": { - "value": 0.30360302, - "units": "ppm" - }, - "so2": { - "value": 1.3945299, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - } - }, - { - "lon": -77.03012, - "lat": 38.90694, - "temp": { - "value": 38.25, - "units": "F" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "precipitation_type": { - "value": "none" - }, - "precipitation_probability": { - "value": 0, - "units": "%" - }, - "feels_like": { - "value": 34.17, - "units": "F" - }, - "humidity": { - "value": 26.43, - "units": "%" - }, - "baro_pressure": { - "value": 30.37, - "units": "inHg" - }, - "dewpoint": { - "value": 9.44, - "units": "F" - }, - "wind_speed": { - "value": 5.31, - "units": "mph" - }, - "wind_gust": { - "value": 7.62, - "units": "mph" - }, - "wind_direction": { - "value": 295.94, - "units": "degrees" - }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 0, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, - "weather_code": { - "value": "clear" - }, - "observation_time": { - "value": "2021-03-08T00:00:00.000Z" - }, - "epa_aqi": { - "value": 49.333385 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 25.985796 - }, - "china_primary_pollutant": { - "value": "no2" - }, - "pm25": { - "value": 15.832482, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 22.817402, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 7.352833, - "units": "ppb" - }, - "no2": { - "value": 32.721313, - "units": "ppb" - }, - "co": { - "value": 0.37830213, - "units": "ppm" - }, - "so2": { - "value": 1.6102295, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - } - }, - { - "lon": -77.03012, - "lat": 38.90694, - "temp": { - "value": 35.66, - "units": "F" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "precipitation_type": { - "value": "none" - }, - "precipitation_probability": { - "value": 0, - "units": "%" - }, - "feels_like": { - "value": 30.82, - "units": "F" - }, - "humidity": { - "value": 28.46, - "units": "%" - }, - "baro_pressure": { - "value": 30.4, - "units": "inHg" - }, - "dewpoint": { - "value": 8.24, - "units": "F" - }, - "wind_speed": { - "value": 5.69, - "units": "mph" - }, - "wind_gust": { - "value": 9, - "units": "mph" - }, - "wind_direction": { - "value": 11.94, - "units": "degrees" - }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 0, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, - "weather_code": { - "value": "clear" + "weather_code": { + "value": "clear" }, "observation_time": { "value": "2021-03-08T01:00:00.000Z" - }, - "epa_aqi": { - "value": 54.983437 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 26.878548 - }, - "china_primary_pollutant": { - "value": "no2" - }, - "pm25": { - "value": 16.822012, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 24.214386, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 5.618587, - "units": "ppb" - }, - "no2": { - "value": 33.845467, - "units": "ppb" - }, - "co": { - "value": 0.39017758, - "units": "ppm" - }, - "so2": { - "value": 1.6278896, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" } }, { "lon": -77.03012, "lat": 38.90694, "temp": { - "value": 33.98, + "value": 34.34, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 28.93, - "units": "F" - }, - "humidity": { - "value": 33.01, - "units": "%" - }, - "baro_pressure": { - "value": 30.39, - "units": "inHg" - }, - "dewpoint": { - "value": 9.69, - "units": "F" - }, "wind_speed": { - "value": 5.56, - "units": "mph" - }, - "wind_gust": { - "value": 11.5, + "value": 5.78, "units": "mph" }, "wind_direction": { - "value": 13.68, + "value": 11.22, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 0, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "clear" }, "observation_time": { "value": "2021-03-08T02:00:00.000Z" - }, - "epa_aqi": { - "value": 58.082386 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 27.7713 - }, - "china_primary_pollutant": { - "value": "no2" - }, - "pm25": { - "value": 17.229465, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 24.796461, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 3.884342, - "units": "ppb" - }, - "no2": { - "value": 34.96962, - "units": "ppb" - }, - "co": { - "value": 0.40205303, - "units": "ppm" - }, - "so2": { - "value": 1.6455498, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" } }, { "lon": -77.03012, "lat": 38.90694, "temp": { - "value": 32.61, + "value": 33.3, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 27.45, - "units": "F" - }, - "humidity": { - "value": 38.8, - "units": "%" - }, - "baro_pressure": { - "value": 30.41, - "units": "inHg" - }, - "dewpoint": { - "value": 12.22, - "units": "F" - }, "wind_speed": { - "value": 5.39, - "units": "mph" - }, - "wind_gust": { - "value": 12.12, + "value": 5.73, "units": "mph" }, "wind_direction": { - "value": 14.92, + "value": 15.46, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 0, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "clear" }, "observation_time": { "value": "2021-03-08T03:00:00.000Z" - }, - "epa_aqi": { - "value": 61.062588 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 28.664051 - }, - "china_primary_pollutant": { - "value": "no2" - }, - "pm25": { - "value": 18.568241, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 26.659107, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 2.150097, - "units": "ppb" - }, - "no2": { - "value": 36.093773, - "units": "ppb" - }, - "co": { - "value": 0.41392848, - "units": "ppm" - }, - "so2": { - "value": 1.6632099, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" } }, { @@ -1638,1029 +310,203 @@ "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { - "value": 0, - "units": "%" - }, - "feels_like": { - "value": 27.31, - "units": "F" - }, - "humidity": { - "value": 43.64, - "units": "%" - }, - "baro_pressure": { - "value": 30.42, - "units": "inHg" - }, - "dewpoint": { - "value": 14.01, - "units": "F" - }, - "wind_speed": { - "value": 4.44, - "units": "mph" - }, - "wind_gust": { - "value": 10.4, - "units": "mph" - }, - "wind_direction": { - "value": 26.07, - "units": "degrees" - }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 0, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, - "weather_code": { - "value": "clear" - }, - "observation_time": { - "value": "2021-03-08T04:00:00.000Z" - }, - "epa_aqi": { - "value": 64.79185 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 29.685905 - }, - "china_primary_pollutant": { - "value": "pm10" - }, - "pm25": { - "value": 20.663717, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 29.685905, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 1.573819, - "units": "ppb" - }, - "no2": { - "value": 35.859207, - "units": "ppb" - }, - "co": { - "value": 0.43030822, - "units": "ppm" - }, - "so2": { - "value": 1.899448, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - } - }, - { - "lon": -77.03012, - "lat": 38.90694, - "temp": { - "value": 28.54, - "units": "F" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "precipitation_type": { - "value": "none" - }, - "precipitation_probability": { - "value": 0, - "units": "%" - }, - "feels_like": { - "value": 28.54, - "units": "F" - }, - "humidity": { - "value": 46.57, - "units": "%" - }, - "baro_pressure": { - "value": 30.43, - "units": "inHg" - }, - "dewpoint": { - "value": 13.96, - "units": "F" - }, - "wind_speed": { - "value": 2.16, - "units": "mph" - }, - "wind_gust": { - "value": 6.48, - "units": "mph" - }, - "wind_direction": { - "value": 51.27, - "units": "degrees" - }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 0, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, - "weather_code": { - "value": "clear" - }, - "observation_time": { - "value": "2021-03-08T05:00:00.000Z" - }, - "epa_aqi": { - "value": 69.08222 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 32.945534 - }, - "china_primary_pollutant": { - "value": "pm10" - }, - "pm25": { - "value": 22.933817, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 32.945534, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 0.9975411, - "units": "ppb" - }, - "no2": { - "value": 35.624638, - "units": "ppb" - }, - "co": { - "value": 0.44668797, - "units": "ppm" - }, - "so2": { - "value": 2.1356862, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - } - }, - { - "lon": -77.03012, - "lat": 38.90694, - "temp": { - "value": 27.08, - "units": "F" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "precipitation_type": { - "value": "none" - }, - "precipitation_probability": { - "value": 0, - "units": "%" - }, - "feels_like": { - "value": 22.87, - "units": "F" - }, - "humidity": { - "value": 49.49, - "units": "%" - }, - "baro_pressure": { - "value": 30.43, - "units": "inHg" - }, - "dewpoint": { - "value": 14.3, - "units": "F" - }, - "wind_speed": { - "value": 3.62, - "units": "mph" - }, - "wind_gust": { - "value": 6.08, - "units": "mph" - }, - "wind_direction": { - "value": 343.25, - "units": "degrees" - }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 0, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, - "weather_code": { - "value": "clear" - }, - "observation_time": { - "value": "2021-03-08T06:00:00.000Z" - }, - "epa_aqi": { - "value": 74.2753 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 36.903652 - }, - "china_primary_pollutant": { - "value": "pm10" - }, - "pm25": { - "value": 25.785992, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 36.903652, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 0.42126322, - "units": "ppb" - }, - "no2": { - "value": 35.39007, - "units": "ppb" - }, - "co": { - "value": 0.4630677, - "units": "ppm" - }, - "so2": { - "value": 2.3719242, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, + "value": 0, "units": "%" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "wind_speed": { + "value": 4.44, + "units": "mph" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 26.07, + "units": "degrees" }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" + "weather_code": { + "value": "clear" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "observation_time": { + "value": "2021-03-08T04:00:00.000Z" } }, { "lon": -77.03012, "lat": 38.90694, "temp": { - "value": 26.65, + "value": 29.98, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 21.36, - "units": "F" - }, - "humidity": { - "value": 52.83, - "units": "%" - }, - "baro_pressure": { - "value": 30.44, - "units": "inHg" - }, - "dewpoint": { - "value": 14.98, - "units": "F" - }, "wind_speed": { - "value": 4.46, - "units": "mph" - }, - "wind_gust": { - "value": 6.84, + "value": 4.33, "units": "mph" }, "wind_direction": { - "value": 341.46, + "value": 23.7, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 0, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "clear" }, "observation_time": { - "value": "2021-03-08T07:00:00.000Z" - }, - "epa_aqi": { - "value": 80.29285 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 41.560265 - }, - "china_primary_pollutant": { - "value": "pm10" - }, - "pm25": { - "value": 28.987413, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 41.560265, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 0.38954195, - "units": "ppb" - }, - "no2": { - "value": 34.47689, - "units": "ppb" - }, - "co": { - "value": 0.46904066, - "units": "ppm" - }, - "so2": { - "value": 2.4906406, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" + "value": "2021-03-08T05:00:00.000Z" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 27.34, + "units": "F" }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" + "precipitation": { + "value": 0, + "units": "in/hr" }, - "road_risk_confidence": { - "value": 100, + "precipitation_probability": { + "value": 0, "units": "%" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "wind_speed": { + "value": 4.7, + "units": "mph" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 354.56, + "units": "degrees" }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" + "weather_code": { + "value": "clear" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "observation_time": { + "value": "2021-03-08T06:00:00.000Z" } }, { "lon": -77.03012, "lat": 38.90694, "temp": { - "value": 26.33, + "value": 26.61, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 22.44, - "units": "F" - }, - "humidity": { - "value": 55.95, - "units": "%" - }, - "baro_pressure": { - "value": 30.44, - "units": "inHg" - }, - "dewpoint": { - "value": 15.89, - "units": "F" - }, "wind_speed": { - "value": 3.31, - "units": "mph" - }, - "wind_gust": { - "value": 5.48, + "value": 4.94, "units": "mph" }, "wind_direction": { - "value": 322.34, + "value": 349.63, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" + "weather_code": { + "value": "clear" }, - "cloud_base": { - "value": null, - "units": "ft" + "observation_time": { + "value": "2021-03-08T07:00:00.000Z" + } + }, + { + "lon": -77.03012, + "lat": 38.90694, + "temp": { + "value": 25.96, + "units": "F" }, - "surface_shortwave_radiation": { + "precipitation": { "value": 0, - "units": "w/sqm" + "units": "in/hr" }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" + "precipitation_probability": { + "value": 0, + "units": "%" }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" + "wind_speed": { + "value": 4.61, + "units": "mph" }, - "moon_phase": { - "value": "waning_crescent" + "wind_direction": { + "value": 336.74, + "units": "degrees" }, "weather_code": { "value": "clear" }, "observation_time": { "value": "2021-03-08T08:00:00.000Z" - }, - "epa_aqi": { - "value": 86.16294 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 45.401974 - }, - "china_primary_pollutant": { - "value": "pm10" - }, - "pm25": { - "value": 31.664965, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 45.401974, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 0.35782072, - "units": "ppb" - }, - "no2": { - "value": 33.56371, - "units": "ppb" - }, - "co": { - "value": 0.47501358, - "units": "ppm" - }, - "so2": { - "value": 2.6093574, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" } }, { "lon": -77.03012, "lat": 38.90694, "temp": { - "value": 26.12, + "value": 25.72, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 21.61, - "units": "F" - }, - "humidity": { - "value": 59.9, - "units": "%" - }, - "baro_pressure": { - "value": 30.45, - "units": "inHg" - }, - "dewpoint": { - "value": 17.27, - "units": "F" - }, "wind_speed": { - "value": 3.74, - "units": "mph" - }, - "wind_gust": { - "value": 4.74, + "value": 4.22, "units": "mph" }, "wind_direction": { - "value": 294.69, + "value": 332.71, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 0, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "clear" }, "observation_time": { "value": "2021-03-08T09:00:00.000Z" - }, - "epa_aqi": { - "value": 89.595604 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 45.984047 - }, - "china_primary_pollutant": { - "value": "pm10" - }, - "pm25": { - "value": 32.130627, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 45.984047, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 0.3260995, - "units": "ppb" - }, - "no2": { - "value": 32.650528, - "units": "ppb" - }, - "co": { - "value": 0.48098654, - "units": "ppm" - }, - "so2": { - "value": 2.7280738, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" } }, { "lon": -77.03012, "lat": 38.90694, "temp": { - "value": 31.08, + "value": 25.68, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 28.16, - "units": "F" - }, - "humidity": { - "value": 74.17, - "units": "%" - }, - "baro_pressure": { - "value": 30.47, - "units": "inHg" - }, - "dewpoint": { - "value": 24.76, - "units": "F" - }, "wind_speed": { - "value": 3.08, - "units": "mph" - }, - "wind_gust": { - "value": 5.45, + "value": 4.56, "units": "mph" }, "wind_direction": { - "value": 325.32, + "value": 328.58, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 0, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "clear" }, "observation_time": { "value": "2021-03-08T10:00:00.000Z" - }, - "epa_aqi": { - "value": 89.81894 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 44.00499 - }, - "china_primary_pollutant": { - "value": "pm10" - }, - "pm25": { - "value": 30.73364, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 44.00499, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 1.7127336, - "units": "ppb" - }, - "no2": { - "value": 31.258957, - "units": "ppb" - }, - "co": { - "value": 0.46572694, - "units": "ppm" - }, - "so2": { - "value": 2.5945883, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": null, - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": null, - "units": "%" - }, - "road_risk_conditions": { - "value": null, - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" } }, { @@ -2674,289 +520,53 @@ "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 31.02, - "units": "F" - }, - "humidity": { - "value": 75.36, - "units": "%" - }, - "baro_pressure": { - "value": 30.49, - "units": "inHg" - }, - "dewpoint": { - "value": 25.02, - "units": "F" - }, "wind_speed": { "value": 2.8, "units": "mph" }, - "wind_gust": { - "value": 5.9, - "units": "mph" - }, "wind_direction": { "value": 322.27, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 0, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "clear" }, "observation_time": { "value": "2021-03-08T11:00:00.000Z" - }, - "epa_aqi": { - "value": 89.30731 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 43.190083 - }, - "china_primary_pollutant": { - "value": "pm10" - }, - "pm25": { - "value": 30.151566, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 43.190083, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 3.0993679, - "units": "ppb" - }, - "no2": { - "value": 29.867388, - "units": "ppb" - }, - "co": { - "value": 0.45046738, - "units": "ppm" - }, - "so2": { - "value": 2.461103, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": null, - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": null, - "units": "%" - }, - "road_risk_conditions": { - "value": null, - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" } }, { - "lat": 38.90694, "lon": -77.03012, + "lat": 38.90694, "temp": { - "value": 26.28, + "value": 31.04, "units": "F" }, "precipitation": { "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 19.14, - "units": "F" - }, - "humidity": { - "value": 74.55, - "units": "%" - }, - "baro_pressure": { - "value": 30.5, - "units": "inHg" - }, - "dewpoint": { - "value": 19.31, - "units": "F" - }, "wind_speed": { - "value": 6.3, - "units": "mph" - }, - "wind_gust": { - "value": 11.68, + "value": 2.82, "units": "mph" }, "wind_direction": { - "value": 310.14, + "value": 325.27, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 1.56, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 0, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "clear" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { "value": "2021-03-08T12:00:00.000Z" - }, - "epa_aqi": { - "value": 89.370415 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 43.655743 - }, - "china_primary_pollutant": { - "value": "pm10" - }, - "pm25": { - "value": 30.50081, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 43.655743, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 4.486002, - "units": "ppb" - }, - "no2": { - "value": 28.475817, - "units": "ppb" - }, - "co": { - "value": 0.43520778, - "units": "ppm" - }, - "so2": { - "value": 2.3276174, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": null, - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": null, - "units": "%" - }, - "road_risk_conditions": { - "value": null, - "units": "ClimaCell Road Risk Conditions" } }, { @@ -2970,141 +580,23 @@ "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 22.82, - "units": "F" - }, - "humidity": { - "value": 65.05, - "units": "%" - }, - "baro_pressure": { - "value": 30.52, - "units": "inHg" - }, - "dewpoint": { - "value": 19.64, - "units": "F" - }, "wind_speed": { "value": 7.24, "units": "mph" }, - "wind_gust": { - "value": 15.38, - "units": "mph" - }, "wind_direction": { "value": 324.8, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 18.75, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 147.34, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "mostly_clear" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { "value": "2021-03-08T13:00:00.000Z" - }, - "epa_aqi": { - "value": 86.14332 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 38.99913 - }, - "china_primary_pollutant": { - "value": "pm10" - }, - "pm25": { - "value": 27.182976, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 38.99913, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 14.964584, - "units": "ppb" - }, - "no2": { - "value": 21.307568, - "units": "ppb" - }, - "co": { - "value": 0.36020884, - "units": "ppm" - }, - "so2": { - "value": 2.3993974, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": null, - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": null, - "units": "%" - }, - "road_risk_conditions": { - "value": null, - "units": "ClimaCell Road Risk Conditions" } }, { @@ -3118,141 +610,23 @@ "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 28.39, - "units": "F" - }, - "humidity": { - "value": 55.89, - "units": "%" - }, - "baro_pressure": { - "value": 30.52, - "units": "inHg" - }, - "dewpoint": { - "value": 19.94, - "units": "F" - }, "wind_speed": { "value": 6.28, "units": "mph" }, - "wind_gust": { - "value": 15.15, - "units": "mph" - }, "wind_direction": { "value": 335.16, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 42.19, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 349.58, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "partly_cloudy" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { "value": "2021-03-08T14:00:00.000Z" - }, - "epa_aqi": { - "value": 76.13227 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 25.960615 - }, - "china_primary_pollutant": { - "value": "pm10" - }, - "pm25": { - "value": 18.102581, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 25.960615, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 25.443167, - "units": "ppb" - }, - "no2": { - "value": 14.139319, - "units": "ppb" - }, - "co": { - "value": 0.28520986, - "units": "ppm" - }, - "so2": { - "value": 2.4711773, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": null, - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": null, - "units": "%" - }, - "road_risk_conditions": { - "value": null, - "units": "ClimaCell Road Risk Conditions" } }, { @@ -3266,141 +640,23 @@ "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 33.23, - "units": "F" - }, - "humidity": { - "value": 48.11, - "units": "%" - }, - "baro_pressure": { - "value": 30.52, - "units": "inHg" - }, - "dewpoint": { - "value": 19.92, - "units": "F" - }, "wind_speed": { "value": 5.8, "units": "mph" }, - "wind_gust": { - "value": 15.11, - "units": "mph" - }, "wind_direction": { "value": 324.49, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 84.38, - "units": "%" - }, - "cloud_ceiling": { - "value": 27290.35, - "units": "ft" - }, - "cloud_base": { - "value": 25980.47, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 535.61, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "cloudy" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { "value": "2021-03-08T15:00:00.000Z" - }, - "epa_aqi": { - "value": 61.3304 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 18.602667 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 11.146766, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 16.065313, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 35.92175, - "units": "ppb" - }, - "no2": { - "value": 6.9710712, - "units": "ppb" - }, - "co": { - "value": 0.21021092, - "units": "ppm" - }, - "so2": { - "value": 2.5429573, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": null, - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": null, - "units": "%" - }, - "road_risk_conditions": { - "value": null, - "units": "ClimaCell Road Risk Conditions" } }, { @@ -3414,141 +670,23 @@ "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 40.57, - "units": "F" - }, - "humidity": { - "value": 41.41, - "units": "%" - }, - "baro_pressure": { - "value": 30.51, - "units": "inHg" - }, - "dewpoint": { - "value": 18.96, - "units": "F" - }, "wind_speed": { "value": 5.5, "units": "mph" }, - "wind_gust": { - "value": 14.93, - "units": "mph" - }, "wind_direction": { "value": 310.68, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 74.22, - "units": "%" - }, - "cloud_ceiling": { - "value": 22565.84, - "units": "ft" - }, - "cloud_base": { - "value": 21612.75, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 656.5, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "mostly_cloudy" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { "value": "2021-03-08T16:00:00.000Z" - }, - "epa_aqi": { - "value": 52.542942 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 20.38958 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 9.080394, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 13.067619, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 39.37228, - "units": "ppb" - }, - "no2": { - "value": 5.853747, - "units": "ppb" - }, - "co": { - "value": 0.19491518, - "units": "ppm" - }, - "so2": { - "value": 2.3049417, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Moderate" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": null, - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": null, - "units": "%" - }, - "road_risk_conditions": { - "value": null, - "units": "ClimaCell Road Risk Conditions" } }, { @@ -3562,141 +700,53 @@ "value": 0, "units": "in/hr" }, - "precipitation_type": { - "value": "none" - }, "precipitation_probability": { "value": 0, "units": "%" }, - "feels_like": { - "value": 42.83, - "units": "F" - }, - "humidity": { - "value": 36.82, - "units": "%" - }, - "baro_pressure": { - "value": 30.5, - "units": "inHg" - }, - "dewpoint": { - "value": 18.26, - "units": "F" - }, "wind_speed": { "value": 5.47, "units": "mph" }, - "wind_gust": { - "value": 15.02, - "units": "mph" - }, "wind_direction": { "value": 304.18, "units": "degrees" }, - "visibility": { - "value": 9.94, - "units": "mi" - }, - "cloud_cover": { - "value": 33.59, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": 24056.89, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 720.78, - "units": "w/sqm" - }, - "sunrise": { - "value": "2021-03-08T11:29:11.454Z" - }, - "sunset": { - "value": "2021-03-08T23:07:58.495Z" - }, - "moon_phase": { - "value": "waning_crescent" - }, "weather_code": { "value": "mostly_clear" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { "value": "2021-03-08T17:00:00.000Z" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 45.07, + "units": "F" }, - "epa_aqi": { - "value": 52.542942 - }, - "epa_primary_pollutant": { - "value": "pm25" - }, - "china_aqi": { - "value": 20.38958 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 9.080394, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 13.067619, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 39.37228, - "units": "ppb" - }, - "no2": { - "value": 5.853747, - "units": "ppb" - }, - "co": { - "value": 0.19491518, - "units": "ppm" - }, - "so2": { - "value": 2.3049417, - "units": "ppb" + "precipitation": { + "value": 0, + "units": "in/hr" }, - "epa_health_concern": { - "value": "Moderate" + "precipitation_probability": { + "value": 0, + "units": "%" }, - "china_health_concern": { - "value": "Good" + "wind_speed": { + "value": 4.88, + "units": "mph" }, - "road_risk_score": { - "value": null, - "units": "ClimaCell Road Risk Score" + "wind_direction": { + "value": 301.19, + "units": "degrees" }, - "road_risk_confidence": { - "value": null, - "units": "%" + "weather_code": { + "value": "clear" }, - "road_risk_conditions": { - "value": null, - "units": "ClimaCell Road Risk Conditions" + "observation_time": { + "value": "2021-03-08T18:00:00.000Z" } } ] \ No newline at end of file diff --git a/tests/fixtures/climacell/v3_forecast_nowcast.json b/tests/fixtures/climacell/v3_forecast_nowcast.json index db62f1393f01a..23372eae0f942 100644 --- a/tests/fixtures/climacell/v3_forecast_nowcast.json +++ b/tests/fixtures/climacell/v3_forecast_nowcast.json @@ -3,138 +3,23 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.2, - "units": "F" - }, - "feels_like": { - "value": 43.2, - "units": "F" - }, - "dewpoint": { - "value": 7.07, + "value": 44.14, "units": "F" }, "wind_speed": { - "value": 8.84, + "value": 9.58, "units": "mph" }, - "wind_gust": { - "value": 13.32, - "units": "mph" - }, - "baro_pressure": { - "value": 30.3389, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "humidity": { - "value": 23.92, - "units": "%" - }, "wind_direction": { - "value": 315.38, + "value": 320.22, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { - "value": "2021-03-07T17:48:06.409Z" + "value": "2021-03-07T18:54:06.493Z" }, "weather_code": { "value": "clear" @@ -144,138 +29,23 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.23, - "units": "F" - }, - "feels_like": { - "value": 43.23, - "units": "F" - }, - "dewpoint": { - "value": 7.05, + "value": 44.17, "units": "F" }, "wind_speed": { - "value": 8.87, - "units": "mph" - }, - "wind_gust": { - "value": 13.32, + "value": 9.59, "units": "mph" }, - "baro_pressure": { - "value": 30.3387, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "humidity": { - "value": 23.86, - "units": "%" - }, "wind_direction": { - "value": 315.38, + "value": 320.22, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { - "value": "2021-03-07T17:49:06.409Z" + "value": "2021-03-07T18:55:06.493Z" }, "weather_code": { "value": "clear" @@ -285,138 +55,23 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.27, - "units": "F" - }, - "feels_like": { - "value": 43.27, - "units": "F" - }, - "dewpoint": { - "value": 7.03, + "value": 44.19, "units": "F" }, "wind_speed": { - "value": 8.91, - "units": "mph" - }, - "wind_gust": { - "value": 13.32, + "value": 9.6, "units": "mph" }, - "baro_pressure": { - "value": 30.3386, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "humidity": { - "value": 23.8, - "units": "%" - }, "wind_direction": { - "value": 315.38, + "value": 320.22, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { - "value": "2021-03-07T17:50:06.409Z" + "value": "2021-03-07T18:56:06.493Z" }, "weather_code": { "value": "clear" @@ -426,138 +81,23 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.3, - "units": "F" - }, - "feels_like": { - "value": 43.3, - "units": "F" - }, - "dewpoint": { - "value": 7, + "value": 44.22, "units": "F" }, "wind_speed": { - "value": 8.95, - "units": "mph" - }, - "wind_gust": { - "value": 13.32, + "value": 9.61, "units": "mph" }, - "baro_pressure": { - "value": 30.3384, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "humidity": { - "value": 23.74, - "units": "%" - }, "wind_direction": { - "value": 315.38, + "value": 320.22, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { - "value": "2021-03-07T17:51:06.409Z" + "value": "2021-03-07T18:57:06.493Z" }, "weather_code": { "value": "clear" @@ -567,138 +107,49 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.34, - "units": "F" - }, - "feels_like": { - "value": 43.34, - "units": "F" - }, - "dewpoint": { - "value": 6.98, + "value": 44.24, "units": "F" }, "wind_speed": { - "value": 8.99, + "value": 9.62, "units": "mph" }, - "wind_gust": { - "value": 13.31, - "units": "mph" - }, - "baro_pressure": { - "value": 30.3383, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "humidity": { - "value": 23.68, - "units": "%" - }, "wind_direction": { - "value": 315.38, + "value": 320.22, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" + "observation_time": { + "value": "2021-03-07T18:58:06.493Z" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 44.27, + "units": "F" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_speed": { + "value": 9.64, + "units": "mph" }, - "pollen_weed": { + "precipitation": { "value": 0, - "units": "Climacell Pollen Index" + "units": "in/hr" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 320.22, + "units": "degrees" }, "observation_time": { - "value": "2021-03-07T17:52:06.409Z" + "value": "2021-03-07T18:59:06.493Z" }, "weather_code": { "value": "clear" @@ -708,138 +159,49 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.37, - "units": "F" - }, - "feels_like": { - "value": 43.37, - "units": "F" - }, - "dewpoint": { - "value": 6.96, + "value": 44.29, "units": "F" }, "wind_speed": { - "value": 9.03, - "units": "mph" - }, - "wind_gust": { - "value": 13.31, + "value": 9.65, "units": "mph" }, - "baro_pressure": { - "value": 30.3381, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "humidity": { - "value": 23.62, - "units": "%" - }, "wind_direction": { - "value": 315.38, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" + "observation_time": { + "value": "2021-03-07T19:00:06.493Z" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 44.31, + "units": "F" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_speed": { + "value": 9.64, + "units": "mph" }, - "pollen_weed": { + "precipitation": { "value": 0, - "units": "Climacell Pollen Index" + "units": "in/hr" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 326.14, + "units": "degrees" }, "observation_time": { - "value": "2021-03-07T17:53:06.409Z" + "value": "2021-03-07T19:01:06.493Z" }, "weather_code": { "value": "clear" @@ -849,138 +211,23 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.4, - "units": "F" - }, - "feels_like": { - "value": 43.4, - "units": "F" - }, - "dewpoint": { - "value": 6.93, + "value": 44.33, "units": "F" }, "wind_speed": { - "value": 9.07, - "units": "mph" - }, - "wind_gust": { - "value": 13.31, + "value": 9.63, "units": "mph" }, - "baro_pressure": { - "value": 30.338, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "humidity": { - "value": 23.56, - "units": "%" - }, "wind_direction": { - "value": 315.38, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { - "value": "2021-03-07T17:54:06.409Z" + "value": "2021-03-07T19:02:06.493Z" }, "weather_code": { "value": "clear" @@ -990,138 +237,23 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.44, - "units": "F" - }, - "feels_like": { - "value": 43.44, - "units": "F" - }, - "dewpoint": { - "value": 6.91, + "value": 44.34, "units": "F" }, "wind_speed": { - "value": 9.11, - "units": "mph" - }, - "wind_gust": { - "value": 13.31, + "value": 9.63, "units": "mph" }, - "baro_pressure": { - "value": 30.3378, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "humidity": { - "value": 23.5, - "units": "%" - }, "wind_direction": { - "value": 315.38, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { - "value": "2021-03-07T17:55:06.409Z" + "value": "2021-03-07T19:03:06.493Z" }, "weather_code": { "value": "clear" @@ -1131,138 +263,49 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.47, - "units": "F" - }, - "feels_like": { - "value": 43.47, - "units": "F" - }, - "dewpoint": { - "value": 6.88, + "value": 44.36, "units": "F" }, "wind_speed": { - "value": 9.14, + "value": 9.62, "units": "mph" }, - "wind_gust": { - "value": 13.31, - "units": "mph" - }, - "baro_pressure": { - "value": 30.3377, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "humidity": { - "value": 23.44, - "units": "%" - }, "wind_direction": { - "value": 315.38, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" + "observation_time": { + "value": "2021-03-07T19:04:06.493Z" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 44.38, + "units": "F" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_speed": { + "value": 9.61, + "units": "mph" }, - "pollen_weed": { + "precipitation": { "value": 0, - "units": "Climacell Pollen Index" + "units": "in/hr" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 326.14, + "units": "degrees" }, "observation_time": { - "value": "2021-03-07T17:56:06.409Z" + "value": "2021-03-07T19:05:06.493Z" }, "weather_code": { "value": "clear" @@ -1272,138 +315,49 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.5, - "units": "F" - }, - "feels_like": { - "value": 43.5, - "units": "F" - }, - "dewpoint": { - "value": 6.86, + "value": 44.4, "units": "F" }, "wind_speed": { - "value": 9.18, - "units": "mph" - }, - "wind_gust": { - "value": 13.3, + "value": 9.61, "units": "mph" }, - "baro_pressure": { - "value": 30.3375, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "humidity": { - "value": 23.38, - "units": "%" - }, "wind_direction": { - "value": 315.38, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" + "observation_time": { + "value": "2021-03-07T19:06:06.493Z" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 44.41, + "units": "F" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_speed": { + "value": 9.6, + "units": "mph" }, - "pollen_weed": { + "precipitation": { "value": 0, - "units": "Climacell Pollen Index" + "units": "in/hr" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 326.14, + "units": "degrees" }, "observation_time": { - "value": "2021-03-07T17:57:06.409Z" + "value": "2021-03-07T19:07:06.493Z" }, "weather_code": { "value": "clear" @@ -1413,138 +367,49 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.54, - "units": "F" - }, - "feels_like": { - "value": 43.54, - "units": "F" - }, - "dewpoint": { - "value": 6.84, + "value": 44.43, "units": "F" }, "wind_speed": { - "value": 9.22, - "units": "mph" - }, - "wind_gust": { - "value": 13.3, + "value": 9.6, "units": "mph" }, - "baro_pressure": { - "value": 30.3374, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "humidity": { - "value": 23.32, - "units": "%" - }, "wind_direction": { - "value": 315.38, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" + "observation_time": { + "value": "2021-03-07T19:08:06.493Z" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 44.45, + "units": "F" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_speed": { + "value": 9.59, + "units": "mph" }, - "pollen_weed": { + "precipitation": { "value": 0, - "units": "Climacell Pollen Index" + "units": "in/hr" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 326.14, + "units": "degrees" }, "observation_time": { - "value": "2021-03-07T17:58:06.409Z" + "value": "2021-03-07T19:09:06.493Z" }, "weather_code": { "value": "clear" @@ -1554,138 +419,49 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.57, - "units": "F" - }, - "feels_like": { - "value": 43.57, - "units": "F" - }, - "dewpoint": { - "value": 6.81, + "value": 44.46, "units": "F" }, "wind_speed": { - "value": 9.26, - "units": "mph" - }, - "wind_gust": { - "value": 13.3, + "value": 9.58, "units": "mph" }, - "baro_pressure": { - "value": 30.3372, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5986, - "units": "w/sqm" - }, - "humidity": { - "value": 23.26, - "units": "%" - }, "wind_direction": { - "value": 315.38, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" + "observation_time": { + "value": "2021-03-07T19:10:06.493Z" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 44.48, + "units": "F" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_speed": { + "value": 9.58, + "units": "mph" }, - "pollen_weed": { + "precipitation": { "value": 0, - "units": "Climacell Pollen Index" + "units": "in/hr" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 326.14, + "units": "degrees" }, "observation_time": { - "value": "2021-03-07T17:59:06.409Z" + "value": "2021-03-07T19:11:06.493Z" }, "weather_code": { "value": "clear" @@ -1695,1407 +471,23 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.6, - "units": "F" - }, - "feels_like": { - "value": 43.6, - "units": "F" - }, - "dewpoint": { - "value": 6.79, + "value": 44.5, "units": "F" }, "wind_speed": { - "value": 9.29, + "value": 9.57, "units": "mph" }, - "wind_gust": { - "value": 13.3, - "units": "mph" - }, - "baro_pressure": { - "value": 30.3371, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 23.2, - "units": "%" - }, - "wind_direction": { - "value": 315.14, - "units": "degrees" - }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "observation_time": { - "value": "2021-03-07T18:00:06.409Z" - }, - "weather_code": { - "value": "clear" - } - }, - { - "lat": 38.90694, - "lon": -77.03012, - "temp": { - "value": 43.63, - "units": "F" - }, - "feels_like": { - "value": 43.63, - "units": "F" - }, - "dewpoint": { - "value": 6.74, - "units": "F" - }, - "wind_speed": { - "value": 9.28, - "units": "mph" - }, - "wind_gust": { - "value": 13.3, - "units": "mph" - }, - "baro_pressure": { - "value": 30.3371, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 23.14, - "units": "%" - }, - "wind_direction": { - "value": 315.14, - "units": "degrees" - }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "observation_time": { - "value": "2021-03-07T18:01:06.409Z" - }, - "weather_code": { - "value": "clear" - } - }, - { - "lat": 38.90694, - "lon": -77.03012, - "temp": { - "value": 43.65, - "units": "F" - }, - "feels_like": { - "value": 43.65, - "units": "F" - }, - "dewpoint": { - "value": 6.7, - "units": "F" - }, - "wind_speed": { - "value": 9.27, - "units": "mph" - }, - "wind_gust": { - "value": 13.29, - "units": "mph" - }, - "baro_pressure": { - "value": 30.3371, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 23.07, - "units": "%" - }, - "wind_direction": { - "value": 315.14, - "units": "degrees" - }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "observation_time": { - "value": "2021-03-07T18:02:06.409Z" - }, - "weather_code": { - "value": "clear" - } - }, - { - "lat": 38.90694, - "lon": -77.03012, - "temp": { - "value": 43.68, - "units": "F" - }, - "feels_like": { - "value": 43.68, - "units": "F" - }, - "dewpoint": { - "value": 6.66, - "units": "F" - }, - "wind_speed": { - "value": 9.27, - "units": "mph" - }, - "wind_gust": { - "value": 13.29, - "units": "mph" - }, - "baro_pressure": { - "value": 30.3371, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 23.01, - "units": "%" - }, - "wind_direction": { - "value": 315.14, - "units": "degrees" - }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "observation_time": { - "value": "2021-03-07T18:03:06.409Z" - }, - "weather_code": { - "value": "clear" - } - }, - { - "lat": 38.90694, - "lon": -77.03012, - "temp": { - "value": 43.71, - "units": "F" - }, - "feels_like": { - "value": 43.71, - "units": "F" - }, - "dewpoint": { - "value": 6.61, - "units": "F" - }, - "wind_speed": { - "value": 9.26, - "units": "mph" - }, - "wind_gust": { - "value": 13.29, - "units": "mph" - }, - "baro_pressure": { - "value": 30.337, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.94, - "units": "%" - }, - "wind_direction": { - "value": 315.14, - "units": "degrees" - }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "observation_time": { - "value": "2021-03-07T18:04:06.409Z" - }, - "weather_code": { - "value": "clear" - } - }, - { - "lat": 38.90694, - "lon": -77.03012, - "temp": { - "value": 43.73, - "units": "F" - }, - "feels_like": { - "value": 43.73, - "units": "F" - }, - "dewpoint": { - "value": 6.57, - "units": "F" - }, - "wind_speed": { - "value": 9.25, - "units": "mph" - }, - "wind_gust": { - "value": 13.29, - "units": "mph" - }, - "baro_pressure": { - "value": 30.337, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.88, - "units": "%" - }, - "wind_direction": { - "value": 315.14, - "units": "degrees" - }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "observation_time": { - "value": "2021-03-07T18:05:06.409Z" - }, - "weather_code": { - "value": "clear" - } - }, - { - "lat": 38.90694, - "lon": -77.03012, - "temp": { - "value": 43.76, - "units": "F" - }, - "feels_like": { - "value": 43.76, - "units": "F" - }, - "dewpoint": { - "value": 6.53, - "units": "F" - }, - "wind_speed": { - "value": 9.24, - "units": "mph" - }, - "wind_gust": { - "value": 13.29, - "units": "mph" - }, - "baro_pressure": { - "value": 30.337, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.81, - "units": "%" - }, - "wind_direction": { - "value": 315.14, - "units": "degrees" - }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "observation_time": { - "value": "2021-03-07T18:06:06.409Z" - }, - "weather_code": { - "value": "clear" - } - }, - { - "lat": 38.90694, - "lon": -77.03012, - "temp": { - "value": 43.78, - "units": "F" - }, - "feels_like": { - "value": 43.78, - "units": "F" - }, - "dewpoint": { - "value": 6.49, - "units": "F" - }, - "wind_speed": { - "value": 9.23, - "units": "mph" - }, - "wind_gust": { - "value": 13.29, - "units": "mph" - }, - "baro_pressure": { - "value": 30.337, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.75, - "units": "%" - }, - "wind_direction": { - "value": 315.14, - "units": "degrees" - }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "observation_time": { - "value": "2021-03-07T18:07:06.409Z" - }, - "weather_code": { - "value": "clear" - } - }, - { - "lat": 38.90694, - "lon": -77.03012, - "temp": { - "value": 43.81, - "units": "F" - }, - "feels_like": { - "value": 43.81, - "units": "F" - }, - "dewpoint": { - "value": 6.44, - "units": "F" - }, - "wind_speed": { - "value": 9.22, - "units": "mph" - }, - "wind_gust": { - "value": 13.29, - "units": "mph" - }, - "baro_pressure": { - "value": 30.337, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.68, - "units": "%" - }, - "wind_direction": { - "value": 315.14, - "units": "degrees" - }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "observation_time": { - "value": "2021-03-07T18:08:06.409Z" - }, - "weather_code": { - "value": "clear" - } - }, - { - "lat": 38.90694, - "lon": -77.03012, - "temp": { - "value": 43.83, - "units": "F" - }, - "feels_like": { - "value": 43.83, - "units": "F" - }, - "dewpoint": { - "value": 6.4, - "units": "F" - }, - "wind_speed": { - "value": 9.21, - "units": "mph" - }, - "wind_gust": { - "value": 13.28, - "units": "mph" - }, - "baro_pressure": { - "value": 30.337, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.62, - "units": "%" - }, "wind_direction": { - "value": 315.14, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { - "value": "2021-03-07T18:09:06.409Z" + "value": "2021-03-07T19:12:06.493Z" }, "weather_code": { "value": "clear" @@ -3105,138 +497,23 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.86, - "units": "F" - }, - "feels_like": { - "value": 43.86, - "units": "F" - }, - "dewpoint": { - "value": 6.36, + "value": 44.51, "units": "F" }, "wind_speed": { - "value": 9.2, + "value": 9.57, "units": "mph" }, - "wind_gust": { - "value": 13.28, - "units": "mph" - }, - "baro_pressure": { - "value": 30.337, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.55, - "units": "%" - }, "wind_direction": { - "value": 315.14, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { - "value": "2021-03-07T18:10:06.409Z" + "value": "2021-03-07T19:13:06.493Z" }, "weather_code": { "value": "clear" @@ -3246,138 +523,23 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.88, - "units": "F" - }, - "feels_like": { - "value": 43.88, - "units": "F" - }, - "dewpoint": { - "value": 6.31, + "value": 44.53, "units": "F" }, "wind_speed": { - "value": 9.19, - "units": "mph" - }, - "wind_gust": { - "value": 13.28, + "value": 9.56, "units": "mph" }, - "baro_pressure": { - "value": 30.337, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, - "units": "in/hr" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.49, - "units": "%" - }, - "wind_direction": { - "value": 315.14, - "units": "degrees" - }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" + "units": "in/hr" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 326.14, + "units": "degrees" }, "observation_time": { - "value": "2021-03-07T18:11:06.409Z" + "value": "2021-03-07T19:14:06.493Z" }, "weather_code": { "value": "clear" @@ -3387,138 +549,23 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.91, - "units": "F" - }, - "feels_like": { - "value": 43.91, - "units": "F" - }, - "dewpoint": { - "value": 6.27, + "value": 44.55, "units": "F" }, "wind_speed": { - "value": 9.18, + "value": 9.55, "units": "mph" }, - "wind_gust": { - "value": 13.28, - "units": "mph" - }, - "baro_pressure": { - "value": 30.337, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.43, - "units": "%" - }, "wind_direction": { - "value": 315.14, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { - "value": "2021-03-07T18:12:06.409Z" + "value": "2021-03-07T19:15:06.493Z" }, "weather_code": { "value": "clear" @@ -3528,138 +575,23 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.93, - "units": "F" - }, - "feels_like": { - "value": 43.93, - "units": "F" - }, - "dewpoint": { - "value": 6.23, + "value": 44.56, "units": "F" }, "wind_speed": { - "value": 9.17, - "units": "mph" - }, - "wind_gust": { - "value": 13.28, + "value": 9.55, "units": "mph" }, - "baro_pressure": { - "value": 30.337, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.36, - "units": "%" - }, "wind_direction": { - "value": 315.14, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { - "value": "2021-03-07T18:13:06.409Z" + "value": "2021-03-07T19:16:06.493Z" }, "weather_code": { "value": "clear" @@ -3669,138 +601,23 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.96, - "units": "F" - }, - "feels_like": { - "value": 43.96, - "units": "F" - }, - "dewpoint": { - "value": 6.18, + "value": 44.58, "units": "F" }, "wind_speed": { - "value": 9.16, - "units": "mph" - }, - "wind_gust": { - "value": 13.28, + "value": 9.54, "units": "mph" }, - "baro_pressure": { - "value": 30.3369, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.3, - "units": "%" - }, "wind_direction": { - "value": 315.14, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { - "value": "2021-03-07T18:14:06.409Z" + "value": "2021-03-07T19:17:06.493Z" }, "weather_code": { "value": "clear" @@ -3810,138 +627,49 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 43.99, - "units": "F" - }, - "feels_like": { - "value": 43.99, - "units": "F" - }, - "dewpoint": { - "value": 6.14, + "value": 44.6, "units": "F" }, "wind_speed": { - "value": 9.15, - "units": "mph" - }, - "wind_gust": { - "value": 13.27, + "value": 9.54, "units": "mph" }, - "baro_pressure": { - "value": 30.3369, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.23, - "units": "%" - }, "wind_direction": { - "value": 315.14, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" + "observation_time": { + "value": "2021-03-07T19:18:06.493Z" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 44.61, + "units": "F" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_speed": { + "value": 9.53, + "units": "mph" }, - "pollen_weed": { + "precipitation": { "value": 0, - "units": "Climacell Pollen Index" + "units": "in/hr" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 326.14, + "units": "degrees" }, "observation_time": { - "value": "2021-03-07T18:15:06.409Z" + "value": "2021-03-07T19:19:06.493Z" }, "weather_code": { "value": "clear" @@ -3951,138 +679,49 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 44.01, - "units": "F" - }, - "feels_like": { - "value": 44.01, - "units": "F" - }, - "dewpoint": { - "value": 6.1, + "value": 44.63, "units": "F" }, "wind_speed": { - "value": 9.15, - "units": "mph" - }, - "wind_gust": { - "value": 13.27, + "value": 9.52, "units": "mph" }, - "baro_pressure": { - "value": 30.3369, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.17, - "units": "%" - }, "wind_direction": { - "value": 315.14, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" + "observation_time": { + "value": "2021-03-07T19:20:06.493Z" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 44.65, + "units": "F" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_speed": { + "value": 9.52, + "units": "mph" }, - "pollen_weed": { + "precipitation": { "value": 0, - "units": "Climacell Pollen Index" + "units": "in/hr" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 326.14, + "units": "degrees" }, "observation_time": { - "value": "2021-03-07T18:16:06.409Z" + "value": "2021-03-07T19:21:06.493Z" }, "weather_code": { "value": "clear" @@ -4092,138 +731,49 @@ "lat": 38.90694, "lon": -77.03012, "temp": { - "value": 44.04, - "units": "F" - }, - "feels_like": { - "value": 44.04, - "units": "F" - }, - "dewpoint": { - "value": 6.05, + "value": 44.66, "units": "F" }, "wind_speed": { - "value": 9.14, - "units": "mph" - }, - "wind_gust": { - "value": 13.27, + "value": 9.51, "units": "mph" }, - "baro_pressure": { - "value": 30.3369, - "units": "inHg" - }, - "visibility": { - "value": 6.21371, - "units": "mi" - }, "precipitation": { "value": 0, "units": "in/hr" }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 787.18353, - "units": "w/sqm" - }, - "humidity": { - "value": 22.1, - "units": "%" - }, "wind_direction": { - "value": 315.14, + "value": 326.14, "units": "degrees" }, - "precipitation_type": { - "value": "none" - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "epa_aqi": { - "value": 38.39714 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 22.407887 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 4.4674377, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 6.5192575, - "units": "\u00b5g/m3" - }, - "o3": { - "value": 43.26963, - "units": "ppb" - }, - "no2": { - "value": 2.0680292, - "units": "ppb" - }, - "co": { - "value": 0.15218769, - "units": "ppm" - }, - "so2": { - "value": 0.9747729, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" + "observation_time": { + "value": "2021-03-07T19:22:06.493Z" }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" + "weather_code": { + "value": "clear" + } + }, + { + "lat": 38.90694, + "lon": -77.03012, + "temp": { + "value": 44.68, + "units": "F" }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" + "wind_speed": { + "value": 9.51, + "units": "mph" }, - "pollen_weed": { + "precipitation": { "value": 0, - "units": "Climacell Pollen Index" + "units": "in/hr" }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" + "wind_direction": { + "value": 326.14, + "units": "degrees" }, "observation_time": { - "value": "2021-03-07T18:17:06.409Z" + "value": "2021-03-07T19:23:06.493Z" }, "weather_code": { "value": "clear" diff --git a/tests/fixtures/climacell/v3_realtime.json b/tests/fixtures/climacell/v3_realtime.json index dca7f8bd6d049..8ed05fe538377 100644 --- a/tests/fixtures/climacell/v3_realtime.json +++ b/tests/fixtures/climacell/v3_realtime.json @@ -5,24 +5,12 @@ "value": 43.93, "units": "F" }, - "feels_like": { - "value": 43.93, - "units": "F" - }, - "dewpoint": { - "value": 9.95, - "units": "F" - }, "wind_speed": { - "value": 6.99, - "units": "mph" - }, - "wind_gust": { - "value": 13.42, + "value": 9.09, "units": "mph" }, "baro_pressure": { - "value": 30.3753, + "value": 30.3605, "units": "inHg" }, "visibility": { @@ -34,114 +22,17 @@ "units": "%" }, "wind_direction": { - "value": 315.81, + "value": 320.31, "units": "degrees" }, - "precipitation": { - "value": 0, - "units": "in/hr" - }, - "precipitation_type": { - "value": "none" - }, - "cloud_cover": { - "value": 0, - "units": "%" - }, - "cloud_ceiling": { - "value": null, - "units": "ft" - }, - "cloud_base": { - "value": null, - "units": "ft" - }, - "surface_shortwave_radiation": { - "value": 800.5, - "units": "w/sqm" - }, - "fire_index": { - "value": 16.375 - }, - "sunrise": { - "value": "2021-03-07T11:30:42.625Z" - }, - "sunset": { - "value": "2021-03-07T23:06:57.532Z" - }, - "moon_phase": { - "value": "last_quarter" - }, "weather_code": { "value": "clear" }, - "road_risk_score": { - "value": "Low risk", - "units": "ClimaCell Road Risk Score" - }, - "road_risk_confidence": { - "value": 100, - "units": "%" - }, - "road_risk_conditions": { - "value": "Clear", - "units": "ClimaCell Road Risk Conditions" - }, - "epa_aqi": { - "value": 36.625 - }, - "epa_primary_pollutant": { - "value": "o3" - }, - "china_aqi": { - "value": 26.375 - }, - "china_primary_pollutant": { - "value": "o3" - }, - "pm25": { - "value": 11.625, - "units": "\u00b5g/m3" - }, - "pm10": { - "value": 19.5625, - "units": "\u00b5g/m3" - }, "o3": { - "value": 51.4375, + "value": 52.625, "units": "ppb" }, - "no2": { - "value": 3.75, - "units": "ppb" - }, - "co": { - "value": 0.4375, - "units": "ppm" - }, - "so2": { - "value": 2.25, - "units": "ppb" - }, - "epa_health_concern": { - "value": "Good" - }, - "china_health_concern": { - "value": "Good" - }, - "pollen_tree": { - "value": 1, - "units": "Climacell Pollen Index" - }, - "pollen_weed": { - "value": 0, - "units": "Climacell Pollen Index" - }, - "pollen_grass": { - "value": 0, - "units": "Climacell Pollen Index" - }, "observation_time": { - "value": "2021-03-07T17:48:05.777Z" + "value": "2021-03-07T18:54:06.055Z" } } \ No newline at end of file From f127fbbb76cd54b99d3a288054ee5ddbe6c87367 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Sun, 7 Mar 2021 14:08:07 -0500 Subject: [PATCH 08/15] add _translate_condition method ot base class --- homeassistant/components/climacell/weather.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/homeassistant/components/climacell/weather.py b/homeassistant/components/climacell/weather.py index 48f712e74e83e..82a15e0625b39 100644 --- a/homeassistant/components/climacell/weather.py +++ b/homeassistant/components/climacell/weather.py @@ -96,6 +96,13 @@ async def async_setup_entry( class BaseClimaCellWeatherEntity(ClimaCellEntity, WeatherEntity): """Base ClimaCell weather entity.""" + @staticmethod + def _translate_condition( + condition: Optional[int], sun_is_up: bool = True + ) -> Optional[str]: + """Translate ClimaCell condition into an HA condition.""" + raise NotImplementedError() + def _forecast_dict( self, forecast_dt: datetime, From ace16384fb470aa823046e806bdb9bdecbf5d209 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Sun, 7 Mar 2021 16:19:02 -0500 Subject: [PATCH 09/15] bump pyclimacell again to fix bug --- homeassistant/components/climacell/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/climacell/manifest.json b/homeassistant/components/climacell/manifest.json index fd4440e9add0c..1df0b3613bba5 100644 --- a/homeassistant/components/climacell/manifest.json +++ b/homeassistant/components/climacell/manifest.json @@ -3,6 +3,6 @@ "name": "ClimaCell", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/climacell", - "requirements": ["pyclimacell==0.17.0"], + "requirements": ["pyclimacell==0.18.0"], "codeowners": ["@raman325"] } diff --git a/requirements_all.txt b/requirements_all.txt index 326067457362a..31b529bdbd2f2 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1308,7 +1308,7 @@ pychromecast==9.1.1 pycketcasts==1.0.0 # homeassistant.components.climacell -pyclimacell==0.17.0 +pyclimacell==0.18.0 # homeassistant.components.cmus pycmus==0.1.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index e4109dcc1f037..df826c7d66e35 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -688,7 +688,7 @@ pycfdns==1.2.1 pychromecast==9.1.1 # homeassistant.components.climacell -pyclimacell==0.17.0 +pyclimacell==0.18.0 # homeassistant.components.comfoconnect pycomfoconnect==0.4 From 28641b9787b69b580ad99a1dc5f73d281cf82867 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Thu, 18 Mar 2021 20:39:40 -0400 Subject: [PATCH 10/15] switch typehints back to new format --- homeassistant/components/climacell/weather.py | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/homeassistant/components/climacell/weather.py b/homeassistant/components/climacell/weather.py index a887530c64dbe..702b122467e79 100644 --- a/homeassistant/components/climacell/weather.py +++ b/homeassistant/components/climacell/weather.py @@ -3,7 +3,7 @@ from datetime import datetime import logging -from typing import Any, Callable, Optional, Union +from typing import Any, Callable from pyclimacell.const import CURRENT, DAILY, FORECASTS, HOURLY, NOWCAST, WeatherCode @@ -100,8 +100,8 @@ class BaseClimaCellWeatherEntity(ClimaCellEntity, WeatherEntity): @staticmethod def _translate_condition( - condition: Optional[int], sun_is_up: bool = True - ) -> Optional[str]: + condition: int | None, sun_is_up: bool = True + ) -> str | None: """Translate ClimaCell condition into an HA condition.""" raise NotImplementedError() @@ -110,13 +110,13 @@ def _forecast_dict( forecast_dt: datetime, use_datetime: bool, condition: str, - precipitation: Optional[float], - precipitation_probability: Optional[float], - temp: Optional[float], - temp_low: Optional[float], - wind_direction: Optional[float], - wind_speed: Optional[float], - ) -> Dict[str, Any]: + precipitation: float | None, + precipitation_probability: float | None, + temp: float | None, + temp_low: float | None, + wind_direction: float | None, + wind_speed: float | None, + ) -> dict[str, Any]: """Return formatted Forecast dict from ClimaCell forecast data.""" if use_datetime: translated_condition = self._translate_condition( @@ -155,8 +155,8 @@ class ClimaCellWeatherEntity(BaseClimaCellWeatherEntity): @staticmethod def _translate_condition( - condition: Optional[int], sun_is_up: bool = True - ) -> Optional[str]: + condition: int | None, sun_is_up: bool = True + ) -> str | None: """Translate ClimaCell condition into an HA condition.""" if condition is None: return None @@ -168,9 +168,7 @@ def _translate_condition( return CLEAR_CONDITIONS["night"] return CONDITIONS[condition] - def _get_current_property( - self, property_name: str - ) -> Optional[Union[int, str, float]]: + def _get_current_property(self, property_name: str) -> int | str | float | None: """Get property from current conditions.""" return self.coordinator.data.get(CURRENT, {}).get(property_name) @@ -302,8 +300,8 @@ class ClimaCellV3WeatherEntity(BaseClimaCellWeatherEntity): @staticmethod def _translate_condition( - condition: Optional[str], sun_is_up: bool = True - ) -> Optional[str]: + condition: str | None, sun_is_up: bool = True + ) -> str | None: """Translate ClimaCell condition into an HA condition.""" if not condition: return None From 8af7be26d4d581037714f1a9fa42a21ba5e3d825 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Thu, 18 Mar 2021 20:41:35 -0400 Subject: [PATCH 11/15] more typehint fixes --- homeassistant/components/climacell/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/climacell/__init__.py b/homeassistant/components/climacell/__init__.py index 495c11900e87c..9c659043cff5b 100644 --- a/homeassistant/components/climacell/__init__.py +++ b/homeassistant/components/climacell/__init__.py @@ -219,7 +219,7 @@ def __init__( self, hass: HomeAssistantType, config_entry: ConfigEntry, - api: Union[ClimaCellV3, ClimaCellV4], + api: ClimaCellV3 | ClimaCellV4, update_interval: timedelta, ) -> None: """Initialize.""" From 9e1e4ee9402aeddd1714bceebac3ade36e103e93 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Thu, 18 Mar 2021 21:25:52 -0400 Subject: [PATCH 12/15] fix tests --- tests/components/climacell/test_weather.py | 612 +++++++++++---------- 1 file changed, 307 insertions(+), 305 deletions(-) diff --git a/tests/components/climacell/test_weather.py b/tests/components/climacell/test_weather.py index 4f08a2b65be40..1f519caa6fa3e 100644 --- a/tests/components/climacell/test_weather.py +++ b/tests/components/climacell/test_weather.py @@ -1,8 +1,11 @@ """Tests for Climacell weather entity.""" +from datetime import datetime import logging from typing import Any, Dict +from unittest.mock import patch import pytest +import pytz from homeassistant.components.climacell.config_flow import ( _get_config_schema, @@ -57,324 +60,323 @@ async def _enable_entity(hass: HomeAssistantType, entity_name: str) -> None: async def _setup(hass: HomeAssistantType, config: Dict[str, Any]) -> State: """Set up entry and return entity state.""" - data = _get_config_schema(hass)(config) - config_entry = MockConfigEntry( - domain=DOMAIN, - data=data, - unique_id=_get_unique_id(hass, data), - version=2, - ) - config_entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(config_entry.entry_id) - await hass.async_block_till_done() - await _enable_entity(hass, "weather.climacell_hourly") - await _enable_entity(hass, "weather.climacell_nowcast") - assert await hass.config_entries.async_reload(config_entry.entry_id) - await hass.async_block_till_done() - assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 3 + with patch( + "homeassistant.util.dt.utcnow", + return_value=datetime(2021, 3, 6, 23, 59, 59, tzinfo=pytz.UTC), + ): + data = _get_config_schema(hass)(config) + config_entry = MockConfigEntry( + domain=DOMAIN, + data=data, + unique_id=_get_unique_id(hass, data), + version=2, + ) + config_entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + await _enable_entity(hass, "weather.climacell_hourly") + await _enable_entity(hass, "weather.climacell_nowcast") + await hass.async_block_till_done() + assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 3 return hass.states.get("weather.climacell_daily") -async def test_v3_load_and_unload( +async def test_v3_weather( hass: HomeAssistantType, climacell_config_entry_update: pytest.fixture, ) -> None: - """Test loading and unloading v3 entry.""" + """Test v3 weather data.""" weather_state = await _setup(hass, API_V3_ENTRY_DATA) assert weather_state.state == ATTR_CONDITION_SUNNY - assert weather_state.attributes == { - ATTR_ATTRIBUTION: ATTRIBUTION, - ATTR_FORECAST: [ - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_SUNNY, - ATTR_FORECAST_TIME: "2021-03-07T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, - ATTR_FORECAST_TEMP: 7, - ATTR_FORECAST_TEMP_LOW: -5, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, - ATTR_FORECAST_TIME: "2021-03-08T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, - ATTR_FORECAST_TEMP: 10, - ATTR_FORECAST_TEMP_LOW: -4, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, - ATTR_FORECAST_TIME: "2021-03-09T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, - ATTR_FORECAST_TEMP: 19, - ATTR_FORECAST_TEMP_LOW: 0, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, - ATTR_FORECAST_TIME: "2021-03-10T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, - ATTR_FORECAST_TEMP: 18, - ATTR_FORECAST_TEMP_LOW: 3, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, - ATTR_FORECAST_TIME: "2021-03-11T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 5, - ATTR_FORECAST_TEMP: 20, - ATTR_FORECAST_TEMP_LOW: 9, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, - ATTR_FORECAST_TIME: "2021-03-12T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0.04572, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25, - ATTR_FORECAST_TEMP: 20, - ATTR_FORECAST_TEMP_LOW: 12, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, - ATTR_FORECAST_TIME: "2021-03-13T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25, - ATTR_FORECAST_TEMP: 16, - ATTR_FORECAST_TEMP_LOW: 7, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_RAINY, - ATTR_FORECAST_TIME: "2021-03-14T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 1.07442, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 75, - ATTR_FORECAST_TEMP: 6, - ATTR_FORECAST_TEMP_LOW: 3, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_SNOWY, - ATTR_FORECAST_TIME: "2021-03-15T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 7.305040000000001, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 95, - ATTR_FORECAST_TEMP: 1, - ATTR_FORECAST_TEMP_LOW: 0, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, - ATTR_FORECAST_TIME: "2021-03-16T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0.00508, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 5, - ATTR_FORECAST_TEMP: 6, - ATTR_FORECAST_TEMP_LOW: -2, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, - ATTR_FORECAST_TIME: "2021-03-17T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, - ATTR_FORECAST_TEMP: 11, - ATTR_FORECAST_TEMP_LOW: 1, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, - ATTR_FORECAST_TIME: "2021-03-18T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 5, - ATTR_FORECAST_TEMP: 12, - ATTR_FORECAST_TEMP_LOW: 6, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, - ATTR_FORECAST_TIME: "2021-03-19T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0.1778, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 45, - ATTR_FORECAST_TEMP: 9, - ATTR_FORECAST_TEMP_LOW: 5, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_RAINY, - ATTR_FORECAST_TIME: "2021-03-20T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 1.2319, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 55, - ATTR_FORECAST_TEMP: 5, - ATTR_FORECAST_TEMP_LOW: 3, - }, - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, - ATTR_FORECAST_TIME: "2021-03-21T00:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0.043179999999999996, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 20, - ATTR_FORECAST_TEMP: 7, - ATTR_FORECAST_TEMP_LOW: 1, - }, - ], - ATTR_FRIENDLY_NAME: "ClimaCell - Daily", - ATTR_WEATHER_HUMIDITY: 24, - ATTR_WEATHER_OZONE: 52.625, - ATTR_WEATHER_PRESSURE: 1028.124632345, - ATTR_WEATHER_TEMPERATURE: 7, - ATTR_WEATHER_VISIBILITY: 9.994026240000002, - ATTR_WEATHER_WIND_BEARING: 320.31, - ATTR_WEATHER_WIND_SPEED: 14.62893696, - } + assert weather_state.attributes[ATTR_ATTRIBUTION] == ATTRIBUTION + assert weather_state.attributes[ATTR_FORECAST] == [ + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_SUNNY, + ATTR_FORECAST_TIME: "2021-03-07T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 7, + ATTR_FORECAST_TEMP_LOW: -5, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-08T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 10, + ATTR_FORECAST_TEMP_LOW: -4, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-09T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 19, + ATTR_FORECAST_TEMP_LOW: 0, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-10T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 18, + ATTR_FORECAST_TEMP_LOW: 3, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-11T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 5, + ATTR_FORECAST_TEMP: 20, + ATTR_FORECAST_TEMP_LOW: 9, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-12T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0.04572, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25, + ATTR_FORECAST_TEMP: 20, + ATTR_FORECAST_TEMP_LOW: 12, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-13T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25, + ATTR_FORECAST_TEMP: 16, + ATTR_FORECAST_TEMP_LOW: 7, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_RAINY, + ATTR_FORECAST_TIME: "2021-03-14T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 1.07442, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 75, + ATTR_FORECAST_TEMP: 6, + ATTR_FORECAST_TEMP_LOW: 3, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_SNOWY, + ATTR_FORECAST_TIME: "2021-03-15T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 7.305040000000001, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 95, + ATTR_FORECAST_TEMP: 1, + ATTR_FORECAST_TEMP_LOW: 0, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-16T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0.00508, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 5, + ATTR_FORECAST_TEMP: 6, + ATTR_FORECAST_TEMP_LOW: -2, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-17T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 11, + ATTR_FORECAST_TEMP_LOW: 1, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-18T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 5, + ATTR_FORECAST_TEMP: 12, + ATTR_FORECAST_TEMP_LOW: 6, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-19T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0.1778, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 45, + ATTR_FORECAST_TEMP: 9, + ATTR_FORECAST_TEMP_LOW: 5, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_RAINY, + ATTR_FORECAST_TIME: "2021-03-20T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 1.2319, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 55, + ATTR_FORECAST_TEMP: 5, + ATTR_FORECAST_TEMP_LOW: 3, + }, + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_CLOUDY, + ATTR_FORECAST_TIME: "2021-03-21T00:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0.043179999999999996, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 20, + ATTR_FORECAST_TEMP: 7, + ATTR_FORECAST_TEMP_LOW: 1, + }, + ] + assert weather_state.attributes[ATTR_FRIENDLY_NAME] == "ClimaCell - Daily" + assert weather_state.attributes[ATTR_WEATHER_HUMIDITY] == 24 + assert weather_state.attributes[ATTR_WEATHER_OZONE] == 52.625 + assert weather_state.attributes[ATTR_WEATHER_PRESSURE] == 1028.124632345 + assert weather_state.attributes[ATTR_WEATHER_TEMPERATURE] == 7 + assert weather_state.attributes[ATTR_WEATHER_VISIBILITY] == 9.994026240000002 + assert weather_state.attributes[ATTR_WEATHER_WIND_BEARING] == 320.31 + assert weather_state.attributes[ATTR_WEATHER_WIND_SPEED] == 14.62893696 -async def test_v4_load_and_unload( +async def test_v4_weather( hass: HomeAssistantType, climacell_config_entry_update: pytest.fixture, ) -> None: - """Test loading and unloading v3 entry.""" + """Test v4 weather data.""" weather_state = await _setup(hass, API_V4_ENTRY_DATA) assert weather_state.state == ATTR_CONDITION_SUNNY - assert weather_state.attributes == { - ATTR_ATTRIBUTION: ATTRIBUTION, - ATTR_FORECAST: [ - { - ATTR_FORECAST_CONDITION: ATTR_CONDITION_SUNNY, - ATTR_FORECAST_TIME: "2021-03-07T11:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, - ATTR_FORECAST_TEMP: 8, - ATTR_FORECAST_TEMP_LOW: -3, - ATTR_FORECAST_WIND_BEARING: 239.6, - ATTR_FORECAST_WIND_SPEED: 15.272674560000002, - }, - { - ATTR_FORECAST_CONDITION: "cloudy", - ATTR_FORECAST_TIME: "2021-03-08T11:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, - ATTR_FORECAST_TEMP: 10, - ATTR_FORECAST_TEMP_LOW: -3, - ATTR_FORECAST_WIND_BEARING: 262.82, - ATTR_FORECAST_WIND_SPEED: 11.65165056, - }, - { - ATTR_FORECAST_CONDITION: "cloudy", - ATTR_FORECAST_TIME: "2021-03-09T11:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, - ATTR_FORECAST_TEMP: 19, - ATTR_FORECAST_TEMP_LOW: 0, - ATTR_FORECAST_WIND_BEARING: 229.3, - ATTR_FORECAST_WIND_SPEED: 11.3458752, - }, - { - ATTR_FORECAST_CONDITION: "cloudy", - ATTR_FORECAST_TIME: "2021-03-10T11:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, - ATTR_FORECAST_TEMP: 18, - ATTR_FORECAST_TEMP_LOW: 3, - ATTR_FORECAST_WIND_BEARING: 149.91, - ATTR_FORECAST_WIND_SPEED: 17.123420160000002, - }, - { - ATTR_FORECAST_CONDITION: "cloudy", - ATTR_FORECAST_TIME: "2021-03-11T11:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, - ATTR_FORECAST_TEMP: 19, - ATTR_FORECAST_TEMP_LOW: 9, - ATTR_FORECAST_WIND_BEARING: 210.45, - ATTR_FORECAST_WIND_SPEED: 25.250607360000004, - }, - { - ATTR_FORECAST_CONDITION: "rainy", - ATTR_FORECAST_TIME: "2021-03-12T11:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0.12192000000000001, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25, - ATTR_FORECAST_TEMP: 20, - ATTR_FORECAST_TEMP_LOW: 12, - ATTR_FORECAST_WIND_BEARING: 217.98, - ATTR_FORECAST_WIND_SPEED: 19.794931200000004, - }, - { - ATTR_FORECAST_CONDITION: "cloudy", - ATTR_FORECAST_TIME: "2021-03-13T11:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25, - ATTR_FORECAST_TEMP: 12, - ATTR_FORECAST_TEMP_LOW: 6, - ATTR_FORECAST_WIND_BEARING: 58.79, - ATTR_FORECAST_WIND_SPEED: 15.642823680000001, - }, - { - ATTR_FORECAST_CONDITION: "snowy", - ATTR_FORECAST_TIME: "2021-03-14T10:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 23.95728, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 95, - ATTR_FORECAST_TEMP: 6, - ATTR_FORECAST_TEMP_LOW: 1, - ATTR_FORECAST_WIND_BEARING: 70.25, - ATTR_FORECAST_WIND_SPEED: 26.15184, - }, - { - ATTR_FORECAST_CONDITION: "snowy", - ATTR_FORECAST_TIME: "2021-03-15T10:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 1.46304, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 55, - ATTR_FORECAST_TEMP: 6, - ATTR_FORECAST_TEMP_LOW: -1, - ATTR_FORECAST_WIND_BEARING: 84.47, - ATTR_FORECAST_WIND_SPEED: 25.57247616, - }, - { - ATTR_FORECAST_CONDITION: "cloudy", - ATTR_FORECAST_TIME: "2021-03-16T10:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, - ATTR_FORECAST_TEMP: 6, - ATTR_FORECAST_TEMP_LOW: -2, - ATTR_FORECAST_WIND_BEARING: 103.85, - ATTR_FORECAST_WIND_SPEED: 10.79869824, - }, - { - ATTR_FORECAST_CONDITION: "cloudy", - ATTR_FORECAST_TIME: "2021-03-17T10:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, - ATTR_FORECAST_TEMP: 11, - ATTR_FORECAST_TEMP_LOW: 1, - ATTR_FORECAST_WIND_BEARING: 145.41, - ATTR_FORECAST_WIND_SPEED: 11.69993088, - }, - { - ATTR_FORECAST_CONDITION: "cloudy", - ATTR_FORECAST_TIME: "2021-03-18T10:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 0, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 10, - ATTR_FORECAST_TEMP: 12, - ATTR_FORECAST_TEMP_LOW: 5, - ATTR_FORECAST_WIND_BEARING: 62.99, - ATTR_FORECAST_WIND_SPEED: 10.58948352, - }, - { - ATTR_FORECAST_CONDITION: "rainy", - ATTR_FORECAST_TIME: "2021-03-19T10:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 2.92608, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 55, - ATTR_FORECAST_TEMP: 9, - ATTR_FORECAST_TEMP_LOW: 4, - ATTR_FORECAST_WIND_BEARING: 68.54, - ATTR_FORECAST_WIND_SPEED: 22.38597504, - }, - { - ATTR_FORECAST_CONDITION: "snowy", - ATTR_FORECAST_TIME: "2021-03-20T10:00:00+00:00", - ATTR_FORECAST_PRECIPITATION: 1.2192, - ATTR_FORECAST_PRECIPITATION_PROBABILITY: 33.3, - ATTR_FORECAST_TEMP: 5, - ATTR_FORECAST_TEMP_LOW: 2, - ATTR_FORECAST_WIND_BEARING: 56.98, - ATTR_FORECAST_WIND_SPEED: 27.922118400000002, - }, - ], - ATTR_FRIENDLY_NAME: "ClimaCell - Daily", - ATTR_WEATHER_HUMIDITY: 23, - ATTR_WEATHER_OZONE: 46.53, - ATTR_WEATHER_PRESSURE: 1027.7690615000001, - ATTR_WEATHER_TEMPERATURE: 7, - ATTR_WEATHER_VISIBILITY: 13.116153600000002, - ATTR_WEATHER_WIND_BEARING: 315.14, - ATTR_WEATHER_WIND_SPEED: 15.01517952, - } + assert weather_state.attributes[ATTR_ATTRIBUTION] == ATTRIBUTION + assert weather_state.attributes[ATTR_FORECAST] == [ + { + ATTR_FORECAST_CONDITION: ATTR_CONDITION_SUNNY, + ATTR_FORECAST_TIME: "2021-03-07T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 8, + ATTR_FORECAST_TEMP_LOW: -3, + ATTR_FORECAST_WIND_BEARING: 239.6, + ATTR_FORECAST_WIND_SPEED: 15.272674560000002, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-08T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 10, + ATTR_FORECAST_TEMP_LOW: -3, + ATTR_FORECAST_WIND_BEARING: 262.82, + ATTR_FORECAST_WIND_SPEED: 11.65165056, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-09T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 19, + ATTR_FORECAST_TEMP_LOW: 0, + ATTR_FORECAST_WIND_BEARING: 229.3, + ATTR_FORECAST_WIND_SPEED: 11.3458752, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-10T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 18, + ATTR_FORECAST_TEMP_LOW: 3, + ATTR_FORECAST_WIND_BEARING: 149.91, + ATTR_FORECAST_WIND_SPEED: 17.123420160000002, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-11T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 19, + ATTR_FORECAST_TEMP_LOW: 9, + ATTR_FORECAST_WIND_BEARING: 210.45, + ATTR_FORECAST_WIND_SPEED: 25.250607360000004, + }, + { + ATTR_FORECAST_CONDITION: "rainy", + ATTR_FORECAST_TIME: "2021-03-12T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0.12192000000000001, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25, + ATTR_FORECAST_TEMP: 20, + ATTR_FORECAST_TEMP_LOW: 12, + ATTR_FORECAST_WIND_BEARING: 217.98, + ATTR_FORECAST_WIND_SPEED: 19.794931200000004, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-13T11:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 25, + ATTR_FORECAST_TEMP: 12, + ATTR_FORECAST_TEMP_LOW: 6, + ATTR_FORECAST_WIND_BEARING: 58.79, + ATTR_FORECAST_WIND_SPEED: 15.642823680000001, + }, + { + ATTR_FORECAST_CONDITION: "snowy", + ATTR_FORECAST_TIME: "2021-03-14T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 23.95728, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 95, + ATTR_FORECAST_TEMP: 6, + ATTR_FORECAST_TEMP_LOW: 1, + ATTR_FORECAST_WIND_BEARING: 70.25, + ATTR_FORECAST_WIND_SPEED: 26.15184, + }, + { + ATTR_FORECAST_CONDITION: "snowy", + ATTR_FORECAST_TIME: "2021-03-15T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 1.46304, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 55, + ATTR_FORECAST_TEMP: 6, + ATTR_FORECAST_TEMP_LOW: -1, + ATTR_FORECAST_WIND_BEARING: 84.47, + ATTR_FORECAST_WIND_SPEED: 25.57247616, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-16T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 6, + ATTR_FORECAST_TEMP_LOW: -2, + ATTR_FORECAST_WIND_BEARING: 103.85, + ATTR_FORECAST_WIND_SPEED: 10.79869824, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-17T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 0, + ATTR_FORECAST_TEMP: 11, + ATTR_FORECAST_TEMP_LOW: 1, + ATTR_FORECAST_WIND_BEARING: 145.41, + ATTR_FORECAST_WIND_SPEED: 11.69993088, + }, + { + ATTR_FORECAST_CONDITION: "cloudy", + ATTR_FORECAST_TIME: "2021-03-18T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 0, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 10, + ATTR_FORECAST_TEMP: 12, + ATTR_FORECAST_TEMP_LOW: 5, + ATTR_FORECAST_WIND_BEARING: 62.99, + ATTR_FORECAST_WIND_SPEED: 10.58948352, + }, + { + ATTR_FORECAST_CONDITION: "rainy", + ATTR_FORECAST_TIME: "2021-03-19T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 2.92608, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 55, + ATTR_FORECAST_TEMP: 9, + ATTR_FORECAST_TEMP_LOW: 4, + ATTR_FORECAST_WIND_BEARING: 68.54, + ATTR_FORECAST_WIND_SPEED: 22.38597504, + }, + { + ATTR_FORECAST_CONDITION: "snowy", + ATTR_FORECAST_TIME: "2021-03-20T10:00:00+00:00", + ATTR_FORECAST_PRECIPITATION: 1.2192, + ATTR_FORECAST_PRECIPITATION_PROBABILITY: 33.3, + ATTR_FORECAST_TEMP: 5, + ATTR_FORECAST_TEMP_LOW: 2, + ATTR_FORECAST_WIND_BEARING: 56.98, + ATTR_FORECAST_WIND_SPEED: 27.922118400000002, + }, + ] + assert weather_state.attributes[ATTR_FRIENDLY_NAME] == "ClimaCell - Daily" + assert weather_state.attributes[ATTR_WEATHER_HUMIDITY] == 23 + assert weather_state.attributes[ATTR_WEATHER_OZONE] == 46.53 + assert weather_state.attributes[ATTR_WEATHER_PRESSURE] == 1027.7690615000001 + assert weather_state.attributes[ATTR_WEATHER_TEMPERATURE] == 7 + assert weather_state.attributes[ATTR_WEATHER_VISIBILITY] == 13.116153600000002 + assert weather_state.attributes[ATTR_WEATHER_WIND_BEARING] == 315.14 + assert weather_state.attributes[ATTR_WEATHER_WIND_SPEED] == 15.01517952 From 6e4fa8c8aecc1cdc69cdc267790614b4e9d59e5f Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Mon, 5 Apr 2021 01:09:13 -0400 Subject: [PATCH 13/15] revert merge conflict change --- homeassistant/components/climacell/__init__.py | 1 - homeassistant/components/climacell/config_flow.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/homeassistant/components/climacell/__init__.py b/homeassistant/components/climacell/__init__.py index 386faf8f8020a..5f55ca200a70e 100644 --- a/homeassistant/components/climacell/__init__.py +++ b/homeassistant/components/climacell/__init__.py @@ -25,7 +25,6 @@ CONF_LONGITUDE, CONF_NAME, ) -from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.typing import HomeAssistantType from homeassistant.helpers.update_coordinator import ( diff --git a/homeassistant/components/climacell/config_flow.py b/homeassistant/components/climacell/config_flow.py index da211dca18235..48022ac417d5b 100644 --- a/homeassistant/components/climacell/config_flow.py +++ b/homeassistant/components/climacell/config_flow.py @@ -32,8 +32,8 @@ CONF_TIMESTEP, DEFAULT_NAME, DEFAULT_TIMESTEP, + DOMAIN, ) -from .const import DOMAIN # pylint: disable=unused-import _LOGGER = logging.getLogger(__name__) From 7d3a602530108d7b17c09280e881f5e49fa0e2f8 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Mon, 5 Apr 2021 10:19:14 -0400 Subject: [PATCH 14/15] handle 'migration' in async_setup_entry so we don't have to bump config entry versions --- .../components/climacell/__init__.py | 74 +++++++------------ .../components/climacell/config_flow.py | 2 +- .../components/climacell/test_config_flow.py | 2 +- tests/components/climacell/test_init.py | 12 +-- tests/components/climacell/test_weather.py | 2 +- 5 files changed, 36 insertions(+), 56 deletions(-) diff --git a/homeassistant/components/climacell/__init__.py b/homeassistant/components/climacell/__init__.py index 5f55ca200a70e..8095f7991bde5 100644 --- a/homeassistant/components/climacell/__init__.py +++ b/homeassistant/components/climacell/__init__.py @@ -106,14 +106,35 @@ async def async_setup_entry(hass: HomeAssistantType, config_entry: ConfigEntry) """Set up ClimaCell API from a config entry.""" hass.data.setdefault(DOMAIN, {}) + params = {} # If config entry options not set up, set them up if not config_entry.options: - hass.config_entries.async_update_entry( - config_entry, - options={ - CONF_TIMESTEP: DEFAULT_TIMESTEP, - }, - ) + params["options"] = { + CONF_TIMESTEP: DEFAULT_TIMESTEP, + } + else: + # Use valid timestep if it's invalid + timestep = config_entry.options[CONF_TIMESTEP] + if timestep not in (1, 5, 15, 30): + if timestep <= 2: + timestep = 1 + elif timestep <= 7: + timestep = 5 + elif timestep <= 20: + timestep = 15 + else: + timestep = 30 + new_options = config_entry.options.copy() + new_options[CONF_TIMESTEP] = timestep + params["options"] = new_options + # Add API version if not found + if CONF_API_VERSION not in config_entry.data: + new_data = config_entry.data.copy() + new_data[CONF_API_VERSION] = 3 + params["data"] = new_data + + if params: + hass.config_entries.async_update_entry(config_entry, **params) api_class = ClimaCellV3 if config_entry.data[CONF_API_VERSION] == 3 else ClimaCellV4 api = api_class( @@ -162,47 +183,6 @@ async def async_unload_entry( return unload_ok -async def async_migrate_entry( - hass: HomeAssistantType, config_entry: ConfigEntry -) -> bool: - """Migrate old entry.""" - version = config_entry.version - - _LOGGER.debug("Migrating from version %s", version) - - # 1 -> 2: Added new config key to support multiple API versions and limited nowcast timesteps - if version == 1: - params = {} - - # Add API version if not found - if CONF_API_VERSION not in config_entry.data: - new_data = config_entry.data.copy() - new_data[CONF_API_VERSION] = 3 - params["data"] = new_data - - # Use valid timestep if it's invalid - timestep = config_entry.options[CONF_TIMESTEP] - if timestep not in (1, 5, 15, 30): - if timestep <= 2: - timestep = 1 - elif timestep <= 7: - timestep = 5 - elif timestep <= 20: - timestep = 15 - else: - timestep = 30 - new_options = config_entry.options.copy() - new_options[CONF_TIMESTEP] = timestep - params["options"] = new_options - - version = config_entry.version = 2 - hass.config_entries.async_update_entry(config_entry, **params) - - _LOGGER.info("Migration to version %s successful", version) - - return True - - class ClimaCellDataUpdateCoordinator(DataUpdateCoordinator): """Define an object to hold ClimaCell data.""" diff --git a/homeassistant/components/climacell/config_flow.py b/homeassistant/components/climacell/config_flow.py index 48022ac417d5b..1457479e62aca 100644 --- a/homeassistant/components/climacell/config_flow.py +++ b/homeassistant/components/climacell/config_flow.py @@ -110,7 +110,7 @@ async def async_step_init( class ClimaCellConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): """Handle a config flow for ClimaCell Weather API.""" - VERSION = 2 + VERSION = 1 CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL @staticmethod diff --git a/tests/components/climacell/test_config_flow.py b/tests/components/climacell/test_config_flow.py index 0ac1c92caf580..6cd5fb8579437 100644 --- a/tests/components/climacell/test_config_flow.py +++ b/tests/components/climacell/test_config_flow.py @@ -177,7 +177,7 @@ async def test_options_flow(hass: HomeAssistantType) -> None: data=user_config, source=SOURCE_USER, unique_id=_get_unique_id(hass, user_config), - version=2, + version=1, ) entry.add_to_hass(hass) diff --git a/tests/components/climacell/test_init.py b/tests/components/climacell/test_init.py index 622948237ff5f..cdb89852dfe60 100644 --- a/tests/components/climacell/test_init.py +++ b/tests/components/climacell/test_init.py @@ -29,7 +29,7 @@ async def test_load_and_unload( domain=DOMAIN, data=data, unique_id=_get_unique_id(hass, data), - version=2, + version=1, ) config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) @@ -51,7 +51,7 @@ async def test_v3_load_and_unload( domain=DOMAIN, data=data, unique_id=_get_unique_id(hass, data), - version=2, + version=1, ) config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) @@ -78,7 +78,7 @@ async def test_migrate_timestep_1( config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() - assert config_entry.version == 2 + assert config_entry.version == 1 assert ( CONF_API_VERSION in config_entry.data and config_entry.data[CONF_API_VERSION] == 3 @@ -101,7 +101,7 @@ async def test_migrate_timestep_5( config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() - assert config_entry.version == 2 + assert config_entry.version == 1 assert ( CONF_API_VERSION in config_entry.data and config_entry.data[CONF_API_VERSION] == 3 @@ -124,7 +124,7 @@ async def test_migrate_timestep_15( config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() - assert config_entry.version == 2 + assert config_entry.version == 1 assert ( CONF_API_VERSION in config_entry.data and config_entry.data[CONF_API_VERSION] == 3 @@ -147,7 +147,7 @@ async def test_migrate_timestep_30( config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() - assert config_entry.version == 2 + assert config_entry.version == 1 assert ( CONF_API_VERSION in config_entry.data and config_entry.data[CONF_API_VERSION] == 3 diff --git a/tests/components/climacell/test_weather.py b/tests/components/climacell/test_weather.py index 1f519caa6fa3e..c49ad8b3c484c 100644 --- a/tests/components/climacell/test_weather.py +++ b/tests/components/climacell/test_weather.py @@ -69,7 +69,7 @@ async def _setup(hass: HomeAssistantType, config: Dict[str, Any]) -> State: domain=DOMAIN, data=data, unique_id=_get_unique_id(hass, data), - version=2, + version=1, ) config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) From 47fa508ffba24fb8782337e0396467c24ee41a13 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Mon, 5 Apr 2021 12:43:22 -0400 Subject: [PATCH 15/15] parametrize timestep test --- tests/components/climacell/test_init.py | 82 +++---------------------- 1 file changed, 9 insertions(+), 73 deletions(-) diff --git a/tests/components/climacell/test_init.py b/tests/components/climacell/test_init.py index cdb89852dfe60..33a18d553f34a 100644 --- a/tests/components/climacell/test_init.py +++ b/tests/components/climacell/test_init.py @@ -63,84 +63,20 @@ async def test_v3_load_and_unload( assert len(hass.states.async_entity_ids(WEATHER_DOMAIN)) == 0 -async def test_migrate_timestep_1( - hass: HomeAssistantType, - climacell_config_entry_update: pytest.fixture, -) -> None: - """Test migration to timestep 1.""" - config_entry = MockConfigEntry( - domain=DOMAIN, - data=V1_ENTRY_DATA, - options={CONF_TIMESTEP: 2}, - unique_id=_get_unique_id(hass, V1_ENTRY_DATA), - version=1, - ) - config_entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(config_entry.entry_id) - await hass.async_block_till_done() - assert config_entry.version == 1 - assert ( - CONF_API_VERSION in config_entry.data - and config_entry.data[CONF_API_VERSION] == 3 - ) - assert config_entry.options[CONF_TIMESTEP] == 1 - - -async def test_migrate_timestep_5( - hass: HomeAssistantType, - climacell_config_entry_update: pytest.fixture, -) -> None: - """Test migration to timestep 5.""" - config_entry = MockConfigEntry( - domain=DOMAIN, - data=V1_ENTRY_DATA, - options={CONF_TIMESTEP: 7}, - unique_id=_get_unique_id(hass, V1_ENTRY_DATA), - version=1, - ) - config_entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(config_entry.entry_id) - await hass.async_block_till_done() - assert config_entry.version == 1 - assert ( - CONF_API_VERSION in config_entry.data - and config_entry.data[CONF_API_VERSION] == 3 - ) - assert config_entry.options[CONF_TIMESTEP] == 5 - - -async def test_migrate_timestep_15( - hass: HomeAssistantType, - climacell_config_entry_update: pytest.fixture, -) -> None: - """Test migration to timestep 15.""" - config_entry = MockConfigEntry( - domain=DOMAIN, - data=V1_ENTRY_DATA, - options={CONF_TIMESTEP: 20}, - unique_id=_get_unique_id(hass, V1_ENTRY_DATA), - version=1, - ) - config_entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(config_entry.entry_id) - await hass.async_block_till_done() - assert config_entry.version == 1 - assert ( - CONF_API_VERSION in config_entry.data - and config_entry.data[CONF_API_VERSION] == 3 - ) - assert config_entry.options[CONF_TIMESTEP] == 15 - - -async def test_migrate_timestep_30( +@pytest.mark.parametrize( + "old_timestep, new_timestep", [(2, 1), (7, 5), (20, 15), (21, 30)] +) +async def test_migrate_timestep( hass: HomeAssistantType, climacell_config_entry_update: pytest.fixture, + old_timestep: int, + new_timestep: int, ) -> None: - """Test migration to timestep 30.""" + """Test migration to standardized timestep.""" config_entry = MockConfigEntry( domain=DOMAIN, data=V1_ENTRY_DATA, - options={CONF_TIMESTEP: 21}, + options={CONF_TIMESTEP: old_timestep}, unique_id=_get_unique_id(hass, V1_ENTRY_DATA), version=1, ) @@ -152,4 +88,4 @@ async def test_migrate_timestep_30( CONF_API_VERSION in config_entry.data and config_entry.data[CONF_API_VERSION] == 3 ) - assert config_entry.options[CONF_TIMESTEP] == 30 + assert config_entry.options[CONF_TIMESTEP] == new_timestep