Updated SMHI API and improved the polygon contains logic

This commit is contained in:
2026-04-18 12:37:37 +02:00 Verified
parent 49e52d9613
commit 131b74daf9
5 changed files with 65 additions and 70 deletions
+41 -10
View File
@@ -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&parameters=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