[wundergroundupdatereceiver] Fix parsing of dateutc query parameter (#18415)

The parameter is formatted with 1 digit hours, spewing warnings into the log

Signed-off-by: Daniel Demus <daniel-github@demus.dk>
This commit is contained in:
Daniel Demus
2025-03-23 20:58:19 +01:00
committed by GitHub
parent 9fbc4bf3b2
commit 02b3daa17b
3 changed files with 13 additions and 13 deletions
@@ -14,7 +14,9 @@ package org.openhab.binding.wundergroundupdatereceiver.internal;
import static org.openhab.binding.wundergroundupdatereceiver.internal.WundergroundUpdateReceiverBindingConstants.*;
import java.time.ZonedDateTime;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -60,6 +62,9 @@ public class WundergroundUpdateReceiverHandler extends BaseThingHandler {
return config.stationId;
}
// The format can be "yyyy-MM-dd H:mm:ss" from the device
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd H:mm:ss");
private final Logger logger = LoggerFactory.getLogger(WundergroundUpdateReceiverHandler.class);
private final WundergroundUpdateReceiverServlet wundergroundUpdateReceiverServlet;
private final WundergroundUpdateReceiverDiscoveryService discoveryService;
@@ -183,8 +188,7 @@ public class WundergroundUpdateReceiverHandler extends BaseThingHandler {
private DateTimeType safeResolvUtcDateTime(String dateUtc) {
if (!dateUtc.isEmpty() && !NOW.equals(dateUtc)) {
try {
// Supposedly the format is "yyyy-MM-dd hh:mm:ss" from the device
return new DateTimeType(ZonedDateTime.parse(dateUtc.replace(" ", "T") + "Z"));
return new DateTimeType(LocalDateTime.parse(dateUtc, FORMATTER).atZone(ZoneOffset.UTC));
} catch (Exception ex) {
logger.warn("The device is submitting unparsable datetime values: {}", dateUtc);
}
@@ -192,10 +196,6 @@ public class WundergroundUpdateReceiverHandler extends BaseThingHandler {
return new DateTimeType();
}
public void updateChannelState(String channelId, String[] stateParts) {
updateChannelState(channelId, String.join("", stateParts));
}
public void updateChannelState(String parameterName, String state) {
Optional<Channel> channel = getThing().getChannels().stream()
.filter(ch -> parameterName.equals(ch.getUID().getIdWithoutGroup())).findFirst();
@@ -134,7 +134,7 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
}
@Test
void aRequestWithAnUnregisteredStationidIsAddedToTheQueueOnce()
void aRequestWithAnUnregisteredStationIdIsAddedToTheQueueOnce()
throws ServletException, NamespaceException, IOException {
// Given
final String queryString = """
@@ -179,7 +179,7 @@ class WundergroundUpdateReceiverServletTest {
}
@Test
void OnDisposeAllHandlersAreRemovedAndServletIsInactiveEvenThoughBackgroundDiscoveryIsEnabled()
void onDisposeAllHandlersAreRemovedAndServletIsInactiveEvenThoughBackgroundDiscoveryIsEnabled()
throws ServletException, NamespaceException {
// Given
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
@@ -249,7 +249,7 @@ class WundergroundUpdateReceiverServletTest {
// Given
ThingUID testThingUID = new ThingUID(WundergroundUpdateReceiverBindingConstants.THING_TYPE_UPDATE_RECEIVER,
"test-receiver");
final String queryString = "ID=dfggger&PASSWORD=XXXXXX&tempf=26.1&humidity=74&dewptf=18.9&windchillf=26.1&winddir=14&windspeedmph=1.34&windgustmph=2.46&rainin=0.00&dailyrainin=0.00&weeklyrainin=0.00&monthlyrainin=0.08&yearlyrainin=3.06&solarradiation=42.24&UV=1&indoortempf=69.3&indoorhumidity=32&baromin=30.39&AqNOX=21&lowbatt=1&dateutc=2021-02-07%2014:04:03&softwaretype=WH2600%20V2.2.8&action=updateraw&realtime=1&rtfreq=5";
final String queryString = "ID=dfggger&PASSWORD=XXXXXX&tempf=26.1&humidity=74&dewptf=18.9&windchillf=26.1&winddir=14&windspeedmph=1.34&windgustmph=2.46&rainin=0.00&dailyrainin=0.00&weeklyrainin=0.00&monthlyrainin=0.08&yearlyrainin=3.06&solarradiation=42.24&UV=1&indoortempf=69.3&indoorhumidity=32&baromin=30.39&AqNOX=21&lowbatt=1&dateutc=2021-02-07%209:04:03&softwaretype=WH2600%20V2.2.8&action=updateraw&realtime=1&rtfreq=5";
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
List<Channel> channels = List.of(
ChannelBuilder
@@ -337,7 +337,7 @@ class WundergroundUpdateReceiverServletTest {
// Then
verify(callback).stateUpdated(
new ChannelUID(TEST_THING_UID, METADATA_GROUP, WundergroundUpdateReceiverBindingConstants.DATEUTC),
StringType.valueOf("2021-02-07 14:04:03"));
StringType.valueOf("2021-02-07 9:04:03"));
verify(callback).stateUpdated(
new ChannelUID(TEST_THING_UID, METADATA_GROUP, WundergroundUpdateReceiverBindingConstants.LOW_BATTERY),
OnOffType.ON);
@@ -393,7 +393,7 @@ class WundergroundUpdateReceiverServletTest {
// Given
ThingUID testThingUID = new ThingUID(WundergroundUpdateReceiverBindingConstants.THING_TYPE_UPDATE_RECEIVER,
"test-receiver");
final String queryString = "ID=dfggger&PASSWORD=XXXXXX&temp1f=26.1&humidity=74&temp2f=25.1&lowbatt=1&soilmoisture1=78&soilmoisture2=73&dateutc=2021-02-07%2014:04:03&softwaretype=WH2600%20V2.2.8&action=updateraw&realtime=1&rtfreq=5";
final String queryString = "ID=dfggger&PASSWORD=XXXXXX&temp1f=26.1&humidity=74&temp2f=25.1&lowbatt=1&soilmoisture1=78&soilmoisture2=73&dateutc=2021-02-07%2004:04:03&softwaretype=WH2600%20V2.2.8&action=updateraw&realtime=1&rtfreq=5";
WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(discoveryService);
List<Channel> channels = List.of(
ChannelBuilder
@@ -451,7 +451,7 @@ class WundergroundUpdateReceiverServletTest {
// Then
verify(callback).stateUpdated(
new ChannelUID(TEST_THING_UID, METADATA_GROUP, WundergroundUpdateReceiverBindingConstants.DATEUTC),
StringType.valueOf("2021-02-07 14:04:03"));
StringType.valueOf("2021-02-07 04:04:03"));
verify(callback).stateUpdated(
new ChannelUID(TEST_THING_UID, METADATA_GROUP, WundergroundUpdateReceiverBindingConstants.LOW_BATTERY),
OnOffType.ON);