simple-dwd-weatherforecast 2.1.14__tar.gz → 2.1.16__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {simple_dwd_weatherforecast-2.1.14/simple_dwd_weatherforecast.egg-info → simple_dwd_weatherforecast-2.1.16}/PKG-INFO +1 -1
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/setup.py +1 -1
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/simple_dwd_weatherforecast/dwdforecast.py +22 -13
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/simple_dwd_weatherforecast/dwdmap.py +23 -8
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16/simple_dwd_weatherforecast.egg-info}/PKG-INFO +1 -1
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_daily_min.py +1 -1
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/LICENCE +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/README.md +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/setup.cfg +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/simple_dwd_weatherforecast/__init__.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/simple_dwd_weatherforecast/stations.json +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/simple_dwd_weatherforecast/uv_stations.json +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/simple_dwd_weatherforecast.egg-info/SOURCES.txt +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/simple_dwd_weatherforecast.egg-info/dependency_links.txt +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/simple_dwd_weatherforecast.egg-info/requires.txt +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/simple_dwd_weatherforecast.egg-info/top_level.txt +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/__init__.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/dummy_data.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/dummy_data_full.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/dummy_uv.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_daily_avg.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_daily_condition.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_daily_max.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_daily_sum.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_day_values.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_forecast_condition.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_forecast_data.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_station_name.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_timeframe_avg.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_timeframe_condition.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_timeframe_max.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_timeframe_min.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_timeframe_sum.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_timeframe_values.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_is_in_timerange.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_is_valid_timeframe.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_location_tools.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_map.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_parsekml.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_region.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_reported_weather.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_station.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_stationsfile.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_update.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_update_hourly.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_uv_index.py +0 -0
- {simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_weather.py +0 -0
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
|
|
5
5
|
|
6
6
|
setuptools.setup(
|
7
7
|
name="simple_dwd_weatherforecast",
|
8
|
-
version="v2.1.
|
8
|
+
version="v2.1.16",
|
9
9
|
author="Max Fermor",
|
10
10
|
description="A simple tool to retrieve a weather forecast from DWD OpenData",
|
11
11
|
long_description=long_description,
|
@@ -14,14 +14,22 @@ import arrow
|
|
14
14
|
import requests
|
15
15
|
from lxml import etree
|
16
16
|
|
17
|
-
with
|
18
|
-
|
19
|
-
|
17
|
+
with (
|
18
|
+
importlib.resources.files("simple_dwd_weatherforecast")
|
19
|
+
.joinpath( # type: ignore
|
20
|
+
"stations.json"
|
21
|
+
)
|
22
|
+
.open("r", encoding="utf-8") as file
|
23
|
+
):
|
20
24
|
stations = json.load(file)
|
21
25
|
|
22
|
-
with
|
23
|
-
|
24
|
-
|
26
|
+
with (
|
27
|
+
importlib.resources.files("simple_dwd_weatherforecast")
|
28
|
+
.joinpath( # type: ignore
|
29
|
+
"uv_stations.json"
|
30
|
+
)
|
31
|
+
.open("r", encoding="utf-8") as file
|
32
|
+
):
|
25
33
|
uv_stations = json.load(file)
|
26
34
|
|
27
35
|
|
@@ -483,12 +491,13 @@ class Weather:
|
|
483
491
|
value = None
|
484
492
|
for item in weather_data:
|
485
493
|
value_new = item[weatherDataType.value[0]]
|
486
|
-
if value_new:
|
487
|
-
if
|
494
|
+
if value_new is not None:
|
495
|
+
if value is None:
|
488
496
|
value = -9999999
|
489
497
|
if value_new > value:
|
490
498
|
value = value_new
|
491
|
-
|
499
|
+
|
500
|
+
if value is not None:
|
492
501
|
return round(value, 2)
|
493
502
|
return None
|
494
503
|
|
@@ -520,13 +529,13 @@ class Weather:
|
|
520
529
|
value = None
|
521
530
|
for item in weather_data:
|
522
531
|
value_new = item[weatherDataType.value[0]]
|
523
|
-
if value_new:
|
524
|
-
if
|
532
|
+
if value_new is not None:
|
533
|
+
if value is None:
|
525
534
|
value = 9999999
|
526
535
|
if value_new < value:
|
527
536
|
value = value_new
|
528
537
|
|
529
|
-
if value:
|
538
|
+
if value is not None:
|
530
539
|
return round(value, 2)
|
531
540
|
return None
|
532
541
|
|
@@ -558,7 +567,7 @@ class Weather:
|
|
558
567
|
value_sum = 0.0
|
559
568
|
for item in weather_data:
|
560
569
|
value = item[weatherDataType.value[0]]
|
561
|
-
if value:
|
570
|
+
if value is not None:
|
562
571
|
value_sum += float(value)
|
563
572
|
return round(value_sum, 2)
|
564
573
|
|
@@ -9,7 +9,8 @@ from datetime import datetime, timedelta, timezone
|
|
9
9
|
|
10
10
|
|
11
11
|
class WeatherMapType(Enum):
|
12
|
-
NIEDERSCHLAGSRADAR = "dwd:Niederschlagsradar
|
12
|
+
NIEDERSCHLAGSRADAR = "dwd:Niederschlagsradar"
|
13
|
+
BLITZSCHLAG = "dwd:NCEW_EU"
|
13
14
|
MAXTEMP = "dwd:GefuehlteTempMax"
|
14
15
|
UVINDEX = "dwd:UVI_CS"
|
15
16
|
POLLENFLUG = "dwd:Pollenflug"
|
@@ -158,7 +159,7 @@ def get_map(
|
|
158
159
|
layers = f"{background_type.value}, {map_type.value}"
|
159
160
|
else:
|
160
161
|
layers = f"{map_type.value}, {background_type.value}"
|
161
|
-
url = f"https://maps.dwd.de/geoserver/dwd/wms?service=WMS&version=1.1.
|
162
|
+
url = f"https://maps.dwd.de/geoserver/dwd/wms?service=WMS&version=1.1.1&request=GetMap&layers={layers}&bbox={minx},{miny},{maxx},{maxy}&width={image_width}&height={image_height}&srs=EPSG:4326&styles=&format=image/png"
|
162
163
|
request = requests.get(url, stream=True)
|
163
164
|
if request.status_code == 200:
|
164
165
|
image = Image.open(BytesIO(request.content))
|
@@ -237,7 +238,13 @@ class ImageLoop:
|
|
237
238
|
|
238
239
|
while now > self._last_update:
|
239
240
|
self._last_update += timedelta(minutes=5)
|
240
|
-
|
241
|
+
# Lightning in the NCEW_EU layer is only available in the last 5 minutes
|
242
|
+
self._images.append(
|
243
|
+
self._get_image(
|
244
|
+
self._last_update,
|
245
|
+
with_lightning=(now - self._last_update) < timedelta(minutes=5),
|
246
|
+
)
|
247
|
+
)
|
241
248
|
|
242
249
|
def update(self):
|
243
250
|
now = get_time_last_5_min(datetime.now(timezone.utc))
|
@@ -249,23 +256,31 @@ class ImageLoop:
|
|
249
256
|
else:
|
250
257
|
while now > self._last_update:
|
251
258
|
self._last_update += timedelta(minutes=5)
|
252
|
-
self._images.append(
|
259
|
+
self._images.append(
|
260
|
+
self._get_image(self._last_update, with_lightning=True)
|
261
|
+
)
|
253
262
|
|
254
263
|
def _get_image(
|
255
264
|
self,
|
256
265
|
date: datetime,
|
266
|
+
with_lightning: bool = False,
|
257
267
|
) -> ImageFile.ImageFile:
|
268
|
+
# Lightning in the NCEW_EU layer is only available in the last 5 minutes
|
269
|
+
layer = self._map_type.value
|
270
|
+
if with_lightning:
|
271
|
+
layer += ",dwd:NCEW_EU"
|
258
272
|
if self._background_type in [
|
259
273
|
WeatherBackgroundMapType.SATELLIT,
|
260
274
|
WeatherBackgroundMapType.KREISE,
|
261
275
|
WeatherBackgroundMapType.GEMEINDEN,
|
262
276
|
]:
|
263
|
-
layers = f"{self._background_type.value}, {
|
277
|
+
layers = f"{self._background_type.value}, {layer}"
|
264
278
|
else:
|
265
|
-
layers = f"{
|
266
|
-
|
279
|
+
layers = f"{layer}, {self._background_type.value}"
|
280
|
+
|
281
|
+
url = f"https://maps.dwd.de/geoserver/dwd/wms?service=WMS&version=1.1.1&request=GetMap&layers={layers}&bbox={self._minx},{self._miny},{self._maxx},{self._maxy}&width={self._image_width}&height={self._image_height}&srs=EPSG:4326&styles=&format=image/png&TIME={date.strftime('%Y-%m-%dT%H:%M:00.0Z')}"
|
267
282
|
request = requests.get(url, stream=True)
|
268
|
-
if request.status_code != 200:
|
283
|
+
if request.status_code != 200 or request.headers["content-type"] != "image/png":
|
269
284
|
raise ConnectionError("Error during image request from DWD servers")
|
270
285
|
image = Image.open(BytesIO(request.content))
|
271
286
|
if self.dark_mode:
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_daily_min.py
RENAMED
@@ -34,7 +34,7 @@ class Weather_get_daily_min(unittest.TestCase):
|
|
34
34
|
test_time = datetime(2020, 11, 6, 10, 0)
|
35
35
|
self.assertEqual(
|
36
36
|
self.dwd_weather.get_daily_min(WeatherDataType.PRECIPITATION, test_time),
|
37
|
-
0.
|
37
|
+
0.0,
|
38
38
|
)
|
39
39
|
|
40
40
|
@patch("simple_dwd_weatherforecast.dwdforecast.Weather.update", return_value=None)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/dummy_data_full.py
RENAMED
File without changes
|
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_daily_avg.py
RENAMED
File without changes
|
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_daily_max.py
RENAMED
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_daily_sum.py
RENAMED
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_get_day_values.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_location_tools.py
RENAMED
File without changes
|
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_parsekml.py
RENAMED
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_region.py
RENAMED
File without changes
|
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_station.py
RENAMED
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_stationsfile.py
RENAMED
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_update.py
RENAMED
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_update_hourly.py
RENAMED
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_uv_index.py
RENAMED
File without changes
|
{simple_dwd_weatherforecast-2.1.14 → simple_dwd_weatherforecast-2.1.16}/tests/test_weather.py
RENAMED
File without changes
|