From c6778fcb003645b0b204a4d50f9b8d535006b6d6 Mon Sep 17 00:00:00 2001 From: Bernd Weymann Date: Sat, 9 Jul 2022 15:56:05 +0200 Subject: [PATCH] [mybmw] Add home-distance channel (#13093) * add home-distance channel * use uniformed instead of random gps coordinates Signed-off-by: Bernd Weymann --- bundles/org.openhab.binding.mybmw/README.md | 12 ++--- .../mybmw/internal/MyBMWConstants.java | 1 + .../mybmw/internal/MyBMWHandlerFactory.java | 10 ++-- .../internal/dto/properties/Coordinates.java | 4 +- .../internal/dto/properties/Location.java | 2 +- .../handler/VehicleChannelHandler.java | 34 ++++++++++--- .../internal/handler/VehicleHandler.java | 5 +- .../mybmw/internal/utils/Converter.java | 6 +-- .../resources/OH-INF/i18n/mybmw.properties | 2 + .../OH-INF/thing/location-channel-group.xml | 1 + .../OH-INF/thing/location-channel-types.xml | 6 +++ .../mybmw/internal/dto/StatusWrapper.java | 50 ++++++++++++------- .../mybmw/internal/dto/VehicleStatusTest.java | 2 +- .../handler/ChargeStatisticsTest.java | 4 +- .../internal/handler/ErrorResponseTest.java | 4 +- .../mybmw/internal/handler/VehicleTests.java | 16 +++--- .../resources/responses/I01_REX/vehicles.json | 4 +- 17 files changed, 111 insertions(+), 52 deletions(-) diff --git a/bundles/org.openhab.binding.mybmw/README.md b/bundles/org.openhab.binding.mybmw/README.md index 9ee702052..d0dc7a475 100644 --- a/bundles/org.openhab.binding.mybmw/README.md +++ b/bundles/org.openhab.binding.mybmw/README.md @@ -339,12 +339,12 @@ GPS location and heading of the vehicle. * Available for all vehicles with built-in GPS sensor. Function can be enabled/disabled in the head unit * Read-only values -| Channel Label | Channel ID | Type | -|-----------------|---------------------|--------------| -| GPS Coordinates | gps | Location | -| Heading | heading | Number:Angle | -| Address | address | String | - +| Channel Label | Channel ID | Type | +|---------------------|---------------------|---------------| +| GPS Coordinates | gps | Location | +| Heading | heading | Number:Angle | +| Address | address | String | +| Distance from Home | home-distance | Number:Length | #### Remote Services diff --git a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/MyBMWConstants.java b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/MyBMWConstants.java index b26cc0a96..ca8c257e6 100644 --- a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/MyBMWConstants.java +++ b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/MyBMWConstants.java @@ -114,6 +114,7 @@ public class MyBMWConstants { public static final String GPS = "gps"; public static final String HEADING = "heading"; public static final String ADDRESS = "address"; + public static final String HOME_DISTANCE = "home-distance"; // Status public static final String DOORS = "doors"; diff --git a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/MyBMWHandlerFactory.java b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/MyBMWHandlerFactory.java index 902d51e06..22860f029 100644 --- a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/MyBMWHandlerFactory.java +++ b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/MyBMWHandlerFactory.java @@ -20,6 +20,7 @@ import org.openhab.binding.mybmw.internal.handler.MyBMWBridgeHandler; import org.openhab.binding.mybmw.internal.handler.MyBMWCommandOptionProvider; import org.openhab.binding.mybmw.internal.handler.VehicleHandler; import org.openhab.core.i18n.LocaleProvider; +import org.openhab.core.i18n.LocationProvider; import org.openhab.core.io.net.http.HttpClientFactory; import org.openhab.core.thing.Bridge; import org.openhab.core.thing.Thing; @@ -42,14 +43,16 @@ import org.osgi.service.component.annotations.Reference; public class MyBMWHandlerFactory extends BaseThingHandlerFactory { private final HttpClientFactory httpClientFactory; private final MyBMWCommandOptionProvider commandOptionProvider; + private final LocationProvider locationProvider; private String localeLanguage; @Activate public MyBMWHandlerFactory(final @Reference HttpClientFactory hcf, final @Reference MyBMWCommandOptionProvider cop, - final @Reference LocaleProvider lp) { + final @Reference LocaleProvider localeP, final @Reference LocationProvider locationP) { httpClientFactory = hcf; commandOptionProvider = cop; - localeLanguage = lp.getLocale().getLanguage().toLowerCase(); + locationProvider = locationP; + localeLanguage = localeP.getLocale().getLanguage().toLowerCase(); } @Override @@ -63,7 +66,8 @@ public class MyBMWHandlerFactory extends BaseThingHandlerFactory { if (THING_TYPE_CONNECTED_DRIVE_ACCOUNT.equals(thingTypeUID)) { return new MyBMWBridgeHandler((Bridge) thing, httpClientFactory, localeLanguage); } else if (SUPPORTED_THING_SET.contains(thingTypeUID)) { - VehicleHandler vh = new VehicleHandler(thing, commandOptionProvider, thingTypeUID.getId()); + VehicleHandler vh = new VehicleHandler(thing, commandOptionProvider, locationProvider, + thingTypeUID.getId()); return vh; } return null; diff --git a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/dto/properties/Coordinates.java b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/dto/properties/Coordinates.java index 9e74e3e9d..6391a5e1a 100644 --- a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/dto/properties/Coordinates.java +++ b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/dto/properties/Coordinates.java @@ -18,6 +18,6 @@ package org.openhab.binding.mybmw.internal.dto.properties; * @author Bernd Weymann - Initial contribution */ public class Coordinates { - public double latitude;// ": 50.556049, - public double longitude;// ": 8.495669 + public double latitude; + public double longitude; } diff --git a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/dto/properties/Location.java b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/dto/properties/Location.java index e19decfdd..167f5f3ca 100644 --- a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/dto/properties/Location.java +++ b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/dto/properties/Location.java @@ -20,5 +20,5 @@ package org.openhab.binding.mybmw.internal.dto.properties; public class Location { public Coordinates coordinates; public Address address; - public int heading;// ": 222 + public int heading; } diff --git a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/handler/VehicleChannelHandler.java b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/handler/VehicleChannelHandler.java index 1dec0d62e..3f380ce08 100644 --- a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/handler/VehicleChannelHandler.java +++ b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/handler/VehicleChannelHandler.java @@ -48,6 +48,7 @@ import org.openhab.binding.mybmw.internal.utils.Constants; import org.openhab.binding.mybmw.internal.utils.Converter; import org.openhab.binding.mybmw.internal.utils.RemoteServiceUtils; import org.openhab.binding.mybmw.internal.utils.VehicleStatusUtils; +import org.openhab.core.i18n.LocationProvider; import org.openhab.core.library.types.DateTimeType; import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.OnOffType; @@ -55,6 +56,7 @@ import org.openhab.core.library.types.PointType; import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.types.StringType; import org.openhab.core.library.unit.ImperialUnits; +import org.openhab.core.library.unit.SIUnits; import org.openhab.core.library.unit.Units; import org.openhab.core.thing.ChannelUID; import org.openhab.core.thing.Thing; @@ -87,17 +89,22 @@ public abstract class VehicleChannelHandler extends BaseThingHandler { protected String selectedSession = Constants.UNDEF; protected MyBMWCommandOptionProvider commandOptionProvider; + private LocationProvider locationProvider; // Data Caches protected Optional vehicleStatusCache = Optional.empty(); protected Optional imageCache = Optional.empty(); - public VehicleChannelHandler(Thing thing, MyBMWCommandOptionProvider cop, String type) { + public VehicleChannelHandler(Thing thing, MyBMWCommandOptionProvider cop, LocationProvider lp, String type) { super(thing); commandOptionProvider = cop; + locationProvider = lp; + if (lp.getLocation() == null) { + logger.debug("Home location not available"); + } hasFuel = type.equals(VehicleType.CONVENTIONAL.toString()) || type.equals(VehicleType.PLUGIN_HYBRID.toString()) - || type.equals(VehicleType.ELECTRIC_REX.toString()); + || type.equals(VehicleType.ELECTRIC_REX.toString()) || type.equals(VehicleType.MILD_HYBRID.toString()); isElectric = type.equals(VehicleType.PLUGIN_HYBRID.toString()) || type.equals(VehicleType.ELECTRIC_REX.toString()) || type.equals(VehicleType.ELECTRIC.toString()); isHybrid = hasFuel && isElectric; @@ -448,9 +455,24 @@ public abstract class VehicleChannelHandler extends BaseThingHandler { } protected void updatePosition(Location pos) { - updateChannel(CHANNEL_GROUP_LOCATION, GPS, PointType - .valueOf(Double.toString(pos.coordinates.latitude) + "," + Double.toString(pos.coordinates.longitude))); - updateChannel(CHANNEL_GROUP_LOCATION, HEADING, QuantityType.valueOf(pos.heading, Units.DEGREE_ANGLE)); - updateChannel(CHANNEL_GROUP_LOCATION, ADDRESS, StringType.valueOf(pos.address.formatted)); + if (pos.coordinates.latitude < 0) { + updateChannel(CHANNEL_GROUP_LOCATION, GPS, UnDefType.UNDEF); + updateChannel(CHANNEL_GROUP_LOCATION, HEADING, UnDefType.UNDEF); + updateChannel(CHANNEL_GROUP_LOCATION, ADDRESS, UnDefType.UNDEF); + updateChannel(CHANNEL_GROUP_LOCATION, HOME_DISTANCE, UnDefType.UNDEF); + } else { + PointType vehicleLocation = PointType.valueOf( + Double.toString(pos.coordinates.latitude) + "," + Double.toString(pos.coordinates.longitude)); + updateChannel(CHANNEL_GROUP_LOCATION, GPS, vehicleLocation); + updateChannel(CHANNEL_GROUP_LOCATION, HEADING, QuantityType.valueOf(pos.heading, Units.DEGREE_ANGLE)); + updateChannel(CHANNEL_GROUP_LOCATION, ADDRESS, StringType.valueOf(pos.address.formatted)); + PointType homeLocation = locationProvider.getLocation(); + if (homeLocation != null) { + updateChannel(CHANNEL_GROUP_LOCATION, HOME_DISTANCE, + QuantityType.valueOf(vehicleLocation.distanceFrom(homeLocation).intValue(), SIUnits.METRE)); + } else { + updateChannel(CHANNEL_GROUP_LOCATION, HOME_DISTANCE, UnDefType.UNDEF); + } + } } } diff --git a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/handler/VehicleHandler.java b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/handler/VehicleHandler.java index c7b2da83d..53863a9ab 100644 --- a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/handler/VehicleHandler.java +++ b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/handler/VehicleHandler.java @@ -30,6 +30,7 @@ import org.openhab.binding.mybmw.internal.utils.Constants; import org.openhab.binding.mybmw.internal.utils.Converter; import org.openhab.binding.mybmw.internal.utils.ImageProperties; import org.openhab.binding.mybmw.internal.utils.RemoteServiceUtils; +import org.openhab.core.i18n.LocationProvider; import org.openhab.core.io.net.http.HttpUtil; import org.openhab.core.library.types.RawType; import org.openhab.core.library.types.StringType; @@ -64,8 +65,8 @@ public class VehicleHandler extends VehicleChannelHandler { ChargeSessionsCallback chargeSessionCallback = new ChargeSessionsCallback(); ByteResponseCallback imageCallback = new ImageCallback(); - public VehicleHandler(Thing thing, MyBMWCommandOptionProvider cop, String driveTrain) { - super(thing, cop, driveTrain); + public VehicleHandler(Thing thing, MyBMWCommandOptionProvider cop, LocationProvider lp, String driveTrain) { + super(thing, cop, lp, driveTrain); } @Override diff --git a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/utils/Converter.java b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/utils/Converter.java index 6f8fa6d31..6ae227ba6 100644 --- a/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/utils/Converter.java +++ b/bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/utils/Converter.java @@ -238,10 +238,10 @@ public class Converter { } if (v.properties.vehicleLocation == null) { v.properties.vehicleLocation = new Location(); - v.properties.vehicleLocation.heading = -1; + v.properties.vehicleLocation.heading = Constants.INT_UNDEF; v.properties.vehicleLocation.coordinates = new Coordinates(); - v.properties.vehicleLocation.coordinates.latitude = -1.234; - v.properties.vehicleLocation.coordinates.longitude = -9.876; + v.properties.vehicleLocation.coordinates.latitude = Constants.INT_UNDEF; + v.properties.vehicleLocation.coordinates.longitude = Constants.INT_UNDEF; v.properties.vehicleLocation.address = new Address(); v.properties.vehicleLocation.address.formatted = Constants.UNDEF; } diff --git a/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/i18n/mybmw.properties b/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/i18n/mybmw.properties index a4baeb1d4..f5a1129b0 100644 --- a/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/i18n/mybmw.properties +++ b/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/i18n/mybmw.properties @@ -87,6 +87,8 @@ channel-type.mybmw.front-right-current-channel.label = Tire Pressure Front Right channel-type.mybmw.front-right-target-channel.label = Tire Pressure Front Right Target channel-type.mybmw.gps-channel.label = GPS Coordinates channel-type.mybmw.heading-channel.label = Heading Angle +channel-type.mybmw.home-distance-channel.label = Distance from Home +channel-type.mybmw.home-distance-channel.description = Computed distance between vehicle and home location channel-type.mybmw.hood-channel.label = Hood channel-type.mybmw.image-view-channel.label = Image Viewport channel-type.mybmw.image-view-channel.command.option.VehicleStatus = Front Side View diff --git a/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/location-channel-group.xml b/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/location-channel-group.xml index 46cbbcf71..94d97c726 100644 --- a/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/location-channel-group.xml +++ b/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/location-channel-group.xml @@ -10,6 +10,7 @@ + diff --git a/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/location-channel-types.xml b/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/location-channel-types.xml index 04fe7b522..df395e8a4 100644 --- a/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/location-channel-types.xml +++ b/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/location-channel-types.xml @@ -16,4 +16,10 @@ String + + Number:Length + + Computed distance between vehicle and home location + + diff --git a/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/dto/StatusWrapper.java b/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/dto/StatusWrapper.java index dabcd71ee..60799b06f 100644 --- a/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/dto/StatusWrapper.java +++ b/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/dto/StatusWrapper.java @@ -27,6 +27,7 @@ import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.mybmw.internal.MyBMWConstants.VehicleType; import org.openhab.binding.mybmw.internal.dto.properties.CBS; import org.openhab.binding.mybmw.internal.dto.vehicle.Vehicle; +import org.openhab.binding.mybmw.internal.handler.VehicleTests; import org.openhab.binding.mybmw.internal.utils.Constants; import org.openhab.binding.mybmw.internal.utils.Converter; import org.openhab.binding.mybmw.internal.utils.VehicleStatusUtils; @@ -36,6 +37,7 @@ import org.openhab.core.library.types.PointType; import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.types.StringType; import org.openhab.core.library.unit.ImperialUnits; +import org.openhab.core.library.unit.SIUnits; import org.openhab.core.library.unit.Units; import org.openhab.core.thing.ChannelUID; import org.openhab.core.types.State; @@ -60,7 +62,7 @@ public class StatusWrapper { public StatusWrapper(String type, String statusJson) { hasFuel = type.equals(VehicleType.CONVENTIONAL.toString()) || type.equals(VehicleType.PLUGIN_HYBRID.toString()) - || type.equals(VehicleType.ELECTRIC_REX.toString()); + || type.equals(VehicleType.ELECTRIC_REX.toString()) || type.equals(VehicleType.MILD_HYBRID.toString()); isElectric = type.equals(VehicleType.PLUGIN_HYBRID.toString()) || type.equals(VehicleType.ELECTRIC_REX.toString()) || type.equals(VehicleType.ELECTRIC.toString()); isHybrid = hasFuel && isElectric; @@ -246,20 +248,22 @@ public class StatusWrapper { assertEquals(expected.toString(), dtt.toString(), "Last Update"); break; case GPS: - assertTrue(state instanceof PointType); - pt = (PointType) state; - assertNotNull(vehicle.properties.vehicleLocation); - assertEquals( - PointType.valueOf(Double.toString(vehicle.properties.vehicleLocation.coordinates.latitude) + "," - + Double.toString(vehicle.properties.vehicleLocation.coordinates.longitude)), - pt, "Coordinates"); + if (state instanceof PointType) { + pt = (PointType) state; + assertNotNull(vehicle.properties.vehicleLocation); + assertEquals( + PointType.valueOf(Double.toString(vehicle.properties.vehicleLocation.coordinates.latitude) + + "," + Double.toString(vehicle.properties.vehicleLocation.coordinates.longitude)), + pt, "Coordinates"); + } // else no check needed break; case HEADING: - assertTrue(state instanceof QuantityType); - qt = ((QuantityType) state); - assertEquals(Units.DEGREE_ANGLE, qt.getUnit(), "Angle Unit"); - assertNotNull(vehicle.properties.vehicleLocation); - assertEquals(vehicle.properties.vehicleLocation.heading, qt.intValue(), 0.01, "Heading"); + if (state instanceof QuantityType) { + qt = ((QuantityType) state); + assertEquals(Units.DEGREE_ANGLE, qt.getUnit(), "Angle Unit"); + assertNotNull(vehicle.properties.vehicleLocation); + assertEquals(vehicle.properties.vehicleLocation.heading, qt.intValue(), 0.01, "Heading"); + } // else no check needed break; case RANGE_RADIUS_ELECTRIC: assertTrue(state instanceof QuantityType); @@ -568,10 +572,22 @@ public class StatusWrapper { } break; case ADDRESS: - assertTrue(state instanceof StringType); - st = (StringType) state; - assertEquals(st.toFullString(), vehicle.properties.vehicleLocation.address.formatted, - "Location Address"); + if (state instanceof StringType) { + st = (StringType) state; + assertEquals(st.toFullString(), vehicle.properties.vehicleLocation.address.formatted, + "Location Address"); + } // else no check needed + break; + case HOME_DISTANCE: + if (state instanceof QuantityType) { + qt = (QuantityType) state; + PointType vehicleLocation = PointType + .valueOf(Double.toString(vehicle.properties.vehicleLocation.coordinates.latitude) + "," + + Double.toString(vehicle.properties.vehicleLocation.coordinates.longitude)); + int distance = vehicleLocation.distanceFrom(VehicleTests.HOME_LOCATION).intValue(); + assertEquals(qt.intValue(), distance, "Distance from Home"); + assertEquals(qt.getUnit(), SIUnits.METRE, "Distance from Home Unit"); + } // else no check needed break; case RAW: // don't assert raw channel diff --git a/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/dto/VehicleStatusTest.java b/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/dto/VehicleStatusTest.java index 80f8f1ed8..351eb93c1 100644 --- a/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/dto/VehicleStatusTest.java +++ b/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/dto/VehicleStatusTest.java @@ -62,7 +62,7 @@ public class VehicleStatusTest { assertEquals("BMW", v.brand, "Car brand"); assertEquals(true, v.properties.areDoorsClosed, "Doors Closed"); assertEquals(76, v.properties.electricRange.distance.value, "Electric Range"); - assertEquals(6.789, v.properties.vehicleLocation.coordinates.longitude, 0.1, "Location lon"); + assertEquals(9.876, v.properties.vehicleLocation.coordinates.longitude, 0.1, "Location lon"); assertEquals("immediateCharging", v.status.chargingProfile.chargingMode, "Charging Mode"); assertEquals(2, v.status.chargingProfile.getTimerId(2).id, "Timer ID"); assertEquals("[sunday]", v.status.chargingProfile.getTimerId(2).timerWeekDays.toString(), "Timer Weekdays"); diff --git a/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/handler/ChargeStatisticsTest.java b/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/handler/ChargeStatisticsTest.java index 0770483b5..1e31cd93c 100644 --- a/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/handler/ChargeStatisticsTest.java +++ b/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/handler/ChargeStatisticsTest.java @@ -28,6 +28,7 @@ import org.openhab.binding.mybmw.internal.VehicleConfiguration; import org.openhab.binding.mybmw.internal.dto.ChargeStatisticWrapper; import org.openhab.binding.mybmw.internal.util.FileReader; import org.openhab.binding.mybmw.internal.utils.Constants; +import org.openhab.core.i18n.LocationProvider; import org.openhab.core.thing.ChannelUID; import org.openhab.core.thing.Thing; import org.openhab.core.thing.ThingUID; @@ -73,7 +74,8 @@ public class ChargeStatisticsTest { Thing thing = mock(Thing.class); when(thing.getUID()).thenReturn(new ThingUID("testbinding", "test")); MyBMWCommandOptionProvider cop = mock(MyBMWCommandOptionProvider.class); - cch = new VehicleHandler(thing, cop, type); + LocationProvider locationProvider = mock(LocationProvider.class); + cch = new VehicleHandler(thing, cop, locationProvider, type); VehicleConfiguration vc = new VehicleConfiguration(); vc.vin = Constants.ANONYMOUS; Optional ovc = Optional.of(vc); diff --git a/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/handler/ErrorResponseTest.java b/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/handler/ErrorResponseTest.java index 50db2bdc5..cdd40384a 100644 --- a/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/handler/ErrorResponseTest.java +++ b/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/handler/ErrorResponseTest.java @@ -20,6 +20,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; +import org.openhab.core.i18n.LocationProvider; import org.openhab.core.thing.ChannelUID; import org.openhab.core.thing.Thing; import org.openhab.core.thing.ThingUID; @@ -60,7 +61,8 @@ public class ErrorResponseTest { Thing thing = mock(Thing.class); when(thing.getUID()).thenReturn(new ThingUID("testbinding", "test")); MyBMWCommandOptionProvider cop = mock(MyBMWCommandOptionProvider.class); - cch = new VehicleHandler(thing, cop, type); + LocationProvider locationProvider = mock(LocationProvider.class); + cch = new VehicleHandler(thing, cop, locationProvider, type); tc = mock(ThingHandlerCallback.class); cch.setCallback(tc); channelCaptor = ArgumentCaptor.forClass(ChannelUID.class); diff --git a/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/handler/VehicleTests.java b/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/handler/VehicleTests.java index 80363a6d1..da675ae85 100644 --- a/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/handler/VehicleTests.java +++ b/bundles/org.openhab.binding.mybmw/src/test/java/org/openhab/binding/mybmw/internal/handler/VehicleTests.java @@ -28,6 +28,8 @@ import org.openhab.binding.mybmw.internal.VehicleConfiguration; import org.openhab.binding.mybmw.internal.dto.StatusWrapper; import org.openhab.binding.mybmw.internal.util.FileReader; import org.openhab.binding.mybmw.internal.utils.Constants; +import org.openhab.core.i18n.LocationProvider; +import org.openhab.core.library.types.PointType; import org.openhab.core.thing.ChannelUID; import org.openhab.core.thing.Thing; import org.openhab.core.thing.ThingUID; @@ -57,10 +59,10 @@ public class VehicleTests { private static final int CHECK_AVAILABLE = 3; private static final int SERVICE_AVAILABLE = 3; private static final int SERVICE_EMPTY = 3; - private static final int LOCATION = 3; + private static final int LOCATION = 4; private static final int CHARGE_PROFILE = 44; private static final int TIRES = 8; - + public static final PointType HOME_LOCATION = new PointType("54.321,9.876"); @Nullable ArgumentCaptor channelCaptor; @Nullable @@ -83,7 +85,9 @@ public class VehicleTests { Thing thing = mock(Thing.class); when(thing.getUID()).thenReturn(new ThingUID("testbinding", "test")); MyBMWCommandOptionProvider cop = mock(MyBMWCommandOptionProvider.class); - cch = new VehicleHandler(thing, cop, type); + LocationProvider locationProvider = mock(LocationProvider.class); + when(locationProvider.getLocation()).thenReturn(HOME_LOCATION); + cch = new VehicleHandler(thing, cop, locationProvider, type); VehicleConfiguration vc = new VehicleConfiguration(); vc.vin = vin; Optional ovc = Optional.of(vc); @@ -332,9 +336,7 @@ public class VehicleTests { logger.info("{}", Thread.currentThread().getStackTrace()[1].getMethodName()); setup(VehicleType.MILD_HYBRID.toString(), "anonymous"); String content = FileReader.readFileInString("src/test/resources/responses/G21/340i.json"); - assertTrue(testVehicle(content, 38, Optional.empty())); - // assertTrue(testVehicle(content, - // STATUS_CONV + DOORS + RANGE_CONV + SERVICE_AVAILABLE + CHECK_EMPTY + LOCATION + TIRES, - // Optional.empty())); + assertTrue(testVehicle(content, + STATUS_CONV + DOORS + RANGE_CONV + LOCATION + SERVICE_EMPTY + CHECK_EMPTY + TIRES, Optional.empty())); } } diff --git a/bundles/org.openhab.binding.mybmw/src/test/resources/responses/I01_REX/vehicles.json b/bundles/org.openhab.binding.mybmw/src/test/resources/responses/I01_REX/vehicles.json index a822abefd..15afdbad8 100644 --- a/bundles/org.openhab.binding.mybmw/src/test/resources/responses/I01_REX/vehicles.json +++ b/bundles/org.openhab.binding.mybmw/src/test/resources/responses/I01_REX/vehicles.json @@ -173,8 +173,8 @@ ], "vehicleLocation": { "coordinates": { - "latitude": 1.2345, - "longitude": 6.789 + "latitude": 54.321, + "longitude": 9.876 }, "address": { "formatted": "anonymous"