mirror of
https://github.com/home-assistant/core.git
synced 2025-07-11 15:27:08 +00:00
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:
parent
8f5e61ee80
commit
d2c9fa4075
@ -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
|
||||||
|
@ -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",
|
||||||
|
@ -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),
|
||||||
}
|
}
|
||||||
|
@ -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",
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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",
|
||||||
|
@ -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/",
|
||||||
)
|
)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user