Add new attributes to Climacell (#48707)

* Add new attributes to Climacell

* fix logic

* test new properties
This commit is contained in:
Raman Gupta 2021-04-11 05:59:42 -04:00 committed by GitHub
parent e38fce98c4
commit 34a1dd4120
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 139 additions and 4 deletions

View file

@ -35,28 +35,34 @@ from homeassistant.helpers.update_coordinator import (
from .const import (
ATTRIBUTION,
CC_ATTR_CLOUD_COVER,
CC_ATTR_CONDITION,
CC_ATTR_HUMIDITY,
CC_ATTR_OZONE,
CC_ATTR_PRECIPITATION,
CC_ATTR_PRECIPITATION_PROBABILITY,
CC_ATTR_PRECIPITATION_TYPE,
CC_ATTR_PRESSURE,
CC_ATTR_TEMPERATURE,
CC_ATTR_TEMPERATURE_HIGH,
CC_ATTR_TEMPERATURE_LOW,
CC_ATTR_VISIBILITY,
CC_ATTR_WIND_DIRECTION,
CC_ATTR_WIND_GUST,
CC_ATTR_WIND_SPEED,
CC_V3_ATTR_CLOUD_COVER,
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_PRECIPITATION_TYPE,
CC_V3_ATTR_PRESSURE,
CC_V3_ATTR_TEMPERATURE,
CC_V3_ATTR_VISIBILITY,
CC_V3_ATTR_WIND_DIRECTION,
CC_V3_ATTR_WIND_GUST,
CC_V3_ATTR_WIND_SPEED,
CONF_TIMESTEP,
DEFAULT_FORECAST_TYPE,
@ -223,6 +229,9 @@ class ClimaCellDataUpdateCoordinator(DataUpdateCoordinator):
CC_V3_ATTR_CONDITION,
CC_V3_ATTR_VISIBILITY,
CC_V3_ATTR_OZONE,
CC_V3_ATTR_WIND_GUST,
CC_V3_ATTR_CLOUD_COVER,
CC_V3_ATTR_PRECIPITATION_TYPE,
]
)
data[FORECASTS][HOURLY] = await self._api.forecast_hourly(
@ -276,6 +285,9 @@ class ClimaCellDataUpdateCoordinator(DataUpdateCoordinator):
CC_ATTR_CONDITION,
CC_ATTR_VISIBILITY,
CC_ATTR_OZONE,
CC_ATTR_WIND_GUST,
CC_ATTR_CLOUD_COVER,
CC_ATTR_PRECIPITATION_TYPE,
],
[
CC_ATTR_TEMPERATURE_LOW,

View file

@ -35,6 +35,11 @@ MAX_FORECASTS = {
NOWCAST: 30,
}
# Additional attributes
ATTR_WIND_GUST = "wind_gust"
ATTR_CLOUD_COVER = "cloud_cover"
ATTR_PRECIPITATION_TYPE = "precipitation_type"
# V4 constants
CONDITIONS = {
WeatherCode.WIND: ATTR_CONDITION_WINDY,
@ -76,6 +81,9 @@ CC_ATTR_CONDITION = "weatherCode"
CC_ATTR_VISIBILITY = "visibility"
CC_ATTR_PRECIPITATION = "precipitationIntensityAvg"
CC_ATTR_PRECIPITATION_PROBABILITY = "precipitationProbability"
CC_ATTR_WIND_GUST = "windGust"
CC_ATTR_CLOUD_COVER = "cloudCover"
CC_ATTR_PRECIPITATION_TYPE = "precipitationType"
# V3 constants
CONDITIONS_V3 = {
@ -117,3 +125,6 @@ CC_V3_ATTR_VISIBILITY = "visibility"
CC_V3_ATTR_PRECIPITATION = "precipitation"
CC_V3_ATTR_PRECIPITATION_DAILY = "precipitation_accumulation"
CC_V3_ATTR_PRECIPITATION_PROBABILITY = "precipitation_probability"
CC_V3_ATTR_WIND_GUST = "wind_gust"
CC_V3_ATTR_CLOUD_COVER = "cloud_cover"
CC_V3_ATTR_PRECIPITATION_TYPE = "precipitation_type"

View file

@ -3,9 +3,17 @@ from __future__ import annotations
from datetime import datetime
import logging
from typing import Any, Callable
from typing import Any, Callable, Mapping
from pyclimacell.const import CURRENT, DAILY, FORECASTS, HOURLY, NOWCAST, WeatherCode
from pyclimacell.const import (
CURRENT,
DAILY,
FORECASTS,
HOURLY,
NOWCAST,
PrecipitationType,
WeatherCode,
)
from homeassistant.components.weather import (
ATTR_FORECAST_CONDITION,
@ -38,11 +46,16 @@ from homeassistant.util.pressure import convert as pressure_convert
from . import ClimaCellEntity
from .const import (
ATTR_CLOUD_COVER,
ATTR_PRECIPITATION_TYPE,
ATTR_WIND_GUST,
CC_ATTR_CLOUD_COVER,
CC_ATTR_CONDITION,
CC_ATTR_HUMIDITY,
CC_ATTR_OZONE,
CC_ATTR_PRECIPITATION,
CC_ATTR_PRECIPITATION_PROBABILITY,
CC_ATTR_PRECIPITATION_TYPE,
CC_ATTR_PRESSURE,
CC_ATTR_TEMPERATURE,
CC_ATTR_TEMPERATURE_HIGH,
@ -50,13 +63,16 @@ from .const import (
CC_ATTR_TIMESTAMP,
CC_ATTR_VISIBILITY,
CC_ATTR_WIND_DIRECTION,
CC_ATTR_WIND_GUST,
CC_ATTR_WIND_SPEED,
CC_V3_ATTR_CLOUD_COVER,
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_PRECIPITATION_TYPE,
CC_V3_ATTR_PRESSURE,
CC_V3_ATTR_TEMPERATURE,
CC_V3_ATTR_TEMPERATURE_HIGH,
@ -64,6 +80,7 @@ from .const import (
CC_V3_ATTR_TIMESTAMP,
CC_V3_ATTR_VISIBILITY,
CC_V3_ATTR_WIND_DIRECTION,
CC_V3_ATTR_WIND_GUST,
CC_V3_ATTR_WIND_SPEED,
CLEAR_CONDITIONS,
CONDITIONS,
@ -149,6 +166,38 @@ class BaseClimaCellWeatherEntity(ClimaCellEntity, WeatherEntity):
return {k: v for k, v in data.items() if v is not None}
@property
def extra_state_attributes(self) -> Mapping[str, Any] | None:
"""Return additional state attributes."""
wind_gust = self.wind_gust
if wind_gust and self.hass.config.units.is_metric:
wind_gust = distance_convert(
self.wind_gust, LENGTH_MILES, LENGTH_KILOMETERS
)
cloud_cover = self.cloud_cover
if cloud_cover is not None:
cloud_cover /= 100
return {
ATTR_CLOUD_COVER: cloud_cover,
ATTR_WIND_GUST: wind_gust,
ATTR_PRECIPITATION_TYPE: self.precipitation_type,
}
@property
def cloud_cover(self):
"""Return cloud cover."""
raise NotImplementedError
@property
def wind_gust(self):
"""Return wind gust speed."""
raise NotImplementedError
@property
def precipitation_type(self):
"""Return precipitation type."""
raise NotImplementedError
class ClimaCellWeatherEntity(BaseClimaCellWeatherEntity):
"""Entity that talks to ClimaCell v4 API to retrieve weather data."""
@ -195,6 +244,24 @@ class ClimaCellWeatherEntity(BaseClimaCellWeatherEntity):
"""Return the humidity."""
return self._get_current_property(CC_ATTR_HUMIDITY)
@property
def wind_gust(self):
"""Return the wind gust speed."""
return self._get_current_property(CC_ATTR_WIND_GUST)
@property
def cloud_cover(self):
"""Reteurn the cloud cover."""
return self._get_current_property(CC_ATTR_CLOUD_COVER)
@property
def precipitation_type(self):
"""Return precipitation type."""
precipitation_type = self._get_current_property(CC_ATTR_PRECIPITATION_TYPE)
if precipitation_type is None:
return None
return PrecipitationType(precipitation_type).name.lower()
@property
def wind_speed(self):
"""Return the wind speed."""
@ -338,6 +405,25 @@ class ClimaCellV3WeatherEntity(BaseClimaCellWeatherEntity):
"""Return the humidity."""
return self._get_cc_value(self.coordinator.data[CURRENT], CC_V3_ATTR_HUMIDITY)
@property
def wind_gust(self):
"""Return the wind gust speed."""
return self._get_cc_value(self.coordinator.data[CURRENT], CC_V3_ATTR_WIND_GUST)
@property
def cloud_cover(self):
"""Reteurn the cloud cover."""
return self._get_cc_value(
self.coordinator.data[CURRENT], CC_V3_ATTR_CLOUD_COVER
)
@property
def precipitation_type(self):
"""Return precipitation type."""
return self._get_cc_value(
self.coordinator.data[CURRENT], CC_V3_ATTR_PRECIPITATION_TYPE
)
@property
def wind_speed(self):
"""Return the wind speed."""

View file

@ -13,7 +13,13 @@ from homeassistant.components.climacell.config_flow import (
_get_config_schema,
_get_unique_id,
)
from homeassistant.components.climacell.const import ATTRIBUTION, DOMAIN
from homeassistant.components.climacell.const import (
ATTR_CLOUD_COVER,
ATTR_PRECIPITATION_TYPE,
ATTR_WIND_GUST,
ATTRIBUTION,
DOMAIN,
)
from homeassistant.components.weather import (
ATTR_CONDITION_CLOUDY,
ATTR_CONDITION_RAINY,
@ -222,6 +228,9 @@ async def test_v3_weather(
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
assert weather_state.attributes[ATTR_CLOUD_COVER] == 1
assert weather_state.attributes[ATTR_WIND_GUST] == 24.075786240000003
assert weather_state.attributes[ATTR_PRECIPITATION_TYPE] == "rain"
async def test_v4_weather(
@ -382,3 +391,6 @@ async def test_v4_weather(
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
assert weather_state.attributes[ATTR_CLOUD_COVER] == 1
assert weather_state.attributes[ATTR_WIND_GUST] == 20.34210816
assert weather_state.attributes[ATTR_PRECIPITATION_TYPE] == "rain"

View file

@ -32,6 +32,17 @@
"value": 52.625,
"units": "ppb"
},
"wind_gust": {
"value": 14.96,
"units": "mph"
},
"precipitation_type": {
"value": "rain"
},
"cloud_cover": {
"value": 100,
"units": "%"
},
"observation_time": {
"value": "2021-03-07T18:54:06.055Z"
}

View file

@ -7,7 +7,10 @@
"windDirection": 315.14,
"weatherCode": 1000,
"visibility": 8.15,
"pollutantO3": 46.53
"pollutantO3": 46.53,
"windGust": 12.64,
"cloudCover": 100,
"precipitationType": 1
},
"forecasts": {
"nowcast": [