Implement OpenSky library (#92814)
* Implement OpenSky library * Move function to library * Fix feedback
This commit is contained in:
parent
0ca0ed3a31
commit
db33aadcbb
|
@ -872,6 +872,7 @@ build.json @home-assistant/supervisor
|
|||
/homeassistant/components/opengarage/ @danielhiversen
|
||||
/tests/components/opengarage/ @danielhiversen
|
||||
/homeassistant/components/openhome/ @bazwilliams
|
||||
/homeassistant/components/opensky/ @joostlek
|
||||
/homeassistant/components/opentherm_gw/ @mvn23
|
||||
/tests/components/opentherm_gw/ @mvn23
|
||||
/homeassistant/components/openuv/ @bachya
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
{
|
||||
"domain": "opensky",
|
||||
"name": "OpenSky Network",
|
||||
"codeowners": [],
|
||||
"codeowners": ["@joostlek"],
|
||||
"documentation": "https://www.home-assistant.io/integrations/opensky",
|
||||
"iot_class": "cloud_polling"
|
||||
"iot_class": "cloud_polling",
|
||||
"requirements": ["python-opensky==0.0.7"]
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@ from __future__ import annotations
|
|||
|
||||
from datetime import timedelta
|
||||
|
||||
import requests
|
||||
from python_opensky import BoundingBox, OpenSky
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity
|
||||
|
@ -14,14 +14,12 @@ from homeassistant.const import (
|
|||
CONF_LONGITUDE,
|
||||
CONF_NAME,
|
||||
CONF_RADIUS,
|
||||
UnitOfLength,
|
||||
)
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
|
||||
from homeassistant.util import location as util_location
|
||||
from homeassistant.util.unit_conversion import DistanceConverter
|
||||
|
||||
CONF_ALTITUDE = "altitude"
|
||||
|
||||
|
@ -79,15 +77,18 @@ def setup_platform(
|
|||
"""Set up the Open Sky platform."""
|
||||
latitude = config.get(CONF_LATITUDE, hass.config.latitude)
|
||||
longitude = config.get(CONF_LONGITUDE, hass.config.longitude)
|
||||
radius = config.get(CONF_RADIUS, 0)
|
||||
bounding_box = OpenSky.get_bounding_box(latitude, longitude, radius)
|
||||
session = async_get_clientsession(hass)
|
||||
opensky = OpenSky(session=session)
|
||||
add_entities(
|
||||
[
|
||||
OpenSkySensor(
|
||||
hass,
|
||||
config.get(CONF_NAME, DOMAIN),
|
||||
latitude,
|
||||
longitude,
|
||||
config.get(CONF_RADIUS),
|
||||
config.get(CONF_ALTITUDE),
|
||||
opensky,
|
||||
bounding_box,
|
||||
config[CONF_ALTITUDE],
|
||||
)
|
||||
],
|
||||
True,
|
||||
|
@ -101,19 +102,22 @@ class OpenSkySensor(SensorEntity):
|
|||
"Information provided by the OpenSky Network (https://opensky-network.org)"
|
||||
)
|
||||
|
||||
def __init__(self, hass, name, latitude, longitude, radius, altitude):
|
||||
def __init__(
|
||||
self,
|
||||
hass: HomeAssistant,
|
||||
name: str,
|
||||
opensky: OpenSky,
|
||||
bounding_box: BoundingBox,
|
||||
altitude: float,
|
||||
) -> None:
|
||||
"""Initialize the sensor."""
|
||||
self._session = requests.Session()
|
||||
self._latitude = latitude
|
||||
self._longitude = longitude
|
||||
self._radius = DistanceConverter.convert(
|
||||
radius, UnitOfLength.KILOMETERS, UnitOfLength.METERS
|
||||
)
|
||||
self._altitude = altitude
|
||||
self._state = 0
|
||||
self._hass = hass
|
||||
self._name = name
|
||||
self._previously_tracked = None
|
||||
self._previously_tracked: set[str] = set()
|
||||
self._opensky = opensky
|
||||
self._bounding_box = bounding_box
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
|
@ -129,10 +133,10 @@ class OpenSkySensor(SensorEntity):
|
|||
"""Handle flights crossing region boundary."""
|
||||
for flight in flights:
|
||||
if flight in metadata:
|
||||
altitude = metadata[flight].get(ATTR_ALTITUDE)
|
||||
longitude = metadata[flight].get(ATTR_LONGITUDE)
|
||||
latitude = metadata[flight].get(ATTR_LATITUDE)
|
||||
icao24 = metadata[flight].get(ATTR_ICAO24)
|
||||
altitude = metadata[flight].barometric_altitude
|
||||
longitude = metadata[flight].longitude
|
||||
latitude = metadata[flight].latitude
|
||||
icao24 = metadata[flight].icao24
|
||||
else:
|
||||
# Assume Flight has landed if missing.
|
||||
altitude = 0
|
||||
|
@ -150,33 +154,27 @@ class OpenSkySensor(SensorEntity):
|
|||
}
|
||||
self._hass.bus.fire(event, data)
|
||||
|
||||
def update(self) -> None:
|
||||
async def async_update(self) -> None:
|
||||
"""Update device state."""
|
||||
currently_tracked = set()
|
||||
flight_metadata = {}
|
||||
states = self._session.get(OPENSKY_API_URL).json().get(ATTR_STATES)
|
||||
for state in states:
|
||||
flight = dict(zip(OPENSKY_API_FIELDS, state))
|
||||
callsign = flight[ATTR_CALLSIGN].strip()
|
||||
response = await self._opensky.get_states(bounding_box=self._bounding_box)
|
||||
for flight in response.states:
|
||||
if not flight.callsign:
|
||||
continue
|
||||
callsign = flight.callsign.strip()
|
||||
if callsign != "":
|
||||
flight_metadata[callsign] = flight
|
||||
else:
|
||||
continue
|
||||
if (
|
||||
(longitude := flight.get(ATTR_LONGITUDE)) is None
|
||||
or (latitude := flight.get(ATTR_LATITUDE)) is None
|
||||
or flight.get(ATTR_ON_GROUND)
|
||||
flight.longitude is None
|
||||
or flight.latitude is None
|
||||
or flight.on_ground
|
||||
or flight.barometric_altitude is None
|
||||
):
|
||||
continue
|
||||
distance = util_location.distance(
|
||||
self._latitude,
|
||||
self._longitude,
|
||||
latitude,
|
||||
longitude,
|
||||
)
|
||||
if distance is None or distance > self._radius:
|
||||
continue
|
||||
altitude = flight.get(ATTR_ALTITUDE)
|
||||
altitude = flight.barometric_altitude
|
||||
if altitude > self._altitude and self._altitude != 0:
|
||||
continue
|
||||
currently_tracked.add(callsign)
|
||||
|
|
|
@ -2103,6 +2103,9 @@ python-mystrom==2.2.0
|
|||
# homeassistant.components.nest
|
||||
python-nest==4.2.0
|
||||
|
||||
# homeassistant.components.opensky
|
||||
python-opensky==0.0.7
|
||||
|
||||
# homeassistant.components.otbr
|
||||
# homeassistant.components.thread
|
||||
python-otbr-api==1.0.9
|
||||
|
|
Loading…
Reference in New Issue