Enhance error handling when no value is provided for Synop (#16024)

Signed-off-by: clinique <gael@lhopital.org>
This commit is contained in:
Gaël L'hopital 2023-12-09 22:31:15 +01:00 committed by GitHub
parent 6e9ef27006
commit faf400eb8d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 15 deletions

View File

@ -69,6 +69,9 @@ import org.slf4j.LoggerFactory;
*/ */
@NonNullByDefault @NonNullByDefault
public class SynopAnalyzerHandler extends BaseThingHandler { 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 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 int REQUEST_TIMEOUT_MS = 5000;
private static final DateTimeFormatter SYNOP_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMddHH00"); private static final DateTimeFormatter SYNOP_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMddHH00");
@ -91,9 +94,9 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
@Override @Override
public void initialize() { public void initialize() {
SynopAnalyzerConfiguration configuration = getConfigAs(SynopAnalyzerConfiguration.class); SynopAnalyzerConfiguration configuration = getConfigAs(SynopAnalyzerConfiguration.class);
formattedStationId = String.format("%05d", configuration.stationId); formattedStationId = "%05d".formatted(configuration.stationId);
logger.info("Scheduling Synop update thread to run every {} minute for Station '{}'", logger.info("Scheduling Synop update every {} minute for Station '{}'", configuration.refreshInterval,
configuration.refreshInterval, formattedStationId); formattedStationId);
if (thing.getProperties().isEmpty()) { if (thing.getProperties().isEmpty()) {
discoverAttributes(configuration.stationId, locationProvider.getLocation()); discoverAttributes(configuration.stationId, locationProvider.getLocation());
@ -108,13 +111,13 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
private void discoverAttributes(int stationId, @Nullable PointType serverLocation) { private void discoverAttributes(int stationId, @Nullable PointType serverLocation) {
stations.stream().filter(s -> stationId == s.idOmm).findFirst().ifPresent(station -> { stations.stream().filter(s -> stationId == s.idOmm).findFirst().ifPresent(station -> {
Map<String, String> properties = new HashMap<>( 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) { if (serverLocation != null) {
PointType stationLocation = new PointType(station.getLocation()); PointType stationLocation = new PointType(station.getLocation());
DecimalType distance = serverLocation.distanceFrom(stationLocation); 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); updateProperties(properties);
}); });
@ -138,11 +141,11 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
return createSynopObject(synopMessage); 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"); logger.warn("No valid Synop found for last 24h");
} catch (IOException e) { } catch (IOException e) {
logger.warn("Synop request timedout : {}", e.getMessage()); logger.warn("Synop request timedout: {}", e.getMessage());
} }
return Optional.empty(); return Optional.empty();
} }
@ -163,6 +166,7 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
private State getChannelState(String channelId, Synop synop) { private State getChannelState(String channelId, Synop synop) {
int octa = synop.getOcta(); int octa = synop.getOcta();
Integer direction = synop.getWindDirection();
switch (channelId) { switch (channelId) {
case HORIZONTAL_VISIBILITY: case HORIZONTAL_VISIBILITY:
return new StringType(synop.getHorizontalVisibility().name()); return new StringType(synop.getHorizontalVisibility().name());
@ -183,9 +187,10 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
case TEMPERATURE: case TEMPERATURE:
return new QuantityType<>(synop.getTemperature(), TEMPERATURE_UNIT); return new QuantityType<>(synop.getTemperature(), TEMPERATURE_UNIT);
case WIND_ANGLE: 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: 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: case WIND_STRENGTH:
return getWindStrength(synop); return getWindStrength(synop);
case WIND_SPEED_BEAUFORT: case WIND_SPEED_BEAUFORT:
@ -199,7 +204,7 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
return new DateTimeType( return new DateTimeType(
ZonedDateTime.of(year, month, synop.getDay(), synop.getHour(), 0, 0, 0, ZoneOffset.UTC)); ZonedDateTime.of(year, month, synop.getDay(), synop.getHour(), 0, 0, 0, ZoneOffset.UTC));
default: default:
logger.error("Unsupported channel Id '{}'", channelId); logger.error("Unsupported channel '{}'", channelId);
return UnDefType.UNDEF; return UnDefType.UNDEF;
} }
} }
@ -226,7 +231,7 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
private String forgeURL() { private String forgeURL() {
ZonedDateTime utc = ZonedDateTime.now(ZoneOffset.UTC).minusDays(1); ZonedDateTime utc = ZonedDateTime.now(ZoneOffset.UTC).minusDays(1);
String beginDate = SYNOP_DATE_FORMAT.format(utc); String beginDate = SYNOP_DATE_FORMAT.format(utc);
return String.format(OGIMET_SYNOP_PATH, formattedStationId, beginDate); return OGIMET_SYNOP_PATH.formatted(formattedStationId, beginDate);
} }
@Override @Override

View File

@ -292,8 +292,8 @@ public abstract class Synop {
return temperature; return temperature;
} }
public int getWindDirection() { public @Nullable Integer getWindDirection() {
return windDirection; return windDirection != INITIAL_VALUE ? windDirection : null;
} }
public int getWindSpeed() { public int getWindSpeed() {

View File

@ -38,12 +38,14 @@ public enum WindDirections {
NW, NW,
NNW; NNW;
private static final double STEP = 360.0 / values().length;
/** /**
* Returns the wind direction based on degree. * Returns the wind direction based on degree.
*/ */
public static WindDirections getWindDirection(int 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)]; return values()[(int) (b % values().length)];
} }
} }