From db33aadcbb756b415700633715ee9623dc8d1544 Mon Sep 17 00:00:00 2001 From: Joost Lekkerkerker Date: Wed, 24 May 2023 12:48:55 +0200 Subject: [PATCH] Implement OpenSky library (#92814) * Implement OpenSky library * Move function to library * Fix feedback --- CODEOWNERS | 1 + .../components/opensky/manifest.json | 5 +- homeassistant/components/opensky/sensor.py | 72 +++++++++---------- requirements_all.txt | 3 + 4 files changed, 42 insertions(+), 39 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 8a4e095e14b..9954bdc3a2d 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -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 diff --git a/homeassistant/components/opensky/manifest.json b/homeassistant/components/opensky/manifest.json index 7fdb6cfd677..854f2ec840b 100644 --- a/homeassistant/components/opensky/manifest.json +++ b/homeassistant/components/opensky/manifest.json @@ -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"] } diff --git a/homeassistant/components/opensky/sensor.py b/homeassistant/components/opensky/sensor.py index 03e242f40b2..f422eb150a0 100644 --- a/homeassistant/components/opensky/sensor.py +++ b/homeassistant/components/opensky/sensor.py @@ -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) diff --git a/requirements_all.txt b/requirements_all.txt index b66ad209649..80999fc96bb 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -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