Consider TimeZoneProvider to build states for time-stamp channels (#13386)
Signed-off-by: Christoph Weitkamp <github@christophweitkamp.de>
This commit is contained in:
parent
b9761d0288
commit
a963c79e8b
|
@ -70,7 +70,7 @@ The Polling Interval and Online Timeout can be adjusted.
|
||||||
| emergency | String | Emergency call status |
|
| emergency | String | Emergency call status |
|
||||||
| service | String | Service Type |
|
| service | String | Service Type |
|
||||||
| preconditioning | String | Air conditioning status |
|
| preconditioning | String | Air conditioning status |
|
||||||
| preconditioningFailure | String | Airr conditioning failure cause |
|
| preconditioningFailure | String | Air conditioning failure cause |
|
||||||
| level | Number:Dimensionless | Fuel level |
|
| level | Number:Dimensionless | Fuel level |
|
||||||
| autonomy | Number:Length | Remaining distance |
|
| autonomy | Number:Length | Remaining distance |
|
||||||
| consumption | Number:VolumetricFlowRate | Fuel consumption |
|
| consumption | Number:VolumetricFlowRate | Fuel consumption |
|
||||||
|
|
|
@ -22,6 +22,7 @@ import org.eclipse.jetty.client.HttpClient;
|
||||||
import org.openhab.binding.groupepsa.internal.bridge.GroupePSABridgeHandler;
|
import org.openhab.binding.groupepsa.internal.bridge.GroupePSABridgeHandler;
|
||||||
import org.openhab.binding.groupepsa.internal.things.GroupePSAHandler;
|
import org.openhab.binding.groupepsa.internal.things.GroupePSAHandler;
|
||||||
import org.openhab.core.auth.client.oauth2.OAuthFactory;
|
import org.openhab.core.auth.client.oauth2.OAuthFactory;
|
||||||
|
import org.openhab.core.i18n.TimeZoneProvider;
|
||||||
import org.openhab.core.io.net.http.HttpClientFactory;
|
import org.openhab.core.io.net.http.HttpClientFactory;
|
||||||
import org.openhab.core.thing.Bridge;
|
import org.openhab.core.thing.Bridge;
|
||||||
import org.openhab.core.thing.Thing;
|
import org.openhab.core.thing.Thing;
|
||||||
|
@ -46,13 +47,16 @@ public class GroupePSAHandlerFactory extends BaseThingHandlerFactory {
|
||||||
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Set.of(THING_TYPE_BRIDGE, THING_TYPE_VEHICLE);
|
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Set.of(THING_TYPE_BRIDGE, THING_TYPE_VEHICLE);
|
||||||
|
|
||||||
private final OAuthFactory oAuthFactory;
|
private final OAuthFactory oAuthFactory;
|
||||||
protected final HttpClient httpClient;
|
private final HttpClient httpClient;
|
||||||
|
private final TimeZoneProvider timeZoneProvider;
|
||||||
|
|
||||||
@Activate
|
@Activate
|
||||||
public GroupePSAHandlerFactory(@Reference OAuthFactory oAuthFactory,
|
public GroupePSAHandlerFactory(final @Reference OAuthFactory oAuthFactory, //
|
||||||
@Reference HttpClientFactory httpClientFactory) {
|
final @Reference HttpClientFactory httpClientFactory, //
|
||||||
|
final @Reference TimeZoneProvider timeZoneProvider) {
|
||||||
this.oAuthFactory = oAuthFactory;
|
this.oAuthFactory = oAuthFactory;
|
||||||
this.httpClient = httpClientFactory.getCommonHttpClient();
|
this.httpClient = httpClientFactory.getCommonHttpClient();
|
||||||
|
this.timeZoneProvider = timeZoneProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -65,7 +69,7 @@ public class GroupePSAHandlerFactory extends BaseThingHandlerFactory {
|
||||||
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
|
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
|
||||||
|
|
||||||
if (THING_TYPE_VEHICLE.equals(thingTypeUID)) {
|
if (THING_TYPE_VEHICLE.equals(thingTypeUID)) {
|
||||||
return new GroupePSAHandler(thing);
|
return new GroupePSAHandler(thing, timeZoneProvider);
|
||||||
} else if (THING_TYPE_BRIDGE.equals(thingTypeUID)) {
|
} else if (THING_TYPE_BRIDGE.equals(thingTypeUID)) {
|
||||||
return new GroupePSABridgeHandler((Bridge) thing, oAuthFactory, httpClient);
|
return new GroupePSABridgeHandler((Bridge) thing, oAuthFactory, httpClient);
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,7 @@ import org.openhab.binding.groupepsa.internal.rest.api.dto.Safety;
|
||||||
import org.openhab.binding.groupepsa.internal.rest.api.dto.Service;
|
import org.openhab.binding.groupepsa.internal.rest.api.dto.Service;
|
||||||
import org.openhab.binding.groupepsa.internal.rest.api.dto.VehicleStatus;
|
import org.openhab.binding.groupepsa.internal.rest.api.dto.VehicleStatus;
|
||||||
import org.openhab.binding.groupepsa.internal.rest.exceptions.GroupePSACommunicationException;
|
import org.openhab.binding.groupepsa.internal.rest.exceptions.GroupePSACommunicationException;
|
||||||
|
import org.openhab.core.i18n.TimeZoneProvider;
|
||||||
import org.openhab.core.library.types.DateTimeType;
|
import org.openhab.core.library.types.DateTimeType;
|
||||||
import org.openhab.core.library.types.DecimalType;
|
import org.openhab.core.library.types.DecimalType;
|
||||||
import org.openhab.core.library.types.OpenClosedType;
|
import org.openhab.core.library.types.OpenClosedType;
|
||||||
|
@ -92,6 +93,8 @@ public class GroupePSAHandler extends BaseThingHandler {
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(GroupePSAHandler.class);
|
private final Logger logger = LoggerFactory.getLogger(GroupePSAHandler.class);
|
||||||
|
|
||||||
|
private final TimeZoneProvider timeZoneProvider;
|
||||||
|
|
||||||
private @Nullable String id = null;
|
private @Nullable String id = null;
|
||||||
private long lastQueryTimeNs = 0L;
|
private long lastQueryTimeNs = 0L;
|
||||||
|
|
||||||
|
@ -99,8 +102,9 @@ public class GroupePSAHandler extends BaseThingHandler {
|
||||||
private long maxQueryFrequencyNanos = TimeUnit.MINUTES.toNanos(1);
|
private long maxQueryFrequencyNanos = TimeUnit.MINUTES.toNanos(1);
|
||||||
private long onlineIntervalM;
|
private long onlineIntervalM;
|
||||||
|
|
||||||
public GroupePSAHandler(Thing thing) {
|
public GroupePSAHandler(Thing thing, TimeZoneProvider timeZoneProvider) {
|
||||||
super(thing);
|
super(thing);
|
||||||
|
this.timeZoneProvider = timeZoneProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -295,7 +299,7 @@ public class GroupePSAHandler extends BaseThingHandler {
|
||||||
if (lastPosition != null) {
|
if (lastPosition != null) {
|
||||||
Geometry<SinglePosition> geometry = lastPosition.getGeometry();
|
Geometry<SinglePosition> geometry = lastPosition.getGeometry();
|
||||||
if (geometry != null) {
|
if (geometry != null) {
|
||||||
SinglePosition position = (SinglePosition) geometry.positions();
|
SinglePosition position = geometry.positions();
|
||||||
if (Double.isFinite(position.alt())) {
|
if (Double.isFinite(position.alt())) {
|
||||||
updateState(CHANNEL_POSITION_POSITION, new PointType(new DecimalType(position.lat()),
|
updateState(CHANNEL_POSITION_POSITION, new PointType(new DecimalType(position.lat()),
|
||||||
new DecimalType(position.lon()), new DecimalType(position.alt())));
|
new DecimalType(position.lon()), new DecimalType(position.alt())));
|
||||||
|
@ -422,7 +426,7 @@ public class GroupePSAHandler extends BaseThingHandler {
|
||||||
|
|
||||||
protected void updateState(String channelID, @Nullable ZonedDateTime date) {
|
protected void updateState(String channelID, @Nullable ZonedDateTime date) {
|
||||||
if (date != null) {
|
if (date != null) {
|
||||||
updateState(channelID, new DateTimeType(date));
|
updateState(channelID, new DateTimeType(date).toZone(timeZoneProvider.getTimeZone()));
|
||||||
} else {
|
} else {
|
||||||
updateState(channelID, UnDefType.UNDEF);
|
updateState(channelID, UnDefType.UNDEF);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ import static org.mockito.Mockito.*;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
import java.time.ZoneId;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
@ -34,6 +35,7 @@ import org.openhab.binding.groupepsa.internal.rest.api.GroupePSAConnectApi;
|
||||||
import org.openhab.binding.groupepsa.internal.rest.exceptions.GroupePSACommunicationException;
|
import org.openhab.binding.groupepsa.internal.rest.exceptions.GroupePSACommunicationException;
|
||||||
import org.openhab.core.auth.client.oauth2.OAuthFactory;
|
import org.openhab.core.auth.client.oauth2.OAuthFactory;
|
||||||
import org.openhab.core.config.core.Configuration;
|
import org.openhab.core.config.core.Configuration;
|
||||||
|
import org.openhab.core.i18n.TimeZoneProvider;
|
||||||
import org.openhab.core.library.types.DateTimeType;
|
import org.openhab.core.library.types.DateTimeType;
|
||||||
import org.openhab.core.library.types.StringType;
|
import org.openhab.core.library.types.StringType;
|
||||||
import org.openhab.core.thing.Bridge;
|
import org.openhab.core.thing.Bridge;
|
||||||
|
@ -65,6 +67,7 @@ public class GroupePSAHandlerTest {
|
||||||
|
|
||||||
private @NonNullByDefault({}) @Mock OAuthFactory oAuthFactory;
|
private @NonNullByDefault({}) @Mock OAuthFactory oAuthFactory;
|
||||||
private @NonNullByDefault({}) @Mock HttpClient httpClient;
|
private @NonNullByDefault({}) @Mock HttpClient httpClient;
|
||||||
|
private @NonNullByDefault({}) @Mock TimeZoneProvider timeZoneProvider;
|
||||||
|
|
||||||
static String getResourceFileAsString(String fileName) throws GroupePSACommunicationException {
|
static String getResourceFileAsString(String fileName) throws GroupePSACommunicationException {
|
||||||
try (InputStream is = GroupePSAConnectApi.class.getResourceAsStream(fileName)) {
|
try (InputStream is = GroupePSAConnectApi.class.getResourceAsStream(fileName)) {
|
||||||
|
@ -82,13 +85,12 @@ public class GroupePSAHandlerTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
@SuppressWarnings("null")
|
|
||||||
public void setUp() throws GroupePSACommunicationException {
|
public void setUp() throws GroupePSACommunicationException {
|
||||||
closeable = MockitoAnnotations.openMocks(this);
|
closeable = MockitoAnnotations.openMocks(this);
|
||||||
|
|
||||||
// Create real objects
|
// Create real objects
|
||||||
bridgeHandler = spy(new GroupePSABridgeHandler(bridge, oAuthFactory, httpClient));
|
bridgeHandler = spy(new GroupePSABridgeHandler(bridge, oAuthFactory, httpClient));
|
||||||
thingHandler = spy(new GroupePSAHandler(thing));
|
thingHandler = spy(new GroupePSAHandler(thing, timeZoneProvider));
|
||||||
api = spy(new GroupePSAConnectApi(httpClient, bridgeHandler, "clientId", "realm"));
|
api = spy(new GroupePSAConnectApi(httpClient, bridgeHandler, "clientId", "realm"));
|
||||||
|
|
||||||
// Setup API mock
|
// Setup API mock
|
||||||
|
@ -122,6 +124,7 @@ public class GroupePSAHandlerTest {
|
||||||
thingHandler.setCallback(thingCallback);
|
thingHandler.setCallback(thingCallback);
|
||||||
doReturn(bridge).when(thingHandler).getBridge();
|
doReturn(bridge).when(thingHandler).getBridge();
|
||||||
doNothing().when(thingHandler).buildDoorChannels(any());
|
doNothing().when(thingHandler).buildDoorChannels(any());
|
||||||
|
doReturn(ZoneId.systemDefault()).when(timeZoneProvider).getTimeZone();
|
||||||
}
|
}
|
||||||
|
|
||||||
@AfterEach
|
@AfterEach
|
||||||
|
|
Loading…
Reference in New Issue