Skip to content

Commit

Permalink
Enhance error handling when no value is provided for Synop (#16024)
Browse files Browse the repository at this point in the history
Signed-off-by: clinique <gael@lhopital.org>
  • Loading branch information
clinique authored Dec 9, 2023
1 parent 6e9ef27 commit faf400e
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@
*/
@NonNullByDefault
public class SynopAnalyzerHandler extends BaseThingHandler {
private static final String DISTANCE = "Distance";
private static final String LOCATION = "Location";
private static final String USUAL_NAME = "Usual name";
private static final String OGIMET_SYNOP_PATH = "http://www.ogimet.com/cgi-bin/getsynop?block=%s&begin=%s";
private static final int REQUEST_TIMEOUT_MS = 5000;
private static final DateTimeFormatter SYNOP_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMddHH00");
Expand All @@ -91,9 +94,9 @@ public SynopAnalyzerHandler(Thing thing, LocationProvider locationProvider, List
@Override
public void initialize() {
SynopAnalyzerConfiguration configuration = getConfigAs(SynopAnalyzerConfiguration.class);
formattedStationId = String.format("%05d", configuration.stationId);
logger.info("Scheduling Synop update thread to run every {} minute for Station '{}'",
configuration.refreshInterval, formattedStationId);
formattedStationId = "%05d".formatted(configuration.stationId);
logger.info("Scheduling Synop update every {} minute for Station '{}'", configuration.refreshInterval,
formattedStationId);

if (thing.getProperties().isEmpty()) {
discoverAttributes(configuration.stationId, locationProvider.getLocation());
Expand All @@ -108,13 +111,13 @@ public void initialize() {
private void discoverAttributes(int stationId, @Nullable PointType serverLocation) {
stations.stream().filter(s -> stationId == s.idOmm).findFirst().ifPresent(station -> {
Map<String, String> properties = new HashMap<>(
Map.of("Usual name", station.usualName, "Location", station.getLocation()));
Map.of(USUAL_NAME, station.usualName, LOCATION, station.getLocation()));

if (serverLocation != null) {
PointType stationLocation = new PointType(station.getLocation());
DecimalType distance = serverLocation.distanceFrom(stationLocation);

properties.put("Distance", new QuantityType<>(distance, SIUnits.METRE).toString());
properties.put(DISTANCE, new QuantityType<>(distance, SIUnits.METRE).toString());
}
updateProperties(properties);
});
Expand All @@ -138,11 +141,11 @@ private Optional<Synop> getLastAvailableSynop() {

return createSynopObject(synopMessage);
}
logger.warn("Message does not belong to station {} : {}", formattedStationId, message);
logger.warn("Message does not belong to station {}: {}", formattedStationId, message);
}
logger.warn("No valid Synop found for last 24h");
} catch (IOException e) {
logger.warn("Synop request timedout : {}", e.getMessage());
logger.warn("Synop request timedout: {}", e.getMessage());
}
return Optional.empty();
}
Expand All @@ -163,6 +166,7 @@ private void updateChannels() {

private State getChannelState(String channelId, Synop synop) {
int octa = synop.getOcta();
Integer direction = synop.getWindDirection();
switch (channelId) {
case HORIZONTAL_VISIBILITY:
return new StringType(synop.getHorizontalVisibility().name());
Expand All @@ -183,9 +187,10 @@ private State getChannelState(String channelId, Synop synop) {
case TEMPERATURE:
return new QuantityType<>(synop.getTemperature(), TEMPERATURE_UNIT);
case WIND_ANGLE:
return new QuantityType<>(synop.getWindDirection(), WIND_DIRECTION_UNIT);
return direction != null ? new QuantityType<>(direction, WIND_DIRECTION_UNIT) : UnDefType.NULL;
case WIND_DIRECTION:
return new StringType(WindDirections.getWindDirection(synop.getWindDirection()).name());
return direction != null ? new StringType(WindDirections.getWindDirection(direction).name())
: UnDefType.NULL;
case WIND_STRENGTH:
return getWindStrength(synop);
case WIND_SPEED_BEAUFORT:
Expand All @@ -199,7 +204,7 @@ private State getChannelState(String channelId, Synop synop) {
return new DateTimeType(
ZonedDateTime.of(year, month, synop.getDay(), synop.getHour(), 0, 0, 0, ZoneOffset.UTC));
default:
logger.error("Unsupported channel Id '{}'", channelId);
logger.error("Unsupported channel '{}'", channelId);
return UnDefType.UNDEF;
}
}
Expand All @@ -226,7 +231,7 @@ private Optional<Synop> createSynopObject(String synopMessage) {
private String forgeURL() {
ZonedDateTime utc = ZonedDateTime.now(ZoneOffset.UTC).minusDays(1);
String beginDate = SYNOP_DATE_FORMAT.format(utc);
return String.format(OGIMET_SYNOP_PATH, formattedStationId, beginDate);
return OGIMET_SYNOP_PATH.formatted(formattedStationId, beginDate);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -292,8 +292,8 @@ public float getTemperature() {
return temperature;
}

public int getWindDirection() {
return windDirection;
public @Nullable Integer getWindDirection() {
return windDirection != INITIAL_VALUE ? windDirection : null;
}

public int getWindSpeed() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,14 @@ public enum WindDirections {
NW,
NNW;

private static final double STEP = 360.0 / values().length;

/**
* Returns the wind direction based on degree.
*/
public static WindDirections getWindDirection(int degree) {
double step = 360.0 / values().length;
double b = Math.floor((degree + (step / 2.0)) / step);

double b = Math.floor((degree + (STEP / 2.0)) / STEP);
return values()[(int) (b % values().length)];
}
}

0 comments on commit faf400e

Please sign in to comment.