Updated SMHI API and improved the polygon contains logic
This commit is contained in:
+41
-10
@@ -1,7 +1,7 @@
|
||||
# environment/smhi.py
|
||||
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
|
||||
import requests
|
||||
from tools.geometry import Coordinate, LineString, MultiPolygon, Polygon
|
||||
@@ -12,7 +12,7 @@ logger = logging.getLogger(__name__)
|
||||
class SMHI:
|
||||
|
||||
fire_warning_api = "https://opendata-download-metfcst.smhi.se/api/category/fwif1g/version/1/daily/geotype/point/lon/{lon}/lat/{lat}/data.json"
|
||||
forecast_api = "https://opendata-download-metfcst.smhi.se/api/category/pmp3g/version/2/geotype/point/lon/{lon}/lat/{lat}/data.json"
|
||||
forecast_api = "https://opendata-download-metfcst.smhi.se/api/category/snow1g/version/1/geotype/point/lon/{lon}/lat/{lat}/data.json"
|
||||
alerts_api = (
|
||||
"https://opendata-download-warnings.smhi.se/ibww/api/version/1/warning.json"
|
||||
)
|
||||
@@ -68,8 +68,31 @@ class SMHI:
|
||||
resp.raise_for_status()
|
||||
|
||||
area_list = []
|
||||
now_utc = datetime.now(timezone.utc)
|
||||
|
||||
for warning in resp.json():
|
||||
for areas in warning["warningAreas"]:
|
||||
warning_level = areas["warningLevel"]["code"]
|
||||
|
||||
if warning_level == "MESSAGE":
|
||||
continue
|
||||
|
||||
start_str = areas.get("approximateStart")
|
||||
if start_str:
|
||||
start_time = datetime.fromisoformat(
|
||||
start_str.replace("Z", "+00:00")
|
||||
)
|
||||
if now_utc < start_time:
|
||||
continue
|
||||
|
||||
end_str = areas.get("approximateEnd")
|
||||
if end_str:
|
||||
end_time = datetime.fromisoformat(
|
||||
end_str.replace("Z", "+00:00")
|
||||
)
|
||||
if now_utc > end_time:
|
||||
continue
|
||||
|
||||
is_in_area = False
|
||||
if areas["area"]["type"] == "FeatureCollection":
|
||||
for features in areas["area"]["features"]:
|
||||
@@ -89,7 +112,7 @@ class SMHI:
|
||||
area_list.append(
|
||||
{
|
||||
"areaName": areas["areaName"]["sv"],
|
||||
"type": areas["warningLevel"]["code"],
|
||||
"type": warning_level,
|
||||
"description": areas["eventDescription"]["code"],
|
||||
}
|
||||
)
|
||||
@@ -107,29 +130,37 @@ class SMHI:
|
||||
|
||||
def _get_forecast(self) -> bool:
|
||||
try:
|
||||
base_url = self.forecast_api.format(
|
||||
lon=self.location.long, lat=self.location.lat
|
||||
)
|
||||
|
||||
query_string = "?timeseries=1¶meters=wind_from_direction,wind_speed,wind_speed_of_gust,symbol_code"
|
||||
full_url = base_url + query_string
|
||||
|
||||
resp = self._session.get(
|
||||
self.forecast_api.format(lon=self.location.long, lat=self.location.lat),
|
||||
full_url,
|
||||
timeout=10,
|
||||
)
|
||||
resp.raise_for_status()
|
||||
|
||||
data = resp.json()["timeSeries"][1]
|
||||
w_data = {x["name"]: x["values"][0] for x in data["parameters"]}
|
||||
w_data = resp.json()["timeSeries"][0]["data"]
|
||||
|
||||
self._data["forecast"] = {
|
||||
"data": {
|
||||
"wind": {
|
||||
"deg": w_data["wd"],
|
||||
"speed": round(w_data["ws"], 1),
|
||||
"gust": round(w_data["gust"], 1),
|
||||
"deg": w_data["wind_from_direction"],
|
||||
"speed": round(w_data["wind_speed"], 1),
|
||||
"gust": round(w_data["wind_speed_of_gust"], 1),
|
||||
},
|
||||
"weather_symbol": w_data["Wsymb2"] - 1,
|
||||
"weather_symbol": w_data["symbol_code"] - 1,
|
||||
},
|
||||
"valid_time": datetime.now(),
|
||||
}
|
||||
return True
|
||||
except requests.RequestException as e:
|
||||
logger.error(f"Network error getting SMHI Forecast: {e}")
|
||||
except KeyError as e:
|
||||
logger.error(f"Missing expected key in SMHI Forecast data: {e}")
|
||||
except Exception as e:
|
||||
logger.error(f"Parsing error for SMHI Forecast: {e}")
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user