Skip to content

Commit c26c091

Browse files
committed
Code review corrections
Signed-off-by: Gaël L'hopital <[email protected]>
1 parent 51a95df commit c26c091

File tree

12 files changed

+111
-58
lines changed

12 files changed

+111
-58
lines changed

bundles/org.openhab.binding.airparif/README.md

+63-6
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ Please check that proposed value is correct according to the place.
6161
| aq-bulletin-tomorrow | pm10-max | Number:Density | R | Maximum level of PM 10 concentration |
6262
| aq-bulletin-tomorrow | pm25-min | Number:Density | R | Minimum level of PM 2.5 concentration |
6363
| aq-bulletin-tomorrow | pm25-max | Number:Density | R | Maximum level of PM 2.5 concentration |
64-
| daily | message | String | R | Today's daily general information ||| daily | tomorrow | String | R | Tomorrow's daily general information |
64+
| daily | message | String | R | Today's daily general information |
65+
| daily | tomorrow | String | R | Tomorrow's daily general information |
6566

6667
### `location` Thing Channels
6768

@@ -150,19 +151,75 @@ This binding has its own IconProvider and makes available the following list of
150151
| oh:airparif:willow | Yes | ![](doc/images/willow.svg) |
151152
| oh:airparif:wormwood | Yes | ![](doc/images/wormwood.svg) |
152153

153-
154154
## Full Examplee
155155

156156
### Thing Configurationn
157157

158-
```jav
158+
```java
159159
Bridge airparif:api:local "AirParif" [ apikey="xxxxx-dddd-cccc-4321-zzzzzzzzzzzzz" ] {
160-
location yvelines "Yvelines" [ department="78", location="52.639,1.8284" ]
161-
}a
160+
location 78 "Yvelines" [ department="78", location="52.639,1.8284" ]
161+
}
162162
```
163163
### Item Configurationn
164164

165165
```java
166-
Example item configuration goes here.
166+
String AirParifPollensComment "Situation" {channel="airparif:api:local:pollens#comment"}
167+
DateTime AirParifPollensBeginValidity "Begin validity" {channel="airparif:api:local:pollens#begin-validity"}
168+
DateTime AirParifPollensEndValidity "End validity" {channel="airparif:api:local:pollens#end-validity"}
169+
String AirParifAqBulletinComment "Message" {channel="airparif:api:local:aq-bulletin#comment"}
170+
Number:Density AirParifAqBulletinNo2Min "No2 min" {channel="airparif:api:local:aq-bulletin#no2-min"}
171+
Number:Density AirParifAqBulletinNo2Max "No2 max" {channel="airparif:api:local:aq-bulletin#no2-max"}
172+
Number:Density AirParifAqBulletinO3Min "O3 min" {channel="airparif:api:local:aq-bulletin#o3-min"}
173+
Number:Density AirParifAqBulletinO3Max "O3 max" {channel="airparif:api:local:aq-bulletin#o3-max"}
174+
Number:Density AirParifAqBulletinPm10Min "Pm 10 min" {channel="airparif:api:local:aq-bulletin#pm10-min"}
175+
Number:Density AirParifAqBulletinPm10Max "Pm 10 max" {channel="airparif:api:local:aq-bulletin#pm10-max"}
176+
Number:Density AirParifAqBulletinPm25Min "Pm 2.5 min" {channel="airparif:api:local:aq-bulletin#pm25-min"}
177+
Number:Density AirParifAqBulletinPm25Max "Pm 2.5 max" {channel="airparif:api:local:aq-bulletin#pm25-max"}
178+
String AirParifAqBulletinTomorrowComment "Message" {channel="airparif:api:local:aq-bulletin-tomorrow#comment"}
179+
Number:Density AirParifAqBulletinTomorrowNo2Min "No2 min" {channel="airparif:api:local:aq-bulletin-tomorrow#no2-min"}
180+
Number:Density AirParifAqBulletinTomorrowNo2Max "No2 max" {channel="airparif:api:local:aq-bulletin-tomorrow#no2-max"}
181+
Number:Density AirParifAqBulletinTomorrowO3Min "O3 min" {channel="airparif:api:local:aq-bulletin-tomorrow#o3-min"}
182+
Number:Density AirParifAqBulletinTomorrowO3Max "O3 max" {channel="airparif:api:local:aq-bulletin-tomorrow#o3-max"}
183+
Number:Density AirParifAqBulletinTomorrowPm10Min "Pm 10 min" {channel="airparif:api:local:aq-bulletin-tomorrow#pm10-min"}
184+
Number:Density AirParifAqBulletinTomorrowPm10Max "Pm 10 max" {channel="airparif:api:local:aq-bulletin-tomorrow#pm10-max"}
185+
Number:Density AirParifAqBulletinTomorrowPm25Min "Pm 2.5 min" {channel="airparif:api:local:aq-bulletin-tomorrow#pm25-min"}
186+
Number:Density AirParifAqBulletinTomorrowPm25Max "Pm 2.5 max" {channel="airparif:api:local:aq-bulletin-tomorrow#pm25-max"}
187+
String AirParifDailyMessage "Message" {channel="airparif:api:local:daily#message"}
188+
String AirParifDailyTomorrow "Tomorrow" {channel="airparif:api:local:daily#tomorrow"}
189+
190+
Number Yvelines_Pollens_Cypress "Cypress" {channel="airparif:location:local:78:pollens#cypress"}
191+
Number Yvelines_Pollens_Hazel "Hazel level" {channel="airparif:location:local:78:pollens#hazel"}
192+
Number Yvelines_Pollens_Alder "Alder" {channel="airparif:location:local:78:pollens#alder"}
193+
Number Yvelines_Pollens_Poplar "Poplar" {channel="airparif:location:local:78:pollens#poplar"}
194+
Number Yvelines_Pollens_Willow "Willow" {channel="airparif:location:local:78:pollens#willow"}
195+
Number Yvelines_Pollens_Ash "Ash" {channel="airparif:location:local:78:pollens#ash"}
196+
Number Yvelines_Pollens_Hornbeam "Hornbeam" {channel="airparif:location:local:78:pollens#hornbeam"}
197+
Number Yvelines_Pollens_Birch "Birch level" {channel="airparif:location:local:78:pollens#birch"}
198+
Number Yvelines_Pollens_Plane "Plane" {channel="airparif:location:local:78:pollens#plane"}
199+
Number Yvelines_Pollens_Oak "Oak" {channel="airparif:location:local:78:pollens#oak"}
200+
Number Yvelines_Pollens_Olive "Olive" {channel="airparif:location:local:78:pollens#olive"}
201+
Number Yvelines_Pollens_Linden "Linden" {channel="airparif:location:local:78:pollens#linden"}
202+
Number Yvelines_Pollens_Chestnut "Chestnut" {channel="airparif:location:local:78:pollens#chestnut"}
203+
Number Yvelines_Pollens_Rumex "Rumex" {channel="airparif:location:local:78:pollens#rumex"}
204+
Number Yvelines_Pollens_Grasses "Grasses" {channel="airparif:location:local:78:pollens#grasses"}
205+
Number Yvelines_Pollens_Plantain "Plantain" {channel="airparif:location:local:78:pollens#plantain"}
206+
Number Yvelines_Pollens_Urticaceae "Urticacea" {channel="airparif:location:local:78:pollens#urticaceae"}
207+
Number Yvelines_Pollens_Wormwood "Wormwood" {channel="airparif:location:local:78:pollens#wormwood"}
208+
Number Yvelines_Pollens_Ragweed "Ragweed" {channel="airparif:location:local:78:pollens#ragweed"}
209+
String Yvelines_Indice_Message "Message" {channel="airparif:location:local:78:indice#message"}
210+
DateTime Yvelines_Indice_Timestamp "Timestamp" {channel="airparif:location:local:78:indice#timestamp"}
211+
Number Yvelines_Indice_Alert "Index" {channel="airparif:location:local:78:indice#alert"}
212+
String Yvelines_O3_Message "Message" {channel="airparif:location:local:78:o3#message"}
213+
Number:Density Yvelines_O3_Value "Concentration" {channel="airparif:location:local:78:o3#value"}
214+
Number Yvelines_O3_Alert "Alert level" {channel="airparif:location:local:78:o3#alert"}
215+
String Yvelines_No2_Message "Message" {channel="airparif:location:local:78:no2#message"}
216+
Number:Density Yvelines_No2_Value "Concentration" {channel="airparif:location:local:78:no2#value"}
217+
Number Yvelines_No2_Alert "Alert level" {channel="airparif:location:local:78:no2#alert"}
218+
String Yvelines_Pm25_Message "Message" {channel="airparif:location:local:78:pm25#message"}
219+
Number:Density Yvelines_Pm25_Value "Concentration" {channel="airparif:location:local:78:pm25#value"}
220+
Number Yvelines_Pm25_Alert "Alert level" {channel="airparif:location:local:78:pm25#alert"}
221+
String Yvelines_Pm10_Message "Message" {channel="airparif:location:local:78:pm10#message"}
222+
Number:Density Yvelines_Pm10_Value "Concentration" {channel="airparif:location:local:78:pm10#value"}
223+
Number Yvelines_Pm10_Alert "Alert level" {channel="airparif:location:local:78:pm10#alert"}
167224
``
168225

bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/AirParifHandlerFactory.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
import org.eclipse.jdt.annotation.NonNullByDefault;
1818
import org.eclipse.jdt.annotation.Nullable;
19-
import org.eclipse.jetty.client.HttpClient;
2019
import org.openhab.binding.airparif.internal.deserialization.AirParifDeserializer;
2120
import org.openhab.binding.airparif.internal.handler.AirParifBridgeHandler;
2221
import org.openhab.binding.airparif.internal.handler.LocationHandler;
@@ -40,12 +39,12 @@
4039
@Component(configurationPid = "binding.airparif", service = ThingHandlerFactory.class)
4140
public class AirParifHandlerFactory extends BaseThingHandlerFactory {
4241
private final AirParifDeserializer deserializer;
43-
private final HttpClient httpClient;
42+
private final HttpClientFactory httpClientFactory;
4443

4544
@Activate
4645
public AirParifHandlerFactory(final @Reference HttpClientFactory httpClientFactory,
4746
final @Reference AirParifDeserializer deserializer) {
48-
this.httpClient = httpClientFactory.getCommonHttpClient();
47+
this.httpClientFactory = httpClientFactory;
4948
this.deserializer = deserializer;
5049
}
5150

@@ -59,7 +58,7 @@ public boolean supportsThingType(ThingTypeUID thingTypeUID) {
5958
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
6059

6160
return APIBRIDGE_THING_TYPE.equals(thingTypeUID)
62-
? new AirParifBridgeHandler((Bridge) thing, httpClient, deserializer)
61+
? new AirParifBridgeHandler((Bridge) thing, httpClientFactory.getCommonHttpClient(), deserializer)
6362
: LOCATION_THING_TYPE.equals(thingTypeUID) ? new LocationHandler(thing) : null;
6463
}
6564
}

bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/api/AirParifApi.java

-4
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,6 @@ public class AirParifApi {
4141
private static final UriBuilder POLLENS_BUILDER = AIRPARIF_BUILDER.clone().path("pollens");
4242
public static final URI POLLENS_URI = POLLENS_BUILDER.clone().path("bulletin").build();
4343

44-
// Poor interest, only returns highest risk level for the dept.
45-
// public static final UriBuilder POLLENS_DEPT_BUILDER = POLLENS_BUILDER.clone().path("departement");
46-
// public static final URI PREV_COLORS_URI = INDICES_BUILDER.clone().path("couleurs").build();
47-
4844
public enum Scope {
4945
@SerializedName("Cartes et résultats Hor'Air")
5046
MAPS,

bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/api/AirParifDto.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
package org.openhab.binding.airparif.internal.api;
1414

1515
import java.time.Duration;
16+
import java.time.Instant;
1617
import java.time.LocalDate;
1718
import java.time.ZoneId;
18-
import java.time.ZonedDateTime;
1919
import java.time.format.DateTimeFormatter;
2020
import java.util.HashMap;
2121
import java.util.List;
@@ -54,7 +54,7 @@ public record Version(//
5454
}
5555

5656
public record KeyInfo(//
57-
ZonedDateTime expiration, //
57+
Instant expiration, //
5858
@SerializedName("droits") Set<Scope> scopes) {
5959
}
6060

@@ -135,33 +135,33 @@ public class PollensResponse {
135135
private static ZoneId DEFAULT_ZONE = ZoneId.of("Europe/Paris");
136136

137137
public List<Pollens> data = List.of();
138-
private @Nullable ZonedDateTime beginValidity;
139-
private @Nullable ZonedDateTime endValidity;
138+
private @Nullable Instant beginValidity;
139+
private @Nullable Instant endValidity;
140140

141141
public Optional<Pollens> getData() {
142142
return Optional.ofNullable(data.isEmpty() ? null : data.get(0));
143143
}
144144

145-
private Set<ZonedDateTime> getValidities() {
146-
Set<ZonedDateTime> validities = new TreeSet<>();
145+
private Set<Instant> getValidities() {
146+
Set<Instant> validities = new TreeSet<>();
147147
getData().ifPresent(pollens -> {
148148
Matcher matcher = PATTERN.matcher(pollens.periode);
149149
while (matcher.find()) {
150-
validities.add(LocalDate.parse(matcher.group(), FORMATTER).atStartOfDay(DEFAULT_ZONE));
150+
validities.add(LocalDate.parse(matcher.group(), FORMATTER).atStartOfDay(DEFAULT_ZONE).toInstant());
151151
}
152152
});
153153

154154
return validities;
155155
}
156156

157-
public Optional<ZonedDateTime> getBeginValidity() {
157+
public Optional<Instant> getBeginValidity() {
158158
if (beginValidity == null) {
159159
beginValidity = getValidities().iterator().next();
160160
}
161161
return Optional.ofNullable(beginValidity);
162162
}
163163

164-
public Optional<ZonedDateTime> getEndValidity() {
164+
public Optional<Instant> getEndValidity() {
165165
if (endValidity == null) {
166166
endValidity = getValidities().stream().reduce((prev, next) -> next).orElse(null);
167167
}
@@ -170,7 +170,7 @@ public Optional<ZonedDateTime> getEndValidity() {
170170

171171
public Duration getValidityDuration() {
172172
return Objects.requireNonNull(getEndValidity().map(end -> {
173-
Duration duration = Duration.between(ZonedDateTime.now().withZoneSameInstant(end.getZone()), end);
173+
Duration duration = Duration.between(Instant.now(), end);
174174
return duration.isNegative() ? Duration.ZERO : duration;
175175
}).orElse(Duration.ZERO));
176176
}
@@ -197,7 +197,7 @@ public Map<Pollen, PollenAlertLevel> getDepartment(String id) {
197197

198198
public record Concentration(//
199199
@SerializedName("polluant") Pollutant pollutant, //
200-
ZonedDateTime date, //
200+
Instant date, //
201201
@SerializedName("valeurs") double[] values, //
202202
@Nullable Message message) {
203203

@@ -224,7 +224,7 @@ public int getAlertLevel() {
224224
}
225225

226226
public record Route(//
227-
@SerializedName("dateRequise") ZonedDateTime requestedDate, //
227+
@SerializedName("dateRequise") Instant requestedDate, //
228228
double[][] longlats, //
229229
@SerializedName("resultats") List<Concentration> concentrations, //
230230
@Nullable Message[] messages) {

bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/deserialization/AirParifDeserializer.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,16 @@
1212
*/
1313
package org.openhab.binding.airparif.internal.deserialization;
1414

15+
import java.time.Instant;
1516
import java.time.LocalDate;
16-
import java.time.ZonedDateTime;
1717

1818
import org.eclipse.jdt.annotation.NonNullByDefault;
1919
import org.eclipse.jdt.annotation.Nullable;
2020
import org.openhab.binding.airparif.internal.AirParifException;
2121
import org.openhab.binding.airparif.internal.api.AirParifDto.PollutantConcentration;
2222
import org.openhab.binding.airparif.internal.api.PollenAlertLevel;
23-
import org.openhab.core.i18n.TimeZoneProvider;
2423
import org.osgi.service.component.annotations.Activate;
2524
import org.osgi.service.component.annotations.Component;
26-
import org.osgi.service.component.annotations.Reference;
2725

2826
import com.google.gson.FieldNamingPolicy;
2927
import com.google.gson.Gson;
@@ -42,18 +40,18 @@ public class AirParifDeserializer {
4240
private final Gson gson;
4341

4442
@Activate
45-
public AirParifDeserializer(final @Reference TimeZoneProvider timeZoneProvider) {
43+
public AirParifDeserializer() {
4644
gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.IDENTITY)
4745
.registerTypeAdapter(PollenAlertLevel.class, new PollenAlertLevelDeserializer())
4846
.registerTypeAdapterFactory(new StrictEnumTypeAdapterFactory())
4947
.registerTypeAdapter(PollutantConcentration.class, new PollutantConcentrationDeserializer())
5048
.registerTypeAdapter(LocalDate.class,
5149
(JsonDeserializer<LocalDate>) (json, type, context) -> LocalDate
5250
.parse(json.getAsJsonPrimitive().getAsString()))
53-
.registerTypeAdapter(ZonedDateTime.class, (JsonDeserializer<ZonedDateTime>) (json, type, context) -> {
51+
.registerTypeAdapter(Instant.class, (JsonDeserializer<Instant>) (json, type, context) -> {
5452
String string = json.getAsJsonPrimitive().getAsString();
5553
string += string.contains("+") ? "" : "Z";
56-
return ZonedDateTime.parse(string).withZoneSameInstant(timeZoneProvider.getTimeZone());
54+
return Instant.parse(string);
5755
}).create();
5856
}
5957

bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/deserialization/PollutantConcentrationDeserializer.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import org.eclipse.jdt.annotation.Nullable;
1919
import org.openhab.binding.airparif.internal.api.AirParifDto.PollutantConcentration;
2020
import org.openhab.binding.airparif.internal.api.Pollutant;
21+
import org.slf4j.Logger;
22+
import org.slf4j.LoggerFactory;
2123

2224
import com.google.gson.JsonArray;
2325
import com.google.gson.JsonDeserializationContext;
@@ -32,6 +34,7 @@
3234
*/
3335
@NonNullByDefault
3436
class PollutantConcentrationDeserializer implements JsonDeserializer<PollutantConcentration> {
37+
private final Logger logger = LoggerFactory.getLogger(PollutantConcentrationDeserializer.class);
3538

3639
@Override
3740
public @Nullable PollutantConcentration deserialize(JsonElement json, Type clazz,
@@ -44,7 +47,7 @@ class PollutantConcentrationDeserializer implements JsonDeserializer<PollutantCo
4447
try {
4548
result = new PollutantConcentration(pollutant, array.get(1).getAsInt(), array.get(2).getAsInt());
4649
} catch (JsonSyntaxException ignore) {
47-
// result will remain null
50+
logger.debug("Error deserializing PollutantConcentration: {}", json.toString());
4851
}
4952
}
5053
return result;

bundles/org.openhab.binding.airparif/src/main/java/org/openhab/binding/airparif/internal/discovery/AirParifDiscoveryService.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public void startScan() {
6464
LocationProvider localLocation = locationProvider;
6565
PointType location = localLocation != null ? localLocation.getLocation() : null;
6666
if (location == null) {
67-
logger.debug("LocationProvider.getLocation() is not set -> Will not provide any discovery results");
67+
logger.warn("LocationProvider.getLocation() is not set -> Will not provide any discovery results");
6868
return;
6969
}
7070

@@ -82,8 +82,6 @@ private void createDepartmentResults(PointType serverLocation) {
8282
.withProperty(LocationConfiguration.LOCATION, serverLocation.toFullString())//
8383
.withRepresentationProperty(LocationConfiguration.DEPARTMENT) //
8484
.withBridge(bridgeUID).build()));
85-
} else {
86-
logger.info("No department could be discovered matching server location");
8785
}
8886
}
8987
}

0 commit comments

Comments
 (0)