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
|
@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
|
||||||
|
@ -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() {
|
||||||
|
@ -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)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user