Skip to content

Commit

Permalink
Ensure todays weather is also available.
Browse files Browse the repository at this point in the history
  • Loading branch information
Rudd-O committed Jun 22, 2023
1 parent 0de2d87 commit c0155dd
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 47 deletions.
2 changes: 1 addition & 1 deletion .env
Original file line number Diff line number Diff line change
@@ -1 +1 @@
PYTHONPATH=${env:PROJ_DIR}/../hamsclientfork:${env:PROJ_DIR}
PYTHONPATH=.:./../hamsclientfork:${env:PROJ_DIR}/../hamsclientfork:${env:PROJ_DIR}
44 changes: 29 additions & 15 deletions custom_components/meteoswiss/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,23 @@
import logging
import pprint
import time
from typing import Any, cast

from async_timeout import timeout
from typing import Any
from homeassistant.core import Config, HomeAssistant
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
from homeassistant.helpers.typing import HomeAssistantType
from hamsclientfork import meteoSwissClient
from hamsclientfork.client import ClientResult
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
from homeassistant.const import Platform
from homeassistant.core import Config, HomeAssistant
from homeassistant.helpers import issue_registry as ir
from homeassistant.helpers.issue_registry import IssueSeverity
from homeassistant.helpers.typing import HomeAssistantType
from homeassistant.helpers.update_coordinator import (
DataUpdateCoordinator,
UpdateFailed,
)

from .const import (
from custom_components.meteoswiss.const import (
CONF_FORECAST_NAME,
CONF_NAME,
CONF_POSTCODE,
Expand All @@ -22,12 +29,6 @@
DEFAULT_UPDATE_INTERVAL,
DOMAIN,
)
from homeassistant.const import Platform
from homeassistant.helpers.update_coordinator import (
DataUpdateCoordinator,
UpdateFailed,
)
from homeassistant.helpers import issue_registry as ir

_LOGGER = logging.getLogger(__name__)
PLATFORMS = [Platform.SENSOR, Platform.WEATHER]
Expand Down Expand Up @@ -125,9 +126,18 @@ async def async_unload_entry(hass: HomeAssistantType, entry: ConfigEntry):
return unload_ok


class MeteoSwissClientResult(ClientResult):
station: str
post_code: str
forecast_name: str
real_time_name: str


class MeteoSwissDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Any]]):
"""Class to manage fetching AccuWeather data API."""

data: MeteoSwissClientResult

def __init__(
self,
hass: HomeAssistant,
Expand All @@ -138,7 +148,7 @@ def __init__(
real_time_name: str | None,
) -> None:
"""Initialize."""
self.first_error = None
self.first_error: float | None = None
self.error_raised = False
self.hass = hass
self.post_code = post_code
Expand Down Expand Up @@ -174,12 +184,12 @@ def __init__(
update_interval=update_interval,
)

async def _async_update_data(self) -> dict[str, Any]:
async def _async_update_data(self) -> MeteoSwissClientResult:
"""Update data via library."""
try:
async with timeout(15):
data = await self.hass.async_add_executor_job(
self.client.get_data,
self.client.get_typed_data,
)
except Exception as exc:
raise UpdateFailed(exc) from exc
Expand Down Expand Up @@ -214,11 +224,15 @@ async def _async_update_data(self) -> dict[str, Any]:
)
self.error_raised = True
else:
if self.error_raised:
ir.async_delete_issue(
self.hass, DOMAIN, f"{self.station}_provides_no_data_{DOMAIN}"
)
self.first_error = None
self.error_raised = False

data[CONF_STATION] = self.station
data[CONF_POSTCODE] = self.post_code
data[CONF_FORECAST_NAME] = self.forecast_name
data[CONF_REAL_TIME_NAME] = self.real_time_name
return data
return cast(MeteoSwissClientResult, data)
18 changes: 9 additions & 9 deletions custom_components/meteoswiss/config_flow.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
"""Config flow to configure the Meteo-Swiss integration."""
import logging

import re
from typing import Any

import voluptuous as vol
from hamsclientfork import StationType, meteoSwissClient
from homeassistant import config_entries
from .const import (
DOMAIN,
from homeassistant.helpers import issue_registry as ir
from homeassistant.helpers.issue_registry import IssueSeverity

from custom_components.meteoswiss.const import (
CONF_FORECAST_NAME,
CONF_LAT,
CONF_LON,
Expand All @@ -15,20 +19,16 @@
CONF_STATION,
CONF_UPDATE_INTERVAL,
DEFAULT_UPDATE_INTERVAL,
DOMAIN,
)
from hamsclientfork import meteoSwissClient, StationType
from homeassistant.helpers.issue_registry import IssueSeverity
from homeassistant.helpers import issue_registry as ir
from typing import Any


_LOGGER = logging.getLogger(__name__)


NO_STATION = "No real-time weather station"


class MeteoSwissFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
class MeteoSwissFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): # type:ignore

VERSION = 1
CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_POLL
Expand Down
4 changes: 2 additions & 2 deletions custom_components/meteoswiss/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
"issue_tracker": "https://github.com/Rudd-O/homeassistant-meteoswiss/issues",
"quality_scale": "silver",
"requirements": [
"hamsclientfork==0.2.7",
"hamsclientfork==0.2.8",
"geopy>=2.0"
],
"version": "1.3.1"
}
}
18 changes: 7 additions & 11 deletions custom_components/meteoswiss/sensor.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,27 @@
import logging
import pprint


from homeassistant.components.sensor import (
SensorEntity,
)

from homeassistant.config_entries import ConfigEntry
from homeassistant.const import STATE_UNAVAILABLE
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import MeteoSwissDataUpdateCoordinator

from homeassistant.const import STATE_UNAVAILABLE

from .const import (
from custom_components.meteoswiss import MeteoSwissDataUpdateCoordinator
from custom_components.meteoswiss.const import (
CONF_POSTCODE,
CONF_REAL_TIME_NAME,
CONF_STATION,
DOMAIN,
SENSOR_TYPES,
SENSOR_DATA_ID,
SENSOR_TYPE_CLASS,
SENSOR_TYPE_ICON,
SENSOR_TYPE_NAME,
SENSOR_TYPE_UNIT,
SENSOR_DATA_ID,
SENSOR_TYPES,
)

_LOGGER = logging.getLogger(__name__)
Expand Down Expand Up @@ -69,8 +65,8 @@ def __init__(
self._state = None
self._type = sensor_type
self._data = coordinator.data
self._attr_station = coordinator.data[CONF_STATION]
self._attr_post_code = coordinator.data[CONF_POSTCODE]
self._attr_station = coordinator.data[CONF_STATION] # type: ignore
self._attr_post_code = coordinator.data[CONF_POSTCODE] # type: ignore

@property
def name(self):
Expand Down
19 changes: 10 additions & 9 deletions custom_components/meteoswiss/weather.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import datetime
import logging
from typing import Any
from typing import cast

from hamsclientfork.client import DayForecast
from homeassistant.components.weather import (
ATTR_FORECAST_CONDITION,
ATTR_FORECAST_NATIVE_TEMP,
Expand All @@ -20,7 +20,10 @@
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity

from custom_components.meteoswiss import MeteoSwissDataUpdateCoordinator
from custom_components.meteoswiss import (
MeteoSwissClientResult,
MeteoSwissDataUpdateCoordinator,
)
from custom_components.meteoswiss.const import (
CONDITION_CLASSES,
CONF_FORECAST_NAME,
Expand Down Expand Up @@ -62,7 +65,7 @@ def __init__(
self._attr_post_code = coordinator.data[CONF_POSTCODE]
self.__set_data(coordinator.data)

def __set_data(self, data: dict[str, Any]):
def __set_data(self, data: MeteoSwissClientResult) -> None:
self._displayName = data[CONF_FORECAST_NAME]
self._forecastData = data["forecast"]
self._condition = data["condition"]
Expand Down Expand Up @@ -212,15 +215,13 @@ def wind_bearing(self):

@property
def forecast(self):
currentDate = datetime.datetime.now()
one_day = datetime.timedelta(days=1)
fcdata_out = []
# Skip the first element - it's the forecast for the current day
for forecast in self._forecastData["regionForecast"][1:]:
for untyped_forecast in self._forecastData["regionForecast"]:
forecast = cast(DayForecast, untyped_forecast)
# calculating date of the forecast
currentDate = currentDate + one_day
data_out = {}
data_out[ATTR_FORECAST_TIME] = currentDate.strftime("%Y-%m-%d")
data_out[ATTR_FORECAST_TIME] = forecast["dayDate"]
data_out[ATTR_FORECAST_NATIVE_TEMP_LOW] = float(
forecast["temperatureMin"],
)
Expand Down

0 comments on commit c0155dd

Please sign in to comment.