Fix Weatherflow Cloud lightning (#124082)

* Adding a error condition and a fix for missing lightning epoch values

* adding parentheses around the lambda

* Updating PR

* removed the dumb test

* Updated tests to support good stuff

* Updated snapshots
This commit is contained in:
Jeef 2024-08-21 08:16:16 -06:00 committed by GitHub
parent 3e53cc175f
commit 9de90ca7d5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 191 additions and 4 deletions

View File

@ -158,8 +158,12 @@ WF_SENSORS: tuple[WeatherFlowCloudSensorEntityDescription, ...] = (
key="lightning_strike_last_epoch",
translation_key="lightning_strike_last_epoch",
device_class=SensorDeviceClass.TIMESTAMP,
value_fn=lambda data: datetime.fromtimestamp(
data.lightning_strike_last_epoch, tz=UTC
value_fn=(
lambda data: datetime.fromtimestamp(
data.lightning_strike_last_epoch, tz=UTC
)
if data.lightning_strike_last_epoch is not None
else None
),
),
)

View File

@ -113,3 +113,39 @@ def mock_api():
mock_api_class.return_value = mock_api
yield mock_api
#
# @pytest.fixture
# def mock_api_with_lightning_error():
# """Fixture for Mock WeatherFlowRestAPI."""
# get_stations_response_data = StationsResponseREST.from_json(
# load_fixture("stations.json", DOMAIN)
# )
# get_forecast_response_data = WeatherDataForecastREST.from_json(
# load_fixture("forecast.json", DOMAIN)
# )
# get_observation_response_data = ObservationStationREST.from_json(
# load_fixture("station_observation_error.json", DOMAIN)
# )
#
# data = {
# 24432: WeatherFlowDataREST(
# weather=get_forecast_response_data,
# observation=get_observation_response_data,
# station=get_stations_response_data.stations[0],
# device_observations=None,
# )
# }
#
# with patch(
# "homeassistant.components.weatherflow_cloud.coordinator.WeatherFlowRestAPI",
# autospec=True,
# ) as mock_api_class:
# # Create an instance of AsyncMock for the API
# mock_api = AsyncMock()
# mock_api.get_all_data.return_value = data
# # Patch the class to return our mock_api instance
# mock_api_class.return_value = mock_api
#
# yield mock_api

View File

@ -0,0 +1,99 @@
{
"elevation": 2063.150146484375,
"is_public": true,
"latitude": 43.94962,
"longitude": -102.86831,
"obs": [
{
"air_density": 0.96139,
"air_temperature": 10.5,
"barometric_pressure": 782.8,
"brightness": 757,
"delta_t": 8.4,
"dew_point": -10.4,
"feels_like": 10.5,
"heat_index": 10.5,
"lightning_strike_count": 0,
"lightning_strike_count_last_1hr": 0,
"lightning_strike_count_last_3hr": 0,
"lightning_strike_last_distance": 26,
"precip": 0.0,
"precip_accum_last_1hr": 0.0,
"precip_accum_local_day": 0.0,
"precip_accum_local_day_final": 0.0,
"precip_accum_local_yesterday": 0.0,
"precip_accum_local_yesterday_final": 0.0,
"precip_analysis_type_yesterday": 0,
"precip_minutes_local_day": 0,
"precip_minutes_local_yesterday": 0,
"precip_minutes_local_yesterday_final": 0,
"pressure_trend": "steady",
"relative_humidity": 22,
"sea_level_pressure": 1006.2,
"solar_radiation": 6,
"station_pressure": 782.8,
"timestamp": 1708994629,
"uv": 0.03,
"wet_bulb_globe_temperature": 4.6,
"wet_bulb_temperature": 2.1,
"wind_avg": 1.4,
"wind_chill": 10.5,
"wind_direction": 203,
"wind_gust": 3.2,
"wind_lull": 0.3
}
],
"outdoor_keys": [
"timestamp",
"air_temperature",
"barometric_pressure",
"station_pressure",
"pressure_trend",
"sea_level_pressure",
"relative_humidity",
"precip",
"precip_accum_last_1hr",
"precip_accum_local_day",
"precip_accum_local_day_final",
"precip_accum_local_yesterday_final",
"precip_minutes_local_day",
"precip_minutes_local_yesterday_final",
"wind_avg",
"wind_direction",
"wind_gust",
"wind_lull",
"solar_radiation",
"uv",
"brightness",
"lightning_strike_last_epoch",
"lightning_strike_last_distance",
"lightning_strike_count",
"lightning_strike_count_last_1hr",
"lightning_strike_count_last_3hr",
"feels_like",
"heat_index",
"wind_chill",
"dew_point",
"wet_bulb_temperature",
"wet_bulb_globe_temperature",
"delta_t",
"air_density"
],
"public_name": "My Home Station",
"station_id": 24432,
"station_name": "My Home Station",
"station_units": {
"units_direction": "degrees",
"units_distance": "mi",
"units_other": "metric",
"units_precip": "in",
"units_pressure": "hpa",
"units_temp": "f",
"units_wind": "bft"
},
"status": {
"status_code": 0,
"status_message": "SUCCESS"
},
"timezone": "America/Denver"
}

View File

@ -1,16 +1,25 @@
"""Tests for the WeatherFlow Cloud sensor platform."""
from datetime import timedelta
from unittest.mock import AsyncMock, patch
from freezegun.api import FrozenDateTimeFactory
from syrupy import SnapshotAssertion
from weatherflow4py.models.rest.observation import ObservationStationREST
from homeassistant.const import Platform
from homeassistant.components.weatherflow_cloud import DOMAIN
from homeassistant.const import STATE_UNKNOWN, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from . import setup_integration
from tests.common import MockConfigEntry, snapshot_platform
from tests.common import (
MockConfigEntry,
async_fire_time_changed,
load_fixture,
snapshot_platform,
)
async def test_all_entities(
@ -27,3 +36,42 @@ async def test_all_entities(
await setup_integration(hass, mock_config_entry)
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
async def test_all_entities_with_lightning_error(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
entity_registry: er.EntityRegistry,
mock_api: AsyncMock,
freezer: FrozenDateTimeFactory,
) -> None:
"""Test all entities."""
get_observation_response_data = ObservationStationREST.from_json(
load_fixture("station_observation_error.json", DOMAIN)
)
with patch(
"homeassistant.components.weatherflow_cloud.PLATFORMS", [Platform.SENSOR]
):
await setup_integration(hass, mock_config_entry)
assert (
hass.states.get("sensor.my_home_station_lightning_last_strike").state
== "2024-02-07T23:01:15+00:00"
)
# Update the data in our API
all_data = await mock_api.get_all_data()
all_data[24432].observation = get_observation_response_data
mock_api.get_all_data.return_value = all_data
# Move time forward
freezer.tick(timedelta(minutes=5))
async_fire_time_changed(hass)
await hass.async_block_till_done()
assert (
hass.states.get("sensor.my_home_station_lightning_last_strike").state
== STATE_UNKNOWN
)