From 4641442925a20d1e23060a6c9468a8bbfa1258b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20L=27hopital?= Date: Fri, 6 Mar 2026 11:49:06 +0100 Subject: [PATCH] Resolve DepartmentDb loading error when already initialized (#20242) Do not set Thing offline if a part of the service is not delivering data Lighten pollen icon weights and align sizes Signed-off-by: gael@lhopital.org --- .../org.openhab.binding.airparif/README.md | 44 +++++++++---------- .../doc/images/alder.svg | 2 +- .../doc/images/aq.svg | 2 +- .../doc/images/ash.svg | 36 +++++++-------- .../doc/images/birch.svg | 2 +- .../doc/images/chestnut.svg | 2 +- .../doc/images/cypress.svg | 23 +++++----- .../doc/images/grasses.svg | 8 ++-- .../doc/images/hazel.svg | 2 +- .../doc/images/hornbeam.svg | 2 +- .../doc/images/linden.svg | 2 +- .../doc/images/oak.svg | 2 +- .../doc/images/olive.svg | 2 +- .../doc/images/plane.svg | 8 ++-- .../doc/images/plantain.svg | 2 +- .../doc/images/pollen.svg | 6 +++ .../doc/images/poplar.svg | 4 +- .../doc/images/ragweed.svg | 2 +- .../doc/images/rumex.svg | 2 +- .../doc/images/urticaceae.svg | 6 +-- .../doc/images/willow.svg | 4 +- .../doc/images/wormwood.svg | 2 +- .../internal/AirParifIconProvider.java | 26 ++++++----- .../airparif/internal/api/AirParifApi.java | 2 + .../airparif/internal/api/AirParifDto.java | 13 +++--- .../internal/db/DepartmentDbService.java | 4 ++ .../discovery/AirParifDiscoveryService.java | 18 ++++---- .../handler/AirParifBridgeHandler.java | 9 ++-- .../internal/handler/HandlerUtils.java | 3 +- .../src/main/resources/icon/alder.svg | 2 +- .../src/main/resources/icon/aq-0.svg | 2 +- .../src/main/resources/icon/aq-1.svg | 2 +- .../src/main/resources/icon/aq-2.svg | 2 +- .../src/main/resources/icon/aq-3.svg | 2 +- .../src/main/resources/icon/aq-4.svg | 2 +- .../src/main/resources/icon/aq-5.svg | 2 +- .../src/main/resources/icon/aq.svg | 2 +- .../src/main/resources/icon/ash.svg | 36 +++++++-------- .../src/main/resources/icon/birch.svg | 2 +- .../src/main/resources/icon/chestnut.svg | 2 +- .../src/main/resources/icon/cypress.svg | 23 +++++----- .../src/main/resources/icon/grasses.svg | 8 ++-- .../src/main/resources/icon/hazel.svg | 2 +- .../src/main/resources/icon/hornbeam.svg | 2 +- .../src/main/resources/icon/linden.svg | 2 +- .../src/main/resources/icon/oak.svg | 2 +- .../src/main/resources/icon/olive.svg | 2 +- .../src/main/resources/icon/plane.svg | 8 ++-- .../src/main/resources/icon/plantain.svg | 2 +- .../src/main/resources/icon/pollen-0.svg | 5 +++ .../src/main/resources/icon/pollen-1.svg | 5 +++ .../src/main/resources/icon/pollen-2.svg | 5 +++ .../src/main/resources/icon/pollen-3.svg | 5 +++ .../src/main/resources/icon/pollen-4.svg | 5 +++ .../src/main/resources/icon/pollen-5.svg | 5 +++ .../src/main/resources/icon/pollen.svg | 6 +++ .../src/main/resources/icon/poplar.svg | 4 +- .../src/main/resources/icon/ragweed.svg | 2 +- .../src/main/resources/icon/rumex.svg | 2 +- .../src/main/resources/icon/urticaceae.svg | 6 +-- .../src/main/resources/icon/willow.svg | 4 +- .../src/main/resources/icon/wormwood.svg | 2 +- 62 files changed, 225 insertions(+), 178 deletions(-) create mode 100644 bundles/org.openhab.binding.airparif/doc/images/pollen.svg create mode 100644 bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-0.svg create mode 100644 bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-1.svg create mode 100644 bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-2.svg create mode 100644 bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-3.svg create mode 100644 bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-4.svg create mode 100644 bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-5.svg create mode 100644 bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen.svg diff --git a/bundles/org.openhab.binding.airparif/README.md b/bundles/org.openhab.binding.airparif/README.md index 089cc6c1dc..9c48616959 100755 --- a/bundles/org.openhab.binding.airparif/README.md +++ b/bundles/org.openhab.binding.airparif/README.md @@ -127,29 +127,29 @@ Please check that proposed value is correct according to the place. This binding has its own IconProvider and makes available the following list of icons -| Icon Name | Dynamic | Illustration | -|------------------------|---------|--------------| -| oh:airparif:aq | Yes | ![Air Quality](doc/images/aq.svg) | -| oh:airparif:alder | Yes | ![Alder](doc/images/alder.svg) | -| oh:airparif:ash | Yes | ![Ash](doc/images/ash.svg) | -| oh:airparif:birch | Yes | ![Birch](doc/images/birch.svg) | -| oh:airparif:chestnut | Yes | ![Chestnut](doc/images/chestnut.svg) | -| oh:airparif:cypress | Yes | ![Cypress](doc/images/cypress.svg) | -| oh:airparif:grasses | Yes | ![Grasses](doc/images/grasses.svg) | -| oh:airparif:hazel | Yes | ![Hazel](doc/images/hazel.svg) | -| oh:airparif:hornbeam | Yes | ![Hornbeam](doc/images/hornbeam.svg) | -| oh:airparif:linden | Yes | ![Linden](doc/images/linden.svg) | -| oh:airparif:oak | Yes | ![Oak](doc/images/oak.svg) | -| oh:airparif:olive | Yes | ![Olive](doc/images/olive.svg) | -| oh:airparif:plane | Yes | ![Plane](doc/images/plane.svg) | -| oh:airparif:plantain | Yes | ![Plantain](doc/images/plantain.svg) | -| oh:airparif:pollen | Yes | x | -| oh:airparif:poplar | Yes | ![Poplar](doc/images/poplar.svg) | -| oh:airparif:ragweed | Yes | ![Ragweed](doc/images/ragweed.svg) | -| oh:airparif:rumex | Yes | ![Rumex](doc/images/rumex.svg) | +| Icon Name | Dynamic | Illustration | +|------------------------|---------|------------------------------------------| +| oh:airparif:aq | Yes | ![Air Quality](doc/images/aq.svg) | +| oh:airparif:pollen | Yes | ![Air Quality](doc/images/pollen.svg) | +| oh:airparif:alder | Yes | ![Alder](doc/images/alder.svg) | +| oh:airparif:ash | Yes | ![Ash](doc/images/ash.svg) | +| oh:airparif:birch | Yes | ![Birch](doc/images/birch.svg) | +| oh:airparif:chestnut | Yes | ![Chestnut](doc/images/chestnut.svg) | +| oh:airparif:cypress | Yes | ![Cypress](doc/images/cypress.svg) | +| oh:airparif:grasses | Yes | ![Grasses](doc/images/grasses.svg) | +| oh:airparif:hazel | Yes | ![Hazel](doc/images/hazel.svg) | +| oh:airparif:hornbeam | Yes | ![Hornbeam](doc/images/hornbeam.svg) | +| oh:airparif:linden | Yes | ![Linden](doc/images/linden.svg) | +| oh:airparif:oak | Yes | ![Oak](doc/images/oak.svg) | +| oh:airparif:olive | Yes | ![Olive](doc/images/olive.svg) | +| oh:airparif:plane | Yes | ![Plane](doc/images/plane.svg) | +| oh:airparif:plantain | Yes | ![Plantain](doc/images/plantain.svg) | +| oh:airparif:poplar | Yes | ![Poplar](doc/images/poplar.svg) | +| oh:airparif:ragweed | Yes | ![Ragweed](doc/images/ragweed.svg) | +| oh:airparif:rumex | Yes | ![Rumex](doc/images/rumex.svg) | | oh:airparif:urticaceae | Yes | ![Urticaceae](doc/images/urticaceae.svg) | -| oh:airparif:willow | Yes | ![Willow](doc/images/willow.svg) | -| oh:airparif:wormwood | Yes | ![Wormwood](doc/images/wormwood.svg) | +| oh:airparif:willow | Yes | ![Willow](doc/images/willow.svg) | +| oh:airparif:wormwood | Yes | ![Wormwood](doc/images/wormwood.svg) | ## Full Example diff --git a/bundles/org.openhab.binding.airparif/doc/images/alder.svg b/bundles/org.openhab.binding.airparif/doc/images/alder.svg index ea5fc88483..30cc5e33a0 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/alder.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/alder.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/doc/images/aq.svg b/bundles/org.openhab.binding.airparif/doc/images/aq.svg index 056c569a4a..8fc376eb4c 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/aq.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/aq.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/doc/images/ash.svg b/bundles/org.openhab.binding.airparif/doc/images/ash.svg index 9c10179746..618f3c0b11 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/ash.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/ash.svg @@ -1,19 +1,19 @@ - - - - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/doc/images/birch.svg b/bundles/org.openhab.binding.airparif/doc/images/birch.svg index f8ff505f3b..54604c9793 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/birch.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/birch.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/doc/images/chestnut.svg b/bundles/org.openhab.binding.airparif/doc/images/chestnut.svg index 8cb9360bf6..57f5188ffc 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/chestnut.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/chestnut.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/doc/images/cypress.svg b/bundles/org.openhab.binding.airparif/doc/images/cypress.svg index 0cc76819ac..5311089b19 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/cypress.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/cypress.svg @@ -1,14 +1,11 @@ - - - - - + + + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/doc/images/grasses.svg b/bundles/org.openhab.binding.airparif/doc/images/grasses.svg index ae6279fd10..74ddca07b0 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/grasses.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/grasses.svg @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/doc/images/hazel.svg b/bundles/org.openhab.binding.airparif/doc/images/hazel.svg index e2dd22c17f..acfba4a13e 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/hazel.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/hazel.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/doc/images/hornbeam.svg b/bundles/org.openhab.binding.airparif/doc/images/hornbeam.svg index 3a7d995bfa..501877ee77 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/hornbeam.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/hornbeam.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/doc/images/linden.svg b/bundles/org.openhab.binding.airparif/doc/images/linden.svg index c10749ecd9..7dc5db9eab 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/linden.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/linden.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/doc/images/oak.svg b/bundles/org.openhab.binding.airparif/doc/images/oak.svg index 343163e1a0..a7ee6cfd42 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/oak.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/oak.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/doc/images/olive.svg b/bundles/org.openhab.binding.airparif/doc/images/olive.svg index 719798a0fb..820ef168ce 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/olive.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/olive.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/doc/images/plane.svg b/bundles/org.openhab.binding.airparif/doc/images/plane.svg index ab64767b0f..ef1bddb7e9 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/plane.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/plane.svg @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/doc/images/plantain.svg b/bundles/org.openhab.binding.airparif/doc/images/plantain.svg index 740cf781f0..8907a5f429 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/plantain.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/plantain.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/doc/images/pollen.svg b/bundles/org.openhab.binding.airparif/doc/images/pollen.svg new file mode 100644 index 0000000000..f03f3420d2 --- /dev/null +++ b/bundles/org.openhab.binding.airparif/doc/images/pollen.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/doc/images/poplar.svg b/bundles/org.openhab.binding.airparif/doc/images/poplar.svg index 5cd534d8b3..d582efa92d 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/poplar.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/poplar.svg @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/doc/images/ragweed.svg b/bundles/org.openhab.binding.airparif/doc/images/ragweed.svg index 0beffb9f6f..9da22d6825 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/ragweed.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/ragweed.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/doc/images/rumex.svg b/bundles/org.openhab.binding.airparif/doc/images/rumex.svg index d3607e52a3..73194f0e80 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/rumex.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/rumex.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/doc/images/urticaceae.svg b/bundles/org.openhab.binding.airparif/doc/images/urticaceae.svg index 07c76f9012..c1b8b69052 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/urticaceae.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/urticaceae.svg @@ -1,12 +1,12 @@ - + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/doc/images/wormwood.svg b/bundles/org.openhab.binding.airparif/doc/images/wormwood.svg index 9c02ae1e2e..c8c8c90f6d 100755 --- a/bundles/org.openhab.binding.airparif/doc/images/wormwood.svg +++ b/bundles/org.openhab.binding.airparif/doc/images/wormwood.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/AirParifIconProvider.java b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/AirParifIconProvider.java index 41d17e85b9..f5b0efa57d 100755 --- a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/AirParifIconProvider.java +++ b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/AirParifIconProvider.java @@ -51,6 +51,7 @@ public class AirParifIconProvider implements IconProvider { private static final String NEUTRAL_COLOR = "#3d3c3c"; private static final String DEFAULT_LABEL = "AirParif Icons"; private static final String AQ_ICON = "aq"; + private static final String POLLEN_ICON = "pollen"; private static final String DEFAULT_DESCRIPTION = "Icons illustrating air quality levels provided by AirParif"; private static final List POLLEN_ICONS = Pollen.AS_SET.stream().map(Pollen::name).map(String::toLowerCase) .toList(); @@ -86,7 +87,8 @@ public class AirParifIconProvider implements IconProvider { @Override public @Nullable Integer hasIcon(String category, String iconSetId, Format format) { return Format.SVG.equals(format) && iconSetId.equals(BINDING_ID) - && (category.equals(AQ_ICON) || POLLEN_ICONS.contains(category)) ? 0 : null; + && (category.equals(AQ_ICON) || category.equals(POLLEN_ICON) || POLLEN_ICONS.contains(category)) ? 0 + : null; } @Override @@ -100,22 +102,24 @@ public class AirParifIconProvider implements IconProvider { String iconName = "icon/%s.svg".formatted(category); if (category.equals(AQ_ICON) && ordinal != -1 && ordinal < Appreciation.values().length - 2) { iconName = iconName.replace(".", "-%d.".formatted(ordinal)); + } else if (category.equals(POLLEN_ICON) && ordinal != -1) { + iconName = iconName.replace(".", "-%d.".formatted(ordinal)); } - URL iconResource = bundle.getEntry(iconName); - String result = ""; - try (InputStream stream = iconResource.openStream()) { - result = new String(stream.readAllBytes(), StandardCharsets.UTF_8); + URL iconResource = bundle.getEntry(iconName); + if (iconResource != null) { + try (InputStream stream = iconResource.openStream()) { + result = new String(stream.readAllBytes(), StandardCharsets.UTF_8); - if (POLLEN_ICONS.contains(category)) { - PollenAlertLevel alertLevel = PollenAlertLevel.valueOf(ordinal); - result = result.replaceAll(NEUTRAL_COLOR, alertLevel.color); + if (POLLEN_ICONS.contains(category)) { + PollenAlertLevel alertLevel = PollenAlertLevel.valueOf(ordinal); + result = result.replaceAll(NEUTRAL_COLOR, alertLevel.color); + } + } catch (IOException e) { + logger.warn("Unable to load ressource '{}': {}", iconResource.getPath(), e.getMessage()); } - } catch (IOException e) { - logger.warn("Unable to load ressource '{}': {}", iconResource.getPath(), e.getMessage()); } - return result.isEmpty() ? null : new ByteArrayInputStream(result.getBytes()); } } diff --git a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/api/AirParifApi.java b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/api/AirParifApi.java index a0e62e2084..6d90006d2d 100644 --- a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/api/AirParifApi.java +++ b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/api/AirParifApi.java @@ -41,6 +41,8 @@ public class AirParifApi { private static final UriBuilder POLLENS_BUILDER = AIRPARIF_BUILDER.clone().path("pollens"); public static final URI POLLENS_URI = POLLENS_BUILDER.clone().path("bulletin").build(); + public static final String INTINERAIRES_REQUEST = "{\"itineraires\": [{\"date\": \"%s\",\"longlats\": [[%s,%s]]}],\"polluants\": [\"indice\",\"no2\",\"o3\",\"pm25\",\"pm10\"]}"; + public enum Scope { @SerializedName("Cartes et résultats Hor'Air") MAPS, diff --git a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/api/AirParifDto.java b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/api/AirParifDto.java index 47010e1cb0..abbebe9ed8 100644 --- a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/api/AirParifDto.java +++ b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/api/AirParifDto.java @@ -130,16 +130,17 @@ public class AirParifDto { } public class PollensResponse { - private static DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yy"); - private static Pattern PATTERN = Pattern.compile("\\d{2}.\\d{2}.\\d{2}"); - private static ZoneId DEFAULT_ZONE = ZoneId.of("Europe/Paris"); + private final static DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yy"); + private final static Pattern PATTERN = Pattern.compile("\\d{2}.\\d{2}.\\d{2}"); + private final static ZoneId DEFAULT_ZONE = ZoneId.of("Europe/Paris"); - public List data = List.of(); + private @Nullable List data; private @Nullable Instant beginValidity; private @Nullable Instant endValidity; public Optional getData() { - return Optional.ofNullable(data.isEmpty() ? null : data.get(0)); + List localData = data; + return Optional.ofNullable(localData == null || localData.isEmpty() ? null : localData.get(0)); } private Set getValidities() { @@ -156,7 +157,7 @@ public class AirParifDto { public Optional getBeginValidity() { if (beginValidity == null) { - beginValidity = getValidities().iterator().next(); + beginValidity = getValidities().stream().reduce((prev, next) -> prev).orElse(null); } return Optional.ofNullable(beginValidity); } diff --git a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/db/DepartmentDbService.java b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/db/DepartmentDbService.java index ea1c9dd286..648c3a49d7 100644 --- a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/db/DepartmentDbService.java +++ b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/db/DepartmentDbService.java @@ -24,6 +24,8 @@ import java.util.List; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.core.library.types.PointType; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,6 +41,7 @@ import com.google.gson.JsonSyntaxException; * @author Gaël L'hopital - Initial Contribution */ +@Component(service = DepartmentDbService.class) @NonNullByDefault public class DepartmentDbService { private final Logger logger = LoggerFactory.getLogger(DepartmentDbService.class); @@ -48,6 +51,7 @@ public class DepartmentDbService { double westestLon) { } + @Activate public DepartmentDbService() { try (InputStream is = Thread.currentThread().getContextClassLoader() .getResourceAsStream("/db/departments.json"); diff --git a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/discovery/AirParifDiscoveryService.java b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/discovery/AirParifDiscoveryService.java index 1164b819f9..d40eba08a3 100755 --- a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/discovery/AirParifDiscoveryService.java +++ b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/discovery/AirParifDiscoveryService.java @@ -27,6 +27,7 @@ import org.openhab.core.config.discovery.DiscoveryResultBuilder; import org.openhab.core.i18n.LocationProvider; import org.openhab.core.library.types.PointType; import org.openhab.core.thing.ThingUID; +import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.ServiceScope; @@ -44,25 +45,22 @@ public class AirParifDiscoveryService extends AbstractThingHandlerDiscoveryServi private static final int DISCOVER_TIMEOUT_SECONDS = 2; private final Logger logger = LoggerFactory.getLogger(AirParifDiscoveryService.class); - private final DepartmentDbService dbService = new DepartmentDbService(); + private final LocationProvider locationProvider; + private final DepartmentDbService dbService; - private @NonNullByDefault({}) LocationProvider locationProvider; - - public AirParifDiscoveryService() { + @Activate + public AirParifDiscoveryService(@Reference LocationProvider locationProvider, + @Reference DepartmentDbService dbService) { super(AirParifBridgeHandler.class, Set.of(LOCATION_THING_TYPE), DISCOVER_TIMEOUT_SECONDS); - } - - @Reference(unbind = "-") - public void setLocationProvider(LocationProvider locationProvider) { this.locationProvider = locationProvider; + this.dbService = dbService; } @Override public void startScan() { logger.debug("Starting AirParif discovery scan"); - LocationProvider localLocation = locationProvider; - PointType location = localLocation != null ? localLocation.getLocation() : null; + PointType location = locationProvider.getLocation(); if (location == null) { logger.warn("LocationProvider.getLocation() is not set -> Will not provide any discovery results"); return; diff --git a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/handler/AirParifBridgeHandler.java b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/handler/AirParifBridgeHandler.java index 4b63596dde..c3637e2083 100755 --- a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/handler/AirParifBridgeHandler.java +++ b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/handler/AirParifBridgeHandler.java @@ -153,6 +153,9 @@ public class AirParifBridgeHandler extends BaseBridgeHandler implements HandlerU return content; } else if (statusCode == Code.FORBIDDEN) { throw new AirParifException("@text/offline.config-error-invalid-apikey"); + } else if (statusCode == Code.SERVICE_UNAVAILABLE) { + logger.debug("{}, returning empty DTO", statusCode.getMessage()); + return "{}"; } throw new AirParifException("Error '%s' requesting: %s", statusCode.getMessage(), uri.toString()); } catch (TimeoutException | ExecutionException e) { @@ -196,7 +199,7 @@ public class AirParifBridgeHandler extends BaseBridgeHandler implements HandlerU thing.setProperty("api-version", version.version()); thing.setProperty("key-expiration", keyInfo.expiration().toString()); - thing.setProperty("scopes", keyInfo.scopes().stream().map(e -> e.name()).collect(Collectors.joining(","))); + thing.setProperty("scopes", keyInfo.scopes().stream().map(Enum::name).collect(Collectors.joining(","))); logger.debug("The api key is valid until {}", keyInfo.expiration().toString()); updateStatus(ThingStatus.ONLINE); @@ -288,8 +291,8 @@ public class AirParifBridgeHandler extends BaseBridgeHandler implements HandlerU public @Nullable Route getConcentrations(String location) { String[] elements = location.split(","); if (elements.length >= 2) { - String req = "{\"itineraires\": [{\"date\": \"%s\",\"longlats\": [[%s,%s]]}],\"polluants\": [\"indice\",\"no2\",\"o3\",\"pm25\",\"pm10\"]}"; - req = req.formatted(LocalDateTime.now().truncatedTo(ChronoUnit.HOURS), elements[1], elements[0]); + String req = INTINERAIRES_REQUEST.formatted(LocalDateTime.now().truncatedTo(ChronoUnit.HOURS), elements[1], + elements[0]); try { ItineraireResponse result = executeUri(HORAIR_URI, ItineraireResponse.class, req); return result.routes()[0]; diff --git a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/handler/HandlerUtils.java b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/handler/HandlerUtils.java index e301f872f1..4ab76e6050 100644 --- a/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/handler/HandlerUtils.java +++ b/bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/handler/HandlerUtils.java @@ -48,9 +48,8 @@ public interface HandlerUtils { if (bridgeHandler != null) { if (bridgeHandler.getClass() == clazz) { return (T) bridgeHandler; - } else { - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, "@text/incorrect-bridge"); } + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, "@text/incorrect-bridge"); } else { updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, "@text/incorrect-bridge"); } diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/alder.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/alder.svg index ea5fc88483..30cc5e33a0 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/alder.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/alder.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-0.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-0.svg index 80e94fe7fd..f64c4e1486 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-0.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-0.svg @@ -1,4 +1,4 @@ - + + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-2.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-2.svg index a7b3aa5ac8..9c275cd0e3 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-2.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-2.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-3.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-3.svg index 547740458c..cea0c40423 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-3.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-3.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-4.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-4.svg index 8db5142887..33541b393d 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-4.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/aq-4.svg @@ -1,4 +1,4 @@ - + + + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/ash.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/ash.svg index 9c10179746..618f3c0b11 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/ash.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/ash.svg @@ -1,19 +1,19 @@ - - - - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/birch.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/birch.svg index f8ff505f3b..54604c9793 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/birch.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/birch.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/chestnut.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/chestnut.svg index 8cb9360bf6..57f5188ffc 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/chestnut.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/chestnut.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/cypress.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/cypress.svg index 0cc76819ac..5311089b19 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/cypress.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/cypress.svg @@ -1,14 +1,11 @@ - - - - - + + + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/grasses.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/grasses.svg index ae6279fd10..74ddca07b0 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/grasses.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/grasses.svg @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/hazel.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/hazel.svg index e2dd22c17f..acfba4a13e 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/hazel.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/hazel.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/hornbeam.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/hornbeam.svg index 3a7d995bfa..501877ee77 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/hornbeam.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/hornbeam.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/linden.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/linden.svg index c10749ecd9..7dc5db9eab 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/linden.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/linden.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/oak.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/oak.svg index 343163e1a0..a7ee6cfd42 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/oak.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/oak.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/olive.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/olive.svg index 719798a0fb..820ef168ce 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/olive.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/olive.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/plane.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/plane.svg index ab64767b0f..ef1bddb7e9 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/plane.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/plane.svg @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/plantain.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/plantain.svg index 740cf781f0..8907a5f429 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/plantain.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/plantain.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-0.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-0.svg new file mode 100644 index 0000000000..2ccad4ff20 --- /dev/null +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-0.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-1.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-1.svg new file mode 100644 index 0000000000..17c4bd8248 --- /dev/null +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-1.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-2.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-2.svg new file mode 100644 index 0000000000..ecde6941f8 --- /dev/null +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-2.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-3.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-3.svg new file mode 100644 index 0000000000..38ac475918 --- /dev/null +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-3.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-4.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-4.svg new file mode 100644 index 0000000000..693058a527 --- /dev/null +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-4.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-5.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-5.svg new file mode 100644 index 0000000000..7168a49cfc --- /dev/null +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen-5.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen.svg new file mode 100644 index 0000000000..f03f3420d2 --- /dev/null +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/pollen.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/poplar.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/poplar.svg index 5cd534d8b3..d582efa92d 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/poplar.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/poplar.svg @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/ragweed.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/ragweed.svg index 0beffb9f6f..9da22d6825 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/ragweed.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/ragweed.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/rumex.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/rumex.svg index d3607e52a3..73194f0e80 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/rumex.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/rumex.svg @@ -1,4 +1,4 @@ - + diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/urticaceae.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/urticaceae.svg index 07c76f9012..c1b8b69052 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/urticaceae.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/urticaceae.svg @@ -1,12 +1,12 @@ - + + \ No newline at end of file diff --git a/bundles/org.openhab.binding.airparif/src/main/resources/icon/wormwood.svg b/bundles/org.openhab.binding.airparif/src/main/resources/icon/wormwood.svg index 9c02ae1e2e..c8c8c90f6d 100755 --- a/bundles/org.openhab.binding.airparif/src/main/resources/icon/wormwood.svg +++ b/bundles/org.openhab.binding.airparif/src/main/resources/icon/wormwood.svg @@ -1,4 +1,4 @@ - +