mirror of
https://github.com/openhab/openhab-addons.git
synced 2025-01-10 15:11:59 +01:00
Enhance error handling when no value is provided for Synop (#16024)
Signed-off-by: clinique <gael@lhopital.org>
This commit is contained in:
parent
6e9ef27006
commit
faf400eb8d
@ -69,6 +69,9 @@ import org.slf4j.LoggerFactory;
|
||||
*/
|
||||
@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");
|
||||
@ -91,9 +94,9 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
|
||||
@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());
|
||||
@ -108,13 +111,13 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
|
||||
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);
|
||||
});
|
||||
@ -138,11 +141,11 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
|
||||
|
||||
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();
|
||||
}
|
||||
@ -163,6 +166,7 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
|
||||
|
||||
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());
|
||||
@ -183,9 +187,10 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
|
||||
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:
|
||||
@ -199,7 +204,7 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -226,7 +231,7 @@ public class SynopAnalyzerHandler extends BaseThingHandler {
|
||||
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
|
||||
|
@ -292,8 +292,8 @@ public abstract class Synop {
|
||||
return temperature;
|
||||
}
|
||||
|
||||
public int getWindDirection() {
|
||||
return windDirection;
|
||||
public @Nullable Integer getWindDirection() {
|
||||
return windDirection != INITIAL_VALUE ? windDirection : null;
|
||||
}
|
||||
|
||||
public int getWindSpeed() {
|
||||
|
@ -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)];
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user