Bump pytrafikverket to 0.2.0.1 (#71131)

* Bump pytrafikverket to 0.2.0.1

* Use system timezone

* Minor review changes

* current time

* Adjustments timezone
This commit is contained in:
G Johansson 2022-05-05 20:55:52 +02:00 committed by GitHub
parent 8f5e61ee80
commit d2c9fa4075
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 40 additions and 45 deletions

View File

@ -13,7 +13,7 @@ from homeassistant.const import CONF_API_KEY, CONF_WEEKDAY, WEEKDAYS
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from homeassistant.util.dt import UTC, as_utc, parse_time from homeassistant.util import dt
from .const import CONF_FROM, CONF_TIME, CONF_TO, DOMAIN from .const import CONF_FROM, CONF_TIME, CONF_TO, DOMAIN
@ -58,21 +58,23 @@ class TVDataUpdateCoordinator(DataUpdateCoordinator):
) )
self._from: str = entry.data[CONF_FROM] self._from: str = entry.data[CONF_FROM]
self._to: str = entry.data[CONF_TO] self._to: str = entry.data[CONF_TO]
self._time: time | None = parse_time(entry.data[CONF_TIME]) self._time: time | None = dt.parse_time(entry.data[CONF_TIME])
self._weekdays: list[str] = entry.data[CONF_WEEKDAY] self._weekdays: list[str] = entry.data[CONF_WEEKDAY]
async def _async_update_data(self) -> dict[str, Any]: async def _async_update_data(self) -> dict[str, Any]:
"""Fetch data from Trafikverket.""" """Fetch data from Trafikverket."""
departure_day = next_departuredate(self._weekdays) departure_day = next_departuredate(self._weekdays)
currenttime = datetime.now() current_time = dt.now()
when = ( when = (
datetime.combine(departure_day, self._time) datetime.combine(
if self._time departure_day, self._time, dt.get_time_zone(self.hass.config.time_zone)
else datetime.now()
) )
if currenttime > when: if self._time
when = currenttime else dt.now()
)
if current_time > when:
when = current_time
try: try:
routedata: FerryStop = await self._ferry_api.async_get_next_ferry_stop( routedata: FerryStop = await self._ferry_api.async_get_next_ferry_stop(
@ -84,10 +86,11 @@ class TVDataUpdateCoordinator(DataUpdateCoordinator):
) from error ) from error
states = { states = {
"departure_time": routedata.departure_time.replace(tzinfo=UTC), "departure_time": routedata.departure_time,
"departure_from": routedata.from_harbor_name, "departure_from": routedata.from_harbor_name,
"departure_to": routedata.to_harbor_name, "departure_to": routedata.to_harbor_name,
"departure_modified": as_utc(routedata.modified_time.replace(tzinfo=UTC)), "departure_modified": routedata.modified_time,
"departure_information": routedata.other_information, "departure_information": routedata.other_information,
} }
_LOGGER.debug("States: %s", states)
return states return states

View File

@ -2,7 +2,7 @@
"domain": "trafikverket_ferry", "domain": "trafikverket_ferry",
"name": "Trafikverket Ferry", "name": "Trafikverket Ferry",
"documentation": "https://www.home-assistant.io/integrations/trafikverket_ferry", "documentation": "https://www.home-assistant.io/integrations/trafikverket_ferry",
"requirements": ["pytrafikverket==0.1.6.2"], "requirements": ["pytrafikverket==0.2.0.1"],
"codeowners": ["@gjohansson-ST"], "codeowners": ["@gjohansson-ST"],
"config_flow": true, "config_flow": true,
"iot_class": "cloud_polling", "iot_class": "cloud_polling",

View File

@ -3,8 +3,7 @@ from __future__ import annotations
from collections.abc import Callable from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from datetime import timedelta from datetime import datetime, timedelta
import logging
from typing import Any from typing import Any
from homeassistant.components.sensor import ( from homeassistant.components.sensor import (
@ -20,12 +19,11 @@ from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import StateType from homeassistant.helpers.typing import StateType
from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.util.dt import as_utc
from .const import ATTRIBUTION, DOMAIN from .const import ATTRIBUTION, DOMAIN
from .coordinator import TVDataUpdateCoordinator from .coordinator import TVDataUpdateCoordinator
_LOGGER = logging.getLogger(__name__)
ATTR_FROM = "from_harbour" ATTR_FROM = "from_harbour"
ATTR_TO = "to_harbour" ATTR_TO = "to_harbour"
ATTR_MODIFIED_TIME = "modified_time" ATTR_MODIFIED_TIME = "modified_time"
@ -39,7 +37,7 @@ SCAN_INTERVAL = timedelta(minutes=5)
class TrafikverketRequiredKeysMixin: class TrafikverketRequiredKeysMixin:
"""Mixin for required keys.""" """Mixin for required keys."""
value_fn: Callable[[dict[str, Any]], StateType] value_fn: Callable[[dict[str, Any]], StateType | datetime]
info_fn: Callable[[dict[str, Any]], StateType | list] info_fn: Callable[[dict[str, Any]], StateType | list]
@ -56,7 +54,7 @@ SENSOR_TYPES: tuple[TrafikverketSensorEntityDescription, ...] = (
name="Departure Time", name="Departure Time",
icon="mdi:clock", icon="mdi:clock",
device_class=SensorDeviceClass.TIMESTAMP, device_class=SensorDeviceClass.TIMESTAMP,
value_fn=lambda data: data["departure_time"], value_fn=lambda data: as_utc(data["departure_time"]),
info_fn=lambda data: data["departure_information"], info_fn=lambda data: data["departure_information"],
), ),
TrafikverketSensorEntityDescription( TrafikverketSensorEntityDescription(
@ -78,7 +76,7 @@ SENSOR_TYPES: tuple[TrafikverketSensorEntityDescription, ...] = (
name="Departure Modified", name="Departure Modified",
icon="mdi:clock", icon="mdi:clock",
device_class=SensorDeviceClass.TIMESTAMP, device_class=SensorDeviceClass.TIMESTAMP,
value_fn=lambda data: data["departure_modified"], value_fn=lambda data: as_utc(data["departure_modified"]),
info_fn=lambda data: data["departure_information"], info_fn=lambda data: data["departure_information"],
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
), ),
@ -122,7 +120,7 @@ class FerrySensor(CoordinatorEntity[TVDataUpdateCoordinator], SensorEntity):
entry_type=DeviceEntryType.SERVICE, entry_type=DeviceEntryType.SERVICE,
identifiers={(DOMAIN, entry_id)}, identifiers={(DOMAIN, entry_id)},
manufacturer="Trafikverket", manufacturer="Trafikverket",
model="v1.2", model="v2.0",
name=name, name=name,
configuration_url="https://api.trafikinfo.trafikverket.se/", configuration_url="https://api.trafikinfo.trafikverket.se/",
) )
@ -133,6 +131,7 @@ class FerrySensor(CoordinatorEntity[TVDataUpdateCoordinator], SensorEntity):
self._attr_native_value = self.entity_description.value_fn( self._attr_native_value = self.entity_description.value_fn(
self.coordinator.data self.coordinator.data
) )
self._attr_extra_state_attributes = { self._attr_extra_state_attributes = {
"other_information": self.entity_description.info_fn(self.coordinator.data), "other_information": self.entity_description.info_fn(self.coordinator.data),
} }

View File

@ -2,7 +2,7 @@
"domain": "trafikverket_train", "domain": "trafikverket_train",
"name": "Trafikverket Train", "name": "Trafikverket Train",
"documentation": "https://www.home-assistant.io/integrations/trafikverket_train", "documentation": "https://www.home-assistant.io/integrations/trafikverket_train",
"requirements": ["pytrafikverket==0.1.6.2"], "requirements": ["pytrafikverket==0.2.0.1"],
"codeowners": ["@endor-force", "@gjohansson-ST"], "codeowners": ["@endor-force", "@gjohansson-ST"],
"config_flow": true, "config_flow": true,
"iot_class": "cloud_polling", "iot_class": "cloud_polling",

View File

@ -24,7 +24,7 @@ from homeassistant.helpers.device_registry import DeviceEntryType
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from homeassistant.util.dt import as_utc, get_time_zone, parse_time from homeassistant.util import dt
from .const import CONF_FROM, CONF_TIME, CONF_TO, CONF_TRAINS, DOMAIN from .const import CONF_FROM, CONF_TIME, CONF_TO, CONF_TRAINS, DOMAIN
from .util import create_unique_id from .util import create_unique_id
@ -42,7 +42,6 @@ ATTR_DEVIATIONS = "deviations"
ICON = "mdi:train" ICON = "mdi:train"
SCAN_INTERVAL = timedelta(minutes=5) SCAN_INTERVAL = timedelta(minutes=5)
STOCKHOLM_TIMEZONE = get_time_zone("Europe/Stockholm")
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{ {
@ -111,7 +110,9 @@ async def async_setup_entry(
) from error ) from error
train_time = ( train_time = (
parse_time(entry.data.get(CONF_TIME, "")) if entry.data.get(CONF_TIME) else None dt.parse_time(entry.data.get(CONF_TIME, ""))
if entry.data.get(CONF_TIME)
else None
) )
async_add_entities( async_add_entities(
@ -153,7 +154,7 @@ def next_departuredate(departure: list[str]) -> date:
def _to_iso_format(traintime: datetime) -> str: def _to_iso_format(traintime: datetime) -> str:
"""Return isoformatted utc time.""" """Return isoformatted utc time."""
return as_utc(traintime.replace(tzinfo=STOCKHOLM_TIMEZONE)).isoformat() return dt.as_utc(traintime).isoformat()
class TrainSensor(SensorEntity): class TrainSensor(SensorEntity):
@ -183,7 +184,7 @@ class TrainSensor(SensorEntity):
entry_type=DeviceEntryType.SERVICE, entry_type=DeviceEntryType.SERVICE,
identifiers={(DOMAIN, entry_id)}, identifiers={(DOMAIN, entry_id)},
manufacturer="Trafikverket", manufacturer="Trafikverket",
model="v1.2", model="v2.0",
name=name, name=name,
configuration_url="https://api.trafikinfo.trafikverket.se/", configuration_url="https://api.trafikinfo.trafikverket.se/",
) )
@ -193,12 +194,12 @@ class TrainSensor(SensorEntity):
async def async_update(self) -> None: async def async_update(self) -> None:
"""Retrieve latest state.""" """Retrieve latest state."""
when = datetime.now() when = dt.now()
_state: TrainStop | None = None _state: TrainStop | None = None
if self._time: if self._time:
departure_day = next_departuredate(self._weekday) departure_day = next_departuredate(self._weekday)
when = datetime.combine(departure_day, self._time).replace( when = datetime.combine(
tzinfo=STOCKHOLM_TIMEZONE departure_day, self._time, dt.get_time_zone(self.hass.config.time_zone)
) )
try: try:
if self._time: if self._time:
@ -222,17 +223,11 @@ class TrainSensor(SensorEntity):
self._attr_available = True self._attr_available = True
# The original datetime doesn't provide a timezone so therefore attaching it here. # The original datetime doesn't provide a timezone so therefore attaching it here.
self._attr_native_value = _state.advertised_time_at_location.replace( self._attr_native_value = dt.as_utc(_state.advertised_time_at_location)
tzinfo=STOCKHOLM_TIMEZONE
)
if _state.time_at_location: if _state.time_at_location:
self._attr_native_value = _state.time_at_location.replace( self._attr_native_value = dt.as_utc(_state.time_at_location)
tzinfo=STOCKHOLM_TIMEZONE
)
if _state.estimated_time_at_location: if _state.estimated_time_at_location:
self._attr_native_value = _state.estimated_time_at_location.replace( self._attr_native_value = dt.as_utc(_state.estimated_time_at_location)
tzinfo=STOCKHOLM_TIMEZONE
)
self._update_attributes(_state) self._update_attributes(_state)

View File

@ -2,7 +2,7 @@
"domain": "trafikverket_weatherstation", "domain": "trafikverket_weatherstation",
"name": "Trafikverket Weather Station", "name": "Trafikverket Weather Station",
"documentation": "https://www.home-assistant.io/integrations/trafikverket_weatherstation", "documentation": "https://www.home-assistant.io/integrations/trafikverket_weatherstation",
"requirements": ["pytrafikverket==0.1.6.2"], "requirements": ["pytrafikverket==0.2.0.1"],
"codeowners": ["@endor-force", "@gjohansson-ST"], "codeowners": ["@endor-force", "@gjohansson-ST"],
"config_flow": true, "config_flow": true,
"iot_class": "cloud_polling", "iot_class": "cloud_polling",

View File

@ -24,13 +24,11 @@ from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import StateType from homeassistant.helpers.typing import StateType
from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.util.dt import as_utc, get_time_zone from homeassistant.util.dt import as_utc
from .const import ATTRIBUTION, CONF_STATION, DOMAIN, NONE_IS_ZERO_SENSORS from .const import ATTRIBUTION, CONF_STATION, DOMAIN, NONE_IS_ZERO_SENSORS
from .coordinator import TVDataUpdateCoordinator from .coordinator import TVDataUpdateCoordinator
STOCKHOLM_TIMEZONE = get_time_zone("Europe/Stockholm")
@dataclass @dataclass
class TrafikverketRequiredKeysMixin: class TrafikverketRequiredKeysMixin:
@ -156,8 +154,8 @@ async def async_setup_entry(
def _to_datetime(measuretime: str) -> datetime: def _to_datetime(measuretime: str) -> datetime:
"""Return isoformatted utc time.""" """Return isoformatted utc time."""
time_obj = datetime.strptime(measuretime, "%Y-%m-%dT%H:%M:%S") time_obj = datetime.strptime(measuretime, "%Y-%m-%dT%H:%M:%S.%f%z")
return as_utc(time_obj.replace(tzinfo=STOCKHOLM_TIMEZONE)) return as_utc(time_obj)
class TrafikverketWeatherStation( class TrafikverketWeatherStation(
@ -184,7 +182,7 @@ class TrafikverketWeatherStation(
entry_type=DeviceEntryType.SERVICE, entry_type=DeviceEntryType.SERVICE,
identifiers={(DOMAIN, entry_id)}, identifiers={(DOMAIN, entry_id)},
manufacturer="Trafikverket", manufacturer="Trafikverket",
model="v1.2", model="v2.0",
name=sensor_station, name=sensor_station,
configuration_url="https://api.trafikinfo.trafikverket.se/", configuration_url="https://api.trafikinfo.trafikverket.se/",
) )

View File

@ -1978,7 +1978,7 @@ pytradfri[async]==9.0.0
# homeassistant.components.trafikverket_ferry # homeassistant.components.trafikverket_ferry
# homeassistant.components.trafikverket_train # homeassistant.components.trafikverket_train
# homeassistant.components.trafikverket_weatherstation # homeassistant.components.trafikverket_weatherstation
pytrafikverket==0.1.6.2 pytrafikverket==0.2.0.1
# homeassistant.components.usb # homeassistant.components.usb
pyudev==0.22.0 pyudev==0.22.0

View File

@ -1301,7 +1301,7 @@ pytradfri[async]==9.0.0
# homeassistant.components.trafikverket_ferry # homeassistant.components.trafikverket_ferry
# homeassistant.components.trafikverket_train # homeassistant.components.trafikverket_train
# homeassistant.components.trafikverket_weatherstation # homeassistant.components.trafikverket_weatherstation
pytrafikverket==0.1.6.2 pytrafikverket==0.2.0.1
# homeassistant.components.usb # homeassistant.components.usb
pyudev==0.22.0 pyudev==0.22.0