Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add transport data from maps.yandex.ru api #26252

Merged
merged 19 commits into from Sep 19, 2019
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
63 changes: 22 additions & 41 deletions homeassistant/components/moscow_yandex_transport/sensor.py
@@ -1,12 +1,10 @@
# -*- coding: utf-8 -*-
'''
"""
Service for obtaining information about closer bus from Transport Yandex Service
@author: rishatik92@gmail.com
'''
"""

import logging
from datetime import timedelta
from time import time

import voluptuous as vol
from moscow_yandex_transport import YandexMapsRequester
Expand Down Expand Up @@ -35,67 +33,52 @@
{
vol.Required(CONF_STOP_ID): cv.string,
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_ROUTE, default=[]): cv.ensure_list,
vol.Optional(CONF_ROUTE, default=[]): vol.All(cv.ensure_list, [cv.string]),

}
)


def due_in_minutes(timestamp: int):
"""Get the time in minutes from a timestamp.

The timestamp should be in the posix time
"""
diff = timestamp - time()
if diff < 0:
diff = 0

return str(int(diff / 60))


def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the Yandex transport sensor."""
stop_id = config.get(CONF_STOP_ID)
name = config.get(CONF_NAME)
routes = config.get(CONF_ROUTE)
stop_id = config[CONF_STOP_ID]
name = config[CONF_NAME]
routes = config[CONF_ROUTE]

data = YandexMapsRequester(user_agent=USER_AGENT)
add_entities([DiscoverMoscowYandexTransport(data, stop_id, routes, name)], True)


class DiscoverMoscowYandexTransport(Entity):
def __init__(self, requester, stop_id, routes, name):
"""

:type requester: data provider for request to yandex api
"""
"""Initialize sensor."""
self.requester = requester
self._stop_id = stop_id
self._routes = []
for route in routes:
self._routes.append(str(route))
self._routes = routes
self._state = None
self._name = name
self._attrs = None
self._next_route = None

def update(self):
"""Get the latest data from maps.yandex.ru and update the states."""
result = {}
attrs = {}
closer_time = None
try:
yandex_reply = self.requester.get_stop_info(self._stop_id)
data = yandex_reply["data"]
stop_metadata = data["properties"]["StopMetaData"]
except KeyError as e:
_LOGGER.warning(f"Exception KeyError was captured, missing key is {e}. Yandex returned :{yandex_reply}")
_LOGGER.warning(
"Exception KeyError was captured, missing key is " + str(e) + ". Yandex returned: " + str(yandex_reply))
rishatik92 marked this conversation as resolved.
Show resolved Hide resolved
self.requester.set_new_session()
data = self.requester.get_stop_info(self._stop_id)["data"]
stop_metadata = data["properties"]["StopMetaData"]
stop_name = data["properties"]["name"]
transport_list = stop_metadata["Transport"]
for transport in transport_list:
route = transport["name"]
if self._routes and route not in self._routes:
if route not in self._routes:
# skip unnecessary route info
continue
if "Events" in transport["BriefSchedule"]:
Expand All @@ -104,18 +87,16 @@ def update(self):
posix_time_next = int(event["Estimated"]["value"])
if closer_time is None or closer_time > posix_time_next:
closer_time = posix_time_next
if route not in result:
result[route] = []
result[route].append(event["Estimated"]["text"])
for route in result:
result[route] = ", ".join(result[route])
result[STOP_NAME] = stop_name
result[ATTR_ATTRIBUTION] = ATTRIBUTION
if route not in attrs:
attrs[route] = []
attrs[route].append(event["Estimated"]["text"])
attrs[STOP_NAME] = stop_name
attrs[ATTR_ATTRIBUTION] = ATTRIBUTION
if closer_time is None:
self._state = "n/a"
self._state = None
else:
self._state = due_in_minutes(closer_time)
self._attrs = result
self._state = closer_time
rishatik92 marked this conversation as resolved.
Show resolved Hide resolved
self._attrs = attrs

@property
def state(self):
Expand All @@ -135,7 +116,7 @@ def device_state_attributes(self):
@property
def unit_of_measurement(self):
"""Return the unit this state is expressed in."""
return "min"
return "timestamp"
rishatik92 marked this conversation as resolved.
Show resolved Hide resolved

@property
def icon(self):
Expand Down