def wind_speed(self): """Return the wind speed.""" if self.hass.config.units.is_metric and self._wind_speed: return round( distance_convert(self._wind_speed, LENGTH_MILES, LENGTH_KILOMETERS), 4) return self._wind_speed
def visibility(self): """Return the visibility.""" if self.hass.config.units.is_metric and self._visibility: return round( distance_convert(self._visibility, LENGTH_MILES, LENGTH_KILOMETERS), 4) return self._visibility
def visibility(self): """Return the visibility.""" visibility = self._get_cc_value( self.coordinator.data[CURRENT], CC_ATTR_VISIBILITY ) if self.hass.config.units.is_metric and visibility: return distance_convert(visibility, LENGTH_MILES, LENGTH_KILOMETERS) return visibility
def wind_speed(self): """Return the wind speed.""" wind_speed = self._get_cc_value( self.coordinator.data[CURRENT], 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
def _forecast_dict( self, forecast_dt: datetime, use_datetime: bool, condition: str, 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( 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 = round( distance_convert(precipitation / 12, LENGTH_FEET, LENGTH_METERS) * 1000, 4, ) if wind_speed: wind_speed = round( distance_convert(wind_speed, LENGTH_MILES, LENGTH_KILOMETERS), 4 ) 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}
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 temp: temp = temp_convert(temp, TEMP_FAHRENHEIT, TEMP_CELSIUS) if temp_low: temp_low = temp_convert(temp_low, TEMP_FAHRENHEIT, TEMP_CELSIUS) 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}
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 = round( distance_convert(self.wind_gust, LENGTH_MILES, LENGTH_KILOMETERS), 4) cloud_cover = self.cloud_cover return { ATTR_CLOUD_COVER: cloud_cover, ATTR_WIND_GUST: wind_gust, ATTR_PRECIPITATION_TYPE: self.precipitation_type, }
CONF_UNIT_SYSTEM_IMPERIAL: IRRADIATION_BTUS_PER_HOUR_SQUARE_FOOT, CONF_UNIT_SYSTEM_METRIC: IRRADIATION_WATTS_PER_SQUARE_METER, ATTR_METRIC_CONVERSION: 3.15459, ATTR_IS_METRIC_CHECK: True, }, { ATTR_FIELD: CC_ATTR_CLOUD_BASE, ATTR_NAME: "Cloud Base", CONF_UNIT_SYSTEM_IMPERIAL: LENGTH_MILES, CONF_UNIT_SYSTEM_METRIC: LENGTH_KILOMETERS, ATTR_METRIC_CONVERSION: lambda val: distance_convert(val, LENGTH_MILES, LENGTH_KILOMETERS), ATTR_IS_METRIC_CHECK: True, }, { ATTR_FIELD: CC_ATTR_CLOUD_CEILING, ATTR_NAME: "Cloud Ceiling", CONF_UNIT_SYSTEM_IMPERIAL: LENGTH_MILES, CONF_UNIT_SYSTEM_METRIC: LENGTH_KILOMETERS, ATTR_METRIC_CONVERSION: lambda val: distance_convert(val, LENGTH_MILES, LENGTH_KILOMETERS), ATTR_IS_METRIC_CHECK:
# Data comes in as BTUs/(hr * ft^2) # https://www.theunitconverter.com/watt-square-meter-to-btu-hour-square-foot-conversion/ TomorrowioSensorEntityDescription( key=TMRW_ATTR_SOLAR_GHI, name="Global Horizontal Irradiance", unit_imperial=IRRADIATION_BTUS_PER_HOUR_SQUARE_FOOT, unit_metric=IRRADIATION_WATTS_PER_SQUARE_METER, imperial_conversion=(1 / 3.15459), ), # Data comes in as miles TomorrowioSensorEntityDescription( key=TMRW_ATTR_CLOUD_BASE, name="Cloud Base", unit_imperial=LENGTH_MILES, unit_metric=LENGTH_KILOMETERS, imperial_conversion=lambda val: distance_convert( val, LENGTH_KILOMETERS, LENGTH_MILES), ), # Data comes in as miles TomorrowioSensorEntityDescription( key=TMRW_ATTR_CLOUD_CEILING, name="Cloud Ceiling", unit_imperial=LENGTH_MILES, unit_metric=LENGTH_KILOMETERS, imperial_conversion=lambda val: distance_convert( val, LENGTH_KILOMETERS, LENGTH_MILES), ), TomorrowioSensorEntityDescription( key=TMRW_ATTR_CLOUD_COVER, name="Cloud Cover", native_unit_of_measurement=PERCENTAGE, ),
# https://www.theunitconverter.com/watt-square-meter-to-btu-hour-square-foot-conversion/ TomorrowioSensorEntityDescription( key=TMRW_ATTR_SOLAR_GHI, name="Global Horizontal Irradiance", unit_imperial=IRRADIATION_BTUS_PER_HOUR_SQUARE_FOOT, unit_metric=IRRADIATION_WATTS_PER_SQUARE_METER, metric_conversion=3.15459, ), # Data comes in as miles TomorrowioSensorEntityDescription( key=TMRW_ATTR_CLOUD_BASE, name="Cloud Base", unit_imperial=LENGTH_MILES, unit_metric=LENGTH_KILOMETERS, metric_conversion=lambda val: distance_convert( val, LENGTH_MILES, LENGTH_KILOMETERS ), ), # Data comes in as miles TomorrowioSensorEntityDescription( key=TMRW_ATTR_CLOUD_CEILING, name="Cloud Ceiling", unit_imperial=LENGTH_MILES, unit_metric=LENGTH_KILOMETERS, metric_conversion=lambda val: distance_convert( val, LENGTH_MILES, LENGTH_KILOMETERS ), ), TomorrowioSensorEntityDescription( key=TMRW_ATTR_CLOUD_COVER, name="Cloud Cover",