]> git.basschouten.com Git - openhab-addons.git/commitdiff
[mybmw] Improve data refresh handling (#16418)
authorMartin Grassl <martin.grassl@digital-filestore.de>
Sun, 25 Feb 2024 13:03:16 +0000 (14:03 +0100)
committerGitHub <noreply@github.com>
Sun, 25 Feb 2024 13:03:16 +0000 (14:03 +0100)
* [mybmw] add functionality for updating
disable updating by setting the refresh-interval to 0
enable force update by adding some switches

Signed-off-by: Martin Grassl <martin.grassl@digital-filestore.de>
23 files changed:
bundles/org.openhab.binding.mybmw/README.md
bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/MyBMWConstants.java
bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/handler/RemoteServiceExecutor.java
bundles/org.openhab.binding.mybmw/src/main/java/org/openhab/binding/mybmw/internal/handler/VehicleHandler.java
bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/config/thing-config.xml
bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/i18n/mybmw.properties
bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/ev-vehicle-update-group.xml [new file with mode: 0644]
bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/thing-bev.xml
bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/thing-bev_rex.xml
bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/thing-conv.xml
bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/thing-phev.xml
bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/vehicle-update-channel-types.xml [new file with mode: 0644]
bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/vehicle-update-group.xml [new file with mode: 0644]
bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/update/thing-update.xml
bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV2/charging_sessions.json [new file with mode: 0644]
bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV2/charging_statistics.json [new file with mode: 0644]
bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV2/vehicles_base.json [new file with mode: 0644]
bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV4/charging_sessions.json [new file with mode: 0644]
bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV4/charging_statistics.json [new file with mode: 0644]
bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV5/charging_sessions.json [new file with mode: 0644]
bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV5/charging_statistics.json [new file with mode: 0644]
bundles/org.openhab.binding.mybmw/src/test/resources/responses/PHEV/charging_sessions.json [new file with mode: 0644]
bundles/org.openhab.binding.mybmw/src/test/resources/responses/PHEV/charging_statistics.json [new file with mode: 0644]

index 5fc23608476018568b39ccf91bd41d2558a5e66a..c1c1c30e9128fe1706baa907c59085d2c9c80265 100644 (file)
@@ -105,10 +105,10 @@ So if want your UI in english language place _en_ as desired language.
 
 Same configuration is needed for all things
 
-| Parameter       | Type    | Description                           |
-|-----------------|---------|---------------------------------------|
-| vin             | text    | Vehicle Identification Number (VIN)   |
-| refreshInterval | integer | Refresh Interval in Minutes           |
+| Parameter       | Type    | Description                                                                                                             |
+|-----------------|---------|-------------------------------------------------------------------------------------------------------------------------|
+| vin             | text    | Vehicle Identification Number (VIN)                                                                                     |
+| refreshInterval | integer | Refresh Interval in Minutes (by default set to 60; to be set to 0 if no automated refresh should be triggered)          |
 
 #### Advanced Configuration
 
@@ -132,9 +132,10 @@ They differ for each vehicle type, build-in sensors and activated services.
 
 | Channel Group ID                 | Description                                       | conv | phev | bev_rex | bev |
 |----------------------------------|---------------------------------------------------|------|------|---------|-----|
+| [update](#vehicle-update)        | Overall vehicle status                            |  X   |  X   |    X    |  X  |
 | [status](#vehicle-status)        | Overall vehicle status                            |  X   |  X   |    X    |  X  |
+| [doors](#doors-details)          | Details of all doors and windows                  |  X   |  X   |    X    |  X  |
 | [range](#range-data)             | Provides mileage, range and charge / fuel levels  |  X   |  X   |    X    |  X  |
-| [doors](#doors-details)          | Detials of all doors and windows                  |  X   |  X   |    X    |  X  |
 | [check](#check-control)          | Shows current active CheckControl messages        |  X   |  X   |    X    |  X  |
 | [service](#services)             | Future vehicle service schedules                  |  X   |  X   |    X    |  X  |
 | [location](#location)            | Coordinates and heading of the vehicle            |  X   |  X   |    X    |  X  |
@@ -145,6 +146,25 @@ They differ for each vehicle type, build-in sensors and activated services.
 | [tires](#tire-pressure)          | Current and wanted pressure for all tires         |  X   |  X   |    X    |  X  |
 | [image](#image)                  | Provides an image of your vehicle                 |  X   |  X   |    X    |  X  |
 
+#### Vehicle Update
+
+The BMW API has limits in the requests per time period.
+This leads to unexpected errors stating that some quota is reached and the next successful request can be triggered in X minutes.
+In this case the bridge as well as the vehicle things can be set to offline and nothing can be done with them anymore until the next successful refresh.
+To reduce the probability of the error, the default automated API update has been set to 60 Minutes, but this is often not sufficient to retrieve continuous range or charging updates.
+These channels can be used to control the update behavior from openHAB, e.g. via rules.
+
+- Channel Group ID is status
+- Available for all vehicles (charging channel only for xEV)
+- switches which can be triggered by a command
+- if the switches are set to ON, then immediately they will be set to OFF again for being able to trigger the next update
+
+| Channel ID      | Type   | Description                                                                                              | conv | phev | bev_rex | bev |
+|-----------------|--------|----------------------------------------------------------------------------------------------------------|------|------|---------|-----|
+| state-update    | Switch | When set to ON, the state channels of the vehicle will be updated                                        |  X   |  X   |    X    |  X  |
+| charging-update | Switch | When set to ON, the charging statistics and charging sessions channels of the vehicle will be updated    |      |  X   |    X    |  X  |
+| image-update    | Switch | When set to ON, the image of the vehicle will be updated                                                 |  X   |  X   |    X    |  X  |
+
 #### Vehicle Status
 
 Reflects overall status of the vehicle.
@@ -153,19 +173,19 @@ Reflects overall status of the vehicle.
 - Available for all vehicles
 - Read-only values
 
-| Channel Label             | Channel ID          | Type          | Description                                    | conv | phev | bev_rex | bev |
-|---------------------------|---------------------|---------------|------------------------------------------------|------|------|---------|-----|
-| Overall Door Status       | doors               | String        | Combined status for all doors                  |  X   |  X   |    X    |  X  |
-| Overall Window Status     | windows             | String        | Combined status for all windows                |  X   |  X   |    X    |  X  |
-| Doors Locked              | lock                | String        | Status if vehicle is secured                   |  X   |  X   |    X    |  X  |
-| Next Service Date         | service-date        | DateTime      | Date of next upcoming service                  |  X   |  X   |    X    |  X  |
-| Mileage till Next Service | service-mileage     | Number:Length | Mileage till upcoming service                  |  X   |  X   |    X    |  X  |
-| Check Control             | check-control       | String        | Presence of active warning messages            |  X   |  X   |    X    |  X  |
-| Plug Connection Status    | plug-connection     | String        | Plug is _Connected_ or _Not connected_         |      |  X   |    X    |  X  |
-| Charging Status           | charge              | String        | Current charging status                        |      |  X   |    X    |  X  |
-| Remaining Charging Time   | charge-remaining    | Number:Time   | Remaining time for current charging session    |      |  X   |    X    |  X  |
-| Last Status Timestamp     | last-update         | DateTime      | Date and time of last status update            |  X   |  X   |    X    |  X  |
-| Last Fetched Timestamp    | last-fetched        | DateTime      | Date and time of last time status fetched      |  X   |  X   |    X    |  X  |
+| Channel ID          | Type          | Description                                    | conv | phev | bev_rex | bev |
+|---------------------|---------------|------------------------------------------------|------|------|---------|-----|
+| doors               | String        | Combined status for all doors                  |  X   |  X   |    X    |  X  |
+| windows             | String        | Combined status for all windows                |  X   |  X   |    X    |  X  |
+| lock                | String        | Status if vehicle is secured                   |  X   |  X   |    X    |  X  |
+| service-date        | DateTime      | Date of next upcoming service                  |  X   |  X   |    X    |  X  |
+| service-mileage     | Number:Length | Mileage till upcoming service                  |  X   |  X   |    X    |  X  |
+| check-control       | String        | Presence of active warning messages            |  X   |  X   |    X    |  X  |
+| plug-connection     | String        | Plug is _Connected_ or _Not connected_         |      |  X   |    X    |  X  |
+| charge              | String        | Current charging status                        |      |  X   |    X    |  X  |
+| charge-remaining    | Number:Time   | Remaining time for current charging session    |      |  X   |    X    |  X  |
+| last-update         | DateTime      | Date and time of last status update            |  X   |  X   |    X    |  X  |
+| last-fetched        | DateTime      | Date and time of last time status fetched      |  X   |  X   |    X    |  X  |
 
 Overall Door Status values
 
@@ -208,9 +228,9 @@ The _raw data channel_ is marked as _advanced_ and isn't shown by default.
 Target are advanced users to derive even more data out of BMW API replies.
 As the replies are formatted as JSON use the [JsonPath Transformation Service](https://www.openhab.org/addons/transformations/jsonpath/) to extract data for an item,
 
-| Channel Label             | Channel ID          | Type          | Description                                    |
-|---------------------------|---------------------|---------------|------------------------------------------------|
-| Raw Data                  | raw                 | String        | Unfiltered JSON String of vehicle data         |
+| Channel ID          | Type          | Description                                    |
+|---------------------|---------------|------------------------------------------------|
+| raw                 | String        | Unfiltered JSON String of vehicle data         |
 
 <img align="right" src="./doc/RawData.png" width="400" height="125"/>
 
@@ -239,19 +259,19 @@ See description [Range vs Range Radius](#range-vs-range-radius) to get more info
 - Availability according to table
 - Read-only values
 
-| Channel Label                      | Channel ID                 | Type                 | conv | phev | bev_rex | bev |
-|------------------------------------|----------------------------|----------------------|------|------|---------|-----|
-| Mileage                            | mileage                    | Number:Length        |  X   |  X   |    X    |  X  |
-| Fuel Range                         | range-fuel                 | Number:Length        |  X   |  X   |    X    |     |
-| Electric Range                     | range-electric             | Number:Length        |      |  X   |    X    |  X  |
-| Hybrid Range                       | range-hybrid               | Number:Length        |      |  X   |    X    |     |
-| Battery Charge Level               | soc                        | Number:Dimensionless |      |  X   |    X    |  X  |
-| Remaining Fuel                     | remaining-fuel             | Number:Volume        |  X   |  X   |    X    |     |
-| Estimated Fuel Consumption l/100km | estimated-fuel-l-100km     | Number               |  X   |  X   |    X    |     |
-| Estimated Fuel Consumption mpg     | estimated-fuel-mpg         | Number               |  X   |  X   |    X    |     |
-| Fuel Range Radius                  | range-radius-fuel          | Number:Length        |  X   |  X   |    X    |     |
-| Electric Range Radius              | range-radius-electric      | Number:Length        |      |  X   |    X    |  X  |
-| Hybrid Range Radius                | range-radius-hybrid        | Number:Length        |      |  X   |    X    |     |
+| Channel ID                 | Type                 | Description                                   | conv | phev | bev_rex | bev |
+|----------------------------|----------------------|-----------------------------------------------|------|------|---------|-----|
+| mileage                    | Number:Length        | Current mileage of the vehicle                |  X   |  X   |    X    |  X  |
+| range-fuel                 | Number:Length        | Fuel range                                    |  X   |  X   |    X    |     |
+| range-electric             | Number:Length        | Electric range                                |      |  X   |    X    |  X  |
+| range-hybrid               | Number:Length        | Combined hybrid range                         |      |  X   |    X    |     |
+| soc                        | Number:Dimensionless | State of charge                               |      |  X   |    X    |  X  |
+| remaining-fuel             | Number:Volume        | Remaining fuel in l                           |  X   |  X   |    X    |     |
+| estimated-fuel-l-100km     | Number               | Estimated fuel consumption in l               |  X   |  X   |    X    |     |
+| estimated-fuel-mpg         | Number               | Estimated fuel consumption in mpg             |  X   |  X   |    X    |     |
+| range-radius-fuel          | Number:Length        | The calculated range radius combustion        |  X   |  X   |    X    |     |
+| range-radius-electric      | Number:Length        | The calculated range radius electric          |      |  X   |    X    |  X  |
+| range-radius-hybrid        | Number:Length        | The calculated range radius hybrid combined   |      |  X   |    X    |     |
 
 #### Doors Details
 
@@ -261,20 +281,20 @@ Detailed status of all doors and windows.
 - Available for all vehicles if corresponding sensors are built-in
 - Read-only values
 
-| Channel Label              | Channel ID              | Type          |
-|----------------------------|-------------------------|---------------|
-| Driver Door                | driver-front            | String        |
-| Driver Door Rear           | driver-rear             | String        |
-| Passenger Door             | passenger-front         | String        |
-| Passenger Door Rear        | passenger-rear          | String        |
-| Trunk                      | trunk                   | String        |
-| Hood                       | hood                    | String        |
-| Driver Window              | win-driver-front        | String        |
-| Driver Rear Window         | win-driver-rear         | String        |
-| Passenger Window           | win-passenger-front     | String        |
-| Passenger Rear Window      | win-passenger-rear      | String        |
-| Rear Window                | win-rear                | String        |
-| Sunroof                    | sunroof                 | String        |
+| Channel ID              | Type          | Description                             |
+|-------------------------|---------------|-----------------------------------------|
+| driver-front            | String        | Status of front door driver's side      |
+| driver-rear             | String        | Status of rear door driver's side       |
+| passenger-front         | String        | Status of front door passenger's side   |
+| passenger-rear          | String        | Status of rear door passenger's side    |
+| trunk                   | String        | Status of trunk                         |
+| hood                    | String        | Status of hood                          |
+| win-driver-front        | String        | Status of front window driver's side    |
+| win-driver-rear         | String        | Status of rear window driver's side     |
+| win-passenger-front     | String        | Status of front window passenger's side |
+| win-passenger-rear      | String        | Status of rear window passenger's side  |
+| win-rear                | String        | Status of rear window                   |
+| sunroof                 | String        | Status of sunroof                       |
 
 Possible states
 
@@ -293,11 +313,11 @@ If more than one message is active the channel _name_ contains all active messag
 - Available for all vehicles
 - Read/Write access
 
-| Channel Label                   | Channel ID          | Type           | Access     |
-|---------------------------------|---------------------|----------------|------------|
-| Check Control Description       | name                | String         | Read/Write |
-| Check Control Details           | details             | String         | Read       |
-| Severity Level                  | severity            | String         | Read       |
+| Channel ID          | Type           | Access     |
+|---------------------|----------------|------------|
+| name                | String         | Read/Write |
+| details             | String         | Read       |
+| severity            | String         | Read       |
 
 Severity Levels
 
@@ -314,12 +334,12 @@ If more than one service is scheduled in the future the channel _name_ contains
 - Available for all vehicles
 - Read/Write access
 
-| Channel Label                  | Channel ID          | Type           | Access     |
-|--------------------------------|---------------------|----------------|------------|
-| Service Name                   | name                | String         | Read/Write |
-| Service Details                | details             | String         | Read       |
-| Service Date                   | date                | DateTime       | Read       |
-| Mileage till Service           | mileage             | Number:Length  | Read       |
+| Channel ID          | Type           | Access     |
+|---------------------|----------------|------------|
+| name                | String         | Read/Write |
+| details             | String         | Read       |
+| date                | DateTime       | Read       |
+| mileage             | Number:Length  | Read       |
 
 #### Location
 
@@ -329,12 +349,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        |
-| Distance from Home  | home-distance       | Number:Length |
+| Channel ID          | Type          | Description                                                  |
+|---------------------|---------------|--------------------------------------------------------------|
+| gps                 | Location      | Current GPS coordinates of the vehicle                       |
+| heading             | Number:Angle  | Current direction of the vehicle                             |
+| address             | String        | Current address                                              |
+| home-distance       | Number:Length | Calculated distance from configured home position of Openhab |
 
 #### Remote Services
 
@@ -347,10 +367,10 @@ Parallel execution isn't supported.
 - Available for all commands mentioned in _Services Activated_. See [Vehicle Properties](#properties) for further details
 - Read/Write access
 
-| Channel Label           | Channel ID          | Type    | Access |
-|-------------------------|---------------------|---------|--------|
-| Remote Service Command  | command             | String  | Write  |
-| Service Execution State | state               | String  | Read   |
+| Channel ID          | Type    | Access |
+|---------------------|---------|--------|
+| command             | String  | Write  |
+| state               | String  | Read   |
 
 The channel _command_ provides options
 
@@ -379,25 +399,25 @@ Charging options with date and time for preferred time windows and charging mode
 - Read access for UI.
 - There are 4 timers _T1, T2, T3 and T4_ available. Replace _X_ with number 1,2 or 3 to target the correct timer
 
-| Channel Label              | Channel ID                | Type     |
-|----------------------------|---------------------------|----------|
-| Charge Mode                | mode                      | String   |
-| Charge Preferences         | prefs                     | String   |
-| Charging Plan              | control                   | String   |
-| SoC Target                 | target                    | String   |
-| Charging Energy Limited    | limit                     | Switch   |
-| Window Start Time          | window-start              | DateTime |
-| Window End Time            | window-end                | DateTime |
-| A/C at Departure           | climate                   | Switch   |
-| T_X_ Enabled               | timer_X_-enabled          | Switch   |
-| T_X_ Departure Time        | timer_X_-departure        | DateTime |
-| T_X_ Monday                | timer_X_-day-mon          | Switch   |
-| T_X_ Tuesday               | timer_X_-day-tue          | Switch   |
-| T_X_ Wednesday             | timer_X_-day-wed          | Switch   |
-| T_X_ Thursday              | timer_X_-day-thu          | Switch   |
-| T_X_ Friday                | timer_X_-day-fri          | Switch   |
-| T_X_ Saturday              | timer_X_-day-sat          | Switch   |
-| T_X_ Sunday                | timer_X_-day-sun          | Switch   |
+| Channel ID                | Type     |
+|---------------------------|----------|
+| mode                      | String   |
+| prefs                     | String   |
+| control                   | String   |
+| target                    | String   |
+| limit                     | Switch   |
+| window-start              | DateTime |
+| window-end                | DateTime |
+| climate                   | Switch   |
+| timer_X_-enabled          | Switch   |
+| timer_X_-departure        | DateTime |
+| timer_X_-day-mon          | Switch   |
+| timer_X_-day-tue          | Switch   |
+| timer_X_-day-wed          | Switch   |
+| timer_X_-day-thu          | Switch   |
+| timer_X_-day-fri          | Switch   |
+| timer_X_-day-sat          | Switch   |
+| timer_X_-day-sun          | Switch   |
 
 The channel _profile-mode_ supports
 
@@ -417,11 +437,11 @@ Shows charge statistics of the current month
 - Available for electric and hybrid vehicles
 - Read-only values
 
-| Channel Label              | Channel ID              | Type           |
-|----------------------------|-------------------------|----------------|
-| Charge Statistic Month     | title                   | String         |
-| Energy Charged             | energy                  | Number:Energy  |
-| Charge Sessions            | sessions                | Number         |
+| Channel ID              | Type           | Description             |
+|-------------------------|----------------|-------------------------|
+| title                   | String         | Title of the statistics |
+| energy                  | Number:Energy  | Consumed energy         |
+| sessions                | Number         | Number of sessions      |
 
 #### Charge Sessions
 
@@ -432,13 +452,13 @@ If more than one message is active the channel _name_ contains all active messag
 - Available for electric and hybrid vehicles
 - Read-only values
 
-| Channel Label                   | Channel ID   | Type     |
-|---------------------------------|--------------|----------|
-| Session Title                   | title        | String   |
-| Session Details                 | subtitle     | String   |
-| Charged Energy in Session       | energy       | String   |
-| Issues during Session           | issue        | String   |
-| Session Status                  | status       | String   |
+| Channel ID   | Type     | Description             |
+|--------------|----------|-------------------------|
+| title        | String   | Title of the session    |
+| subtitle     | String   | Subtitle of the session |
+| energy       | String   | Consumed energy         |
+| issue        | String   | If an issue occurred    |
+| status       | String   | Status of the session   |
 
 #### Tire Pressure
 
@@ -448,16 +468,16 @@ Current and target tire pressure values
 - Available for all vehicles if corresponding sensors are built-in
 - Read-only values
 
-| Channel Label              | Channel ID              | Type             |
-|----------------------------|-------------------------|------------------|
-| Front Left                 | fl-current              | Number:Pressure  |
-| Front Left Target          | fl-target               | Number:Pressure  |
-| Front Right                | fr-current              | Number:Pressure  |
-| Front Right Target         | fr-target               | Number:Pressure  |
-| Rear Left                  | rl-current              | Number:Pressure  |
-| Rear Left Target           | rl-target               | Number:Pressure  |
-| Rear Right                 | rr-current              | Number:Pressure  |
-| Rear Right Target          | rr-target               | Number:Pressure  |
+| Channel ID              | Type             | Description                  |
+|-------------------------|------------------|------------------------------|
+| fl-current              | Number:Pressure  | Current pressure front left  |
+| fl-target               | Number:Pressure  | Target pressure front left   |
+| fr-current              | Number:Pressure  | Current pressure front right |
+| fr-target               | Number:Pressure  | Target pressure front right  |
+| rl-current              | Number:Pressure  | Current pressure rear left   |
+| rl-target               | Number:Pressure  | Target pressure rear left    |
+| rr-current              | Number:Pressure  | Current pressure rear right  |
+| rr-target               | Number:Pressure  | Target pressure rear right   |
 
 #### Image
 
@@ -467,10 +487,10 @@ Image representation of the vehicle.
 - Available for all vehicles
 - Read/Write access
 
-| Channel Label              | Channel ID          | Type   |  Access  |
-|----------------------------|---------------------|--------|----------|
-| Rendered Vehicle Image     | png                 | Image  | Read     |
-| Image Viewport             | view                | String | Write    |
+| Channel ID          | Type   |  Access  | Description               |
+|---------------------|--------|----------|---------------------------|
+| png                 | Image  | Read     | The image as png          |
+| view                | String | Write    | The view port of the car  |
 
 Possible view ports:
 
index 9c5945f7ea2fd404b06b358f99a1467bf8e8cc18..33664482b4e5a92108532157940823327cc48ade 100644 (file)
@@ -58,7 +58,7 @@ public interface MyBMWConstants {
 
     static final int DEFAULT_IMAGE_SIZE_PX = 1024;
 
-    static final int DEFAULT_REFRESH_INTERVAL_MINUTES = 5;
+    static final int DEFAULT_REFRESH_INTERVAL_MINUTES = 60;
 
     // See constants from bimmer-connected
     // https://github.com/bimmerconnected/bimmer_connected/blob/master/bimmer_connected/vehicle.py
@@ -107,6 +107,7 @@ public interface MyBMWConstants {
             THING_TYPE_PHEV, THING_TYPE_BEV_REX, THING_TYPE_BEV);
 
     // Thing Group definitions
+    static final String CHANNEL_GROUP_UPDATE = "update";
     static final String CHANNEL_GROUP_STATUS = "status";
     static final String CHANNEL_GROUP_SERVICE = "service";
     static final String CHANNEL_GROUP_CHECK_CONTROL = "check";
@@ -120,6 +121,11 @@ public interface MyBMWConstants {
     static final String CHANNEL_GROUP_TIRES = "tires";
     static final String CHANNEL_GROUP_VEHICLE_IMAGE = "image";
 
+    // types of updates
+    static final String STATE_UPDATE = "state-update";
+    static final String CHARGING_UPDATE = "charging-update";
+    static final String IMAGE_UPDATE = "image-update";
+
     // Charge Statistics & Sessions
     static final String SESSIONS = "sessions";
     static final String ENERGY = "energy";
index 514af0a8de4fc2740755bfef21d3912a334a563d..90589a9e3aef790b1c589430f4c2152333ae41fc 100644 (file)
@@ -87,7 +87,7 @@ public class RemoteServiceExecutor {
                             ExecutionState.TIMEOUT.name().toLowerCase());
                     reset();
                     // immediately refresh data
-                    handler.getData();
+                    handler.updateData();
                 } else {
                     counter++;
                     try {
index 8bac40024a9f6e36b668069520c4eaf064528c63..5caaa1468f1f2932e33d2003128531ab5448e694 100644 (file)
@@ -24,6 +24,7 @@ import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHANNEL_GROUP_RE
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHANNEL_GROUP_SERVICE;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHANNEL_GROUP_STATUS;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHANNEL_GROUP_TIRES;
+import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHANNEL_GROUP_UPDATE;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHANNEL_GROUP_VEHICLE_IMAGE;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHARGE_ENABLED;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHARGE_PROFILE_CLIMATE;
@@ -34,6 +35,7 @@ import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHARGE_PROFILE_P
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHARGE_PROFILE_TARGET;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHARGE_REMAINING;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHARGE_STATUS;
+import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHARGING_UPDATE;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.CHECK_CONTROL;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.DATE;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.DETAILS;
@@ -54,6 +56,7 @@ import static org.openhab.binding.mybmw.internal.MyBMWConstants.HEADING;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.HOME_DISTANCE;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.HOOD;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.IMAGE_FORMAT;
+import static org.openhab.binding.mybmw.internal.MyBMWConstants.IMAGE_UPDATE;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.IMAGE_VIEWPORT;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.ISSUE;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.LAST_FETCHED;
@@ -81,6 +84,7 @@ import static org.openhab.binding.mybmw.internal.MyBMWConstants.SERVICE_MILEAGE;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.SESSIONS;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.SEVERITY;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.SOC;
+import static org.openhab.binding.mybmw.internal.MyBMWConstants.STATE_UPDATE;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.STATUS;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.SUBTITLE;
 import static org.openhab.binding.mybmw.internal.MyBMWConstants.SUNROOF;
@@ -207,6 +211,8 @@ public class VehicleHandler extends BaseThingHandler {
 
     private ImageProperties imageProperties = new ImageProperties();
 
+    private ThingStatus currentStatus = ThingStatus.UNKNOWN;
+
     public VehicleHandler(Thing thing, MyBMWCommandOptionProvider commandOptionProvider,
             LocationProvider locationProvider, TimeZoneProvider timeZoneProvider, String driveTrain) {
         super(thing);
@@ -237,7 +243,8 @@ public class VehicleHandler extends BaseThingHandler {
     @Override
     public void initialize() {
         logger.trace("VehicleHandler.initialize");
-        updateStatus(ThingStatus.UNKNOWN);
+        currentStatus = ThingStatus.UNKNOWN;
+        updateStatus(currentStatus);
         vehicleConfiguration = Optional.of(getConfigAs(MyBMWVehicleConfiguration.class));
 
         Bridge bridge = getBridge();
@@ -257,20 +264,26 @@ public class VehicleHandler extends BaseThingHandler {
         updateChannel(CHANNEL_GROUP_VEHICLE_IMAGE, IMAGE_VIEWPORT, Converter.toTitleCase(imageProperties.viewport),
                 null);
 
-        // start update schedule
         startSchedule(vehicleConfiguration.get().getRefreshInterval());
     }
 
     private void startSchedule(int interval) {
-        logger.trace("VehicleHandler.startSchedule");
-        refreshJob.ifPresentOrElse(job -> {
-            if (job.isCancelled()) {
+        // start update schedule only if the refreshInterval is not 0
+        if (interval > 0) {
+            logger.info("VehicleHandler.startSchedule with interval {}min", interval);
+            refreshJob.ifPresentOrElse(job -> {
+                if (job.isCancelled()) {
+                    refreshJob = Optional
+                            .of(scheduler.scheduleWithFixedDelay(this::updateData, 0, interval, TimeUnit.MINUTES));
+                } // else - scheduler is already running!
+            }, () -> {
                 refreshJob = Optional
-                        .of(scheduler.scheduleWithFixedDelay(this::getData, 0, interval, TimeUnit.MINUTES));
-            } // else - scheduler is already running!
-        }, () -> {
-            refreshJob = Optional.of(scheduler.scheduleWithFixedDelay(this::getData, 0, interval, TimeUnit.MINUTES));
-        });
+                        .of(scheduler.scheduleWithFixedDelay(this::updateData, 0, interval, TimeUnit.MINUTES));
+            });
+        } else {
+            logger.info("VehicleHandler initialize: don't start schedule as interval is 0");
+            updateData();
+        }
     }
 
     @Override
@@ -281,25 +294,44 @@ public class VehicleHandler extends BaseThingHandler {
         remote.ifPresent(RemoteServiceExecutor::cancel);
     }
 
-    public void getData() {
-        logger.trace("VehicleHandler.getData");
+    /**
+     * update all data
+     */
+    void updateData() {
+        logger.trace("VehicleHandler.updateData");
+        updateVehicleStatus();
+        if (isElectric) {
+            updateCharging();
+        }
+        updateImage();
+    }
+
+    private void updateVehicleStatus() {
         proxy.ifPresentOrElse(prox -> {
             vehicleConfiguration.ifPresentOrElse(config -> {
-
-                boolean stateError = false;
                 try {
                     VehicleStateContainer vehicleState = prox.requestVehicleState(config.getVin(),
                             config.getVehicleBrand());
                     triggerVehicleStatusUpdate(vehicleState, null);
-                    stateError = false;
+                    currentStatus = ThingStatus.ONLINE;
+                    updateStatus(currentStatus);
                 } catch (NetworkException e) {
                     logger.debug("{}", e.toString());
-                    updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
-                            "Vehicle State Update failed");
-                    stateError = true;
+                    currentStatus = ThingStatus.OFFLINE;
+                    updateStatus(currentStatus, ThingStatusDetail.COMMUNICATION_ERROR, "Vehicle State Update failed");
                 }
+            }, () -> {
+                logger.warn("MyBMW Vehicle Configuration isn't present");
+            });
+        }, () -> {
+            logger.warn("MyBMWProxy isn't present");
+        });
+    }
 
-                if (!stateError && isElectric) {
+    private void updateCharging() {
+        proxy.ifPresentOrElse(prox -> {
+            vehicleConfiguration.ifPresentOrElse(config -> {
+                if (isElectric && ThingStatus.ONLINE.equals(currentStatus)) {
                     try {
                         updateChargingStatistics(
                                 prox.requestChargeStatistics(config.getVin(), config.getVehicleBrand()), null);
@@ -309,7 +341,19 @@ public class VehicleHandler extends BaseThingHandler {
                         logger.debug("{}", e.toString());
                     }
                 }
-                if (!stateError && !imageCache.isPresent() && !imageProperties.failLimitReached()) {
+            }, () -> {
+                logger.warn("MyBMW Vehicle Configuration isn't present");
+            });
+        }, () -> {
+            logger.warn("MyBMWProxy isn't present");
+        });
+    }
+
+    private void updateImage() {
+        proxy.ifPresentOrElse(prox -> {
+            vehicleConfiguration.ifPresentOrElse(config -> {
+                if (!imageCache.isPresent() && !imageProperties.failLimitReached()
+                        && ThingStatus.ONLINE.equals(currentStatus)) {
                     try {
                         updateImage(prox.requestImage(config.getVin(), config.getVehicleBrand(), imageProperties));
                     } catch (NetworkException e) {
@@ -334,8 +378,6 @@ public class VehicleHandler extends BaseThingHandler {
             if (isElectric) {
                 updateChargingProfile(vehicleState.getState().getChargingProfile(), channelToBeUpdated);
             }
-
-            updateStatus(ThingStatus.ONLINE);
         } else {
             logger.debug("configuration not present");
         }
@@ -951,6 +993,23 @@ public class VehicleHandler extends BaseThingHandler {
                     logger.debug("Cannot handle command {}, channel {} in group {} not a command channel",
                             command.toFullString(), channelUID.getAsString(), group);
             }
+        } else if (command instanceof OnOffType) {
+            if (CHANNEL_GROUP_UPDATE.equals(group) && OnOffType.ON.equals(command)) {
+                // triggering the update of the respective channel
+                switch (channelUID.getIdWithoutGroup()) {
+                    case STATE_UPDATE:
+                        updateVehicleStatus();
+                        break;
+                    case CHARGING_UPDATE:
+                        updateCharging();
+                        break;
+                    case IMAGE_UPDATE:
+                        updateImage();
+                        break;
+                    default:
+                        break;
+                }
+            }
         }
     }
 
index 0b45eb09e64606a9785d9ca37ec0afb6588cf401..fcd28b08acb1e5f26beb0f9e9278edc233a907b2 100644 (file)
@@ -9,7 +9,7 @@
                        <label>Vehicle Identification Number (VIN)</label>
                        <description>Unique VIN given by BMW</description>
                </parameter>
-               <parameter name="refreshInterval" type="integer" min="1" unit="min" required="true">
+               <parameter name="refreshInterval" type="integer" min="0" unit="min" required="true">
                        <label>Refresh Interval</label>
                        <description>Data refresh rate for your vehicle data</description>
                        <default>5</default>
index efe4407fc345c9491b1e0b10d4fa8e20e9baf64e..e740934957759cbc05ec4404847b88a659c3d67f 100644 (file)
@@ -16,7 +16,7 @@ thing-type.config.mybmw.bridge.region.option.ROW = Rest of the World
 thing-type.config.mybmw.bridge.userName.description = MyBMW Username
 thing-type.config.mybmw.bridge.userName.label = Username
 
-thing-type.config.mybmw.vehicle.refreshInterval.description = Data refresh rate for your vehicle data
+thing-type.config.mybmw.vehicle.refreshInterval.description = Data refresh rate for your vehicle data. If set to 0 no refresh will be triggered automatically.
 thing-type.config.mybmw.vehicle.refreshInterval.label = Refresh Interval
 thing-type.config.mybmw.vehicle.vehicleBrand.description = Vehicle brand like BMW or Mini
 thing-type.config.mybmw.vehicle.vehicleBrand.label = Brand of the Vehicle
@@ -46,6 +46,8 @@ channel-group-type.mybmw.ev-range-values.description = Provides Mileage, remaini
 channel-group-type.mybmw.ev-range-values.label = Range and Charge Data
 channel-group-type.mybmw.ev-vehicle-status.description = Overall vehicle status
 channel-group-type.mybmw.ev-vehicle-status.label = Vehicle Status
+channel-group-type.mybmw.ev-vehicle-update.description = Force the update of the vehicle data
+channel-group-type.mybmw.ev-vehicle-update.label = Force Vehicle Update
 channel-group-type.mybmw.hybrid-range-values.description = Provides mileage, remaining fuel and range data for hybrid vehicles
 channel-group-type.mybmw.hybrid-range-values.label = Range, Charge / Fuel Data
 channel-group-type.mybmw.image-values.description = Provides an image of your vehicle
@@ -65,12 +67,16 @@ channel-group-type.mybmw.tire-pressures.description = Current and wanted pressur
 channel-group-type.mybmw.tire-pressures.label = Tire Pressure
 channel-group-type.mybmw.vehicle-status.description = Overall vehicle status
 channel-group-type.mybmw.vehicle-status.label = Vehicle Status
+channel-group-type.mybmw.vehicle-update.description = Force the update of the vehicle data
+channel-group-type.mybmw.vehicle-update.label = Force Vehicle Update
+
 
 # channel types
 channel-type.mybmw.address-channel.label = Address
 channel-type.mybmw.charging-info-channel.label = Charging Information
 channel-type.mybmw.charging-remaining-channel.label = Remaining Charging Time
 channel-type.mybmw.charging-status-channel.label = Charging Status
+channel-type.mybmw.charging-update-channel.label = Force update of the charging data
 channel-type.mybmw.check-control-channel.label = Check Control
 channel-type.mybmw.checkcontrol-details-channel.label = CheckControl Details
 channel-type.mybmw.checkcontrol-name-channel.label = CheckControl Description
@@ -91,6 +97,7 @@ channel-type.mybmw.home-distance-channel.description = Computed distance between
 channel-type.mybmw.home-distance-channel.label = Distance From Home
 channel-type.mybmw.hood-channel.label = Hood
 
+channel-type.mybmw.image-update-channel.label = Force update of the image
 channel-type.mybmw.image-view-channel.command.option.FrontLeft = Left Side View
 channel-type.mybmw.image-view-channel.command.option.FrontRight = Right Side View
 channel-type.mybmw.image-view-channel.command.option.FrontView = Front View
@@ -161,6 +168,7 @@ channel-type.mybmw.session-subtitle-channel.label = Session Details
 channel-type.mybmw.session-title-channel.label = Session Title
 channel-type.mybmw.soc-channel.label = Battery Charge Level
 
+channel-type.mybmw.state-update-channel.label = Force update of the vehicle state data
 channel-type.mybmw.statistic-energy-channel.description = Total energy charged in current month
 channel-type.mybmw.statistic-energy-channel.label = Energy Charged
 channel-type.mybmw.statistic-sessions-channel.description = Number of charging sessions this month
diff --git a/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/ev-vehicle-update-group.xml b/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/ev-vehicle-update-group.xml
new file mode 100644 (file)
index 0000000..1d7548c
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<thing:thing-descriptions bindingId="mybmw"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
+       xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
+       <channel-group-type id="ev-vehicle-update">
+               <label>Vehicle Update</label>
+               <description>Triggering the vehicle update</description>
+               <channels>
+                       <channel id="state-update" typeId="state-update-channel"/>
+                       <channel id="charging-update" typeId="charging-update-channel"/>
+                       <channel id="image-update" typeId="image-update-channel"/>
+               </channels>
+       </channel-group-type>
+</thing:thing-descriptions>
index 79231853b02917d7d0b05af72f742948dc011987..2cc92d32946b24d23d27eab26019673aeb36b5dd 100644 (file)
@@ -13,6 +13,7 @@
                <description>Battery Electric Vehicle (BEV)</description>
 
                <channel-groups>
+                       <channel-group id="update" typeId="ev-vehicle-update"/>
                        <channel-group id="status" typeId="ev-vehicle-status"/>
                        <channel-group id="doors" typeId="door-values"/>
                        <channel-group id="range" typeId="ev-range-values"/>
@@ -28,7 +29,7 @@
                </channel-groups>
 
                <properties>
-                       <property name="thingTypeVersion">1</property>
+                       <property name="thingTypeVersion">2</property>
                </properties>
 
                <representation-property>vin</representation-property>
index 1053f4772b7f4fddf351072a08edf7848de73660..e21f6c5445098296f1d749f644c3d406c6c678a9 100644 (file)
@@ -13,6 +13,7 @@
                <description>Battery Electric Vehicle with Range Extender (BEV_REX)</description>
 
                <channel-groups>
+                       <channel-group id="update" typeId="ev-vehicle-update"/>
                        <channel-group id="status" typeId="ev-vehicle-status"/>
                        <channel-group id="doors" typeId="door-values"/>
                        <channel-group id="range" typeId="hybrid-range-values"/>
@@ -28,7 +29,7 @@
                </channel-groups>
 
                <properties>
-                       <property name="thingTypeVersion">1</property>
+                       <property name="thingTypeVersion">2</property>
                </properties>
 
                <representation-property>vin</representation-property>
index 52117d02a7a6feaea51e7b37dd5b9992f14f7a17..1808edd814aedbab7e3cd595d617411ca20e04a2 100644 (file)
@@ -13,6 +13,7 @@
                <description>Conventional Fuel Vehicle (CONV)</description>
 
                <channel-groups>
+                       <channel-group id="update" typeId="vehicle-update"/>
                        <channel-group id="status" typeId="vehicle-status"/>
                        <channel-group id="doors" typeId="door-values"/>
                        <channel-group id="range" typeId="conv-range-values"/>
@@ -25,7 +26,7 @@
                </channel-groups>
 
                <properties>
-                       <property name="thingTypeVersion">1</property>
+                       <property name="thingTypeVersion">2</property>
                </properties>
 
                <representation-property>vin</representation-property>
index 9777d60d467a9a63c24b01491b63ae8b7bb84c4a..8e2e0c1c946c38588dee1cdd38ab26ae607b333c 100644 (file)
@@ -13,6 +13,7 @@
                <description>Conventional Fuel Vehicle with supporting Electric Engine (PHEV)</description>
 
                <channel-groups>
+                       <channel-group id="update" typeId="ev-vehicle-update"/>
                        <channel-group id="status" typeId="ev-vehicle-status"/>
                        <channel-group id="doors" typeId="door-values"/>
                        <channel-group id="range" typeId="hybrid-range-values"/>
@@ -28,7 +29,7 @@
                </channel-groups>
 
                <properties>
-                       <property name="thingTypeVersion">1</property>
+                       <property name="thingTypeVersion">2</property>
                </properties>
 
                <representation-property>vin</representation-property>
diff --git a/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/vehicle-update-channel-types.xml b/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/vehicle-update-channel-types.xml
new file mode 100644 (file)
index 0000000..b081aa9
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<thing:thing-descriptions bindingId="mybmw"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
+       xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
+       <channel-type id="state-update-channel">
+               <item-type>Switch</item-type>
+               <label>trigger the update of the state</label>
+               <autoUpdatePolicy>veto</autoUpdatePolicy>
+       </channel-type>
+       <channel-type id="charging-update-channel">
+               <item-type>Switch</item-type>
+               <label>trigger the update of the charging information</label>
+               <autoUpdatePolicy>veto</autoUpdatePolicy>
+       </channel-type>
+       <channel-type id="image-update-channel">
+               <item-type>Switch</item-type>
+               <label>trigger the update of the image</label>
+               <autoUpdatePolicy>veto</autoUpdatePolicy>
+       </channel-type>
+</thing:thing-descriptions>
diff --git a/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/vehicle-update-group.xml b/bundles/org.openhab.binding.mybmw/src/main/resources/OH-INF/thing/vehicle-update-group.xml
new file mode 100644 (file)
index 0000000..dec8a3d
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<thing:thing-descriptions bindingId="mybmw"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
+       xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
+       <channel-group-type id="vehicle-update">
+               <label>Vehicle Update</label>
+               <description>Triggering the vehicle update</description>
+               <channels>
+                       <channel id="state-update" typeId="state-update-channel"/>
+                       <channel id="image-update" typeId="image-update-channel"/>
+               </channels>
+       </channel-group-type>
+</thing:thing-descriptions>
index d7b93817dda948d2bc71330e2d6a98225a25f839..1f7fb82c4d670d3d3c0a5db743c749e4c54142ec 100644 (file)
                        </add-channel>
                        <!-- channels to be updated -->
                </instruction-set>
+               <instruction-set targetVersion="2">
+                       <!-- channels to be removed -->
+                       <!-- channels to be added -->
+                       <add-channel id="state-update" groupIds="update">
+                               <type>mybmw:state-update-channel</type>
+                               <label>Force state update channel</label>
+                       </add-channel>
+                       <add-channel id="charging-update" groupIds="update">
+                               <type>mybmw:charging-update-channel</type>
+                               <label>Force charging update channel</label>
+                       </add-channel>
+                       <add-channel id="image-update" groupIds="update">
+                               <type>mybmw:image-update-channel</type>
+                               <label>Force image update channel</label>
+                       </add-channel>
+                       <!-- channels to be updated -->
+               </instruction-set>
        </thing-type>
        <thing-type uid="mybmw:bev">
                <instruction-set targetVersion="1">
                        </add-channel>
                        <!-- channels to be updated -->
                </instruction-set>
+               <instruction-set targetVersion="2">
+                       <!-- channels to be removed -->
+                       <!-- channels to be added -->
+                       <add-channel id="state-update" groupIds="update">
+                               <type>mybmw:state-update-channel</type>
+                               <label>Force state update channel</label>
+                       </add-channel>
+                       <add-channel id="charging-update" groupIds="update">
+                               <type>mybmw:charging-update-channel</type>
+                               <label>Force charging update channel</label>
+                       </add-channel>
+                       <add-channel id="image-update" groupIds="update">
+                               <type>mybmw:image-update-channel</type>
+                               <label>Force image update channel</label>
+                       </add-channel>
+                       <!-- channels to be updated -->
+               </instruction-set>
        </thing-type>
        <thing-type uid="mybmw:conv">
                <instruction-set targetVersion="1">
                        </add-channel>
                        <!-- channels to be updated -->
                </instruction-set>
+               <instruction-set targetVersion="2">
+                       <!-- channels to be removed -->
+                       <!-- channels to be added -->
+                       <add-channel id="state-update" groupIds="update">
+                               <type>mybmw:state-update-channel</type>
+                               <label>Force state update channel</label>
+                       </add-channel>
+                       <add-channel id="image-update" groupIds="update">
+                               <type>mybmw:image-update-channel</type>
+                               <label>Force image update channel</label>
+                       </add-channel>
+                       <!-- channels to be updated -->
+               </instruction-set>
        </thing-type>
        <thing-type uid="mybmw:phev">
                <instruction-set targetVersion="1">
                        </add-channel>
                        <!-- channels to be updated -->
                </instruction-set>
+               <instruction-set targetVersion="2">
+                       <!-- channels to be removed -->
+                       <!-- channels to be added -->
+                       <add-channel id="state-update" groupIds="update">
+                               <type>mybmw:state-update-channel</type>
+                               <label>Force state update channel</label>
+                       </add-channel>
+                       <add-channel id="charging-update" groupIds="update">
+                               <type>mybmw:charging-update-channel</type>
+                               <label>Force charging update channel</label>
+                       </add-channel>
+                       <add-channel id="image-update" groupIds="update">
+                               <type>mybmw:image-update-channel</type>
+                               <label>Force image update channel</label>
+                       </add-channel>
+                       <!-- channels to be updated -->
+               </instruction-set>
        </thing-type>
 
 </update:update-descriptions>
diff --git a/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV2/charging_sessions.json b/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV2/charging_sessions.json
new file mode 100644 (file)
index 0000000..7c9790e
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "chargingSessions": {
+        "total": "0 kWh",
+        "numberOfSessions": "0",
+        "emptyStateDescription": "Laden Sie Ihren BMW und verfolgen Sie Ihre Ladehistorie.\nLadevorgänge werden ab dem Aktivierungszeitpunkt gespeichert, d. h. ab dem 27.07.2020.",
+        "chargingListState": "CHARGE_AND_TRACK",
+        "costsGroupedByCurrency": []
+    },
+    "datePicker": {
+        "startDate": "2020-07-27T00:00:00Z",
+        "selectedDate": "2023-01-19T20:53:52Z",
+        "endDate": "2023-01-19T20:53:53Z"
+    }
+}
\ No newline at end of file
diff --git a/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV2/charging_statistics.json b/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV2/charging_statistics.json
new file mode 100644 (file)
index 0000000..67a6aaf
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "description": "Laden Sie Ihren BMW und verfolgen Sie Ihre Ladehistorie. Ladevorgänge werden ab dem Aktivierungszeitpunkt gespeichert, d. h. ab dem 27.07.2020.",
+    "optStateType": "OPT_IN_WITHOUT_SESSIONS",
+    "statistics": {
+        "totalEnergyCharged": 0,
+        "numberOfChargingSessions": 0
+    }
+}
\ No newline at end of file
diff --git a/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV2/vehicles_base.json b/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV2/vehicles_base.json
new file mode 100644 (file)
index 0000000..d4ddb4c
--- /dev/null
@@ -0,0 +1,48 @@
+[
+    {
+        "vin": "anonymousBEV3",
+        "mappingInfo": {
+            "isAssociated": true,
+            "isLmmEnabled": false,
+            "mappingStatus": "CONFIRMED",
+            "isPrimaryUser": true
+        },
+        "appVehicleType": "CONNECTED",
+        "attributes": {
+            "lastFetched": "2023-01-21T18: 57: 39.114Z",
+            "model": "iX3 M Sport",
+            "year": 2022,
+            "color": 4280231501,
+            "brand": "BMW",
+            "driveTrain": "ELECTRIC",
+            "headUnitType": "MGU",
+            "headUnitRaw": "HU_MGU",
+            "hmiVersion": "ID7",
+            "softwareVersionCurrent": {
+                "puStep": {
+                    "month": 3,
+                    "year": 22
+                },
+                "iStep": 552,
+                "seriesCluster": "S15C"
+            },
+            "softwareVersionExFactory": {
+                "puStep": {
+                    "month": 11,
+                    "year": 21
+                },
+                "iStep": 564,
+                "seriesCluster": "S15C"
+            },
+            "telematicsUnit": "ATM2",
+            "bodyType": "G08",
+            "countryOfOrigin": "AT",
+            "driverGuideInfo": {
+                "androidAppScheme": "com.bmwgroup.driversguide.row",
+                "iosAppScheme": "bmwdriversguide: ///open",
+                "androidStoreUrl": "https://play.google.com/store/apps/details?id=com.bmwgroup.driversguide.row",
+                "iosStoreUrl": "https://apps.apple.com/de/app/id714042749?mt=8"
+            }
+        }
+    }
+]
\ No newline at end of file
diff --git a/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV4/charging_sessions.json b/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV4/charging_sessions.json
new file mode 100644 (file)
index 0000000..7c9790e
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "chargingSessions": {
+        "total": "0 kWh",
+        "numberOfSessions": "0",
+        "emptyStateDescription": "Laden Sie Ihren BMW und verfolgen Sie Ihre Ladehistorie.\nLadevorgänge werden ab dem Aktivierungszeitpunkt gespeichert, d. h. ab dem 27.07.2020.",
+        "chargingListState": "CHARGE_AND_TRACK",
+        "costsGroupedByCurrency": []
+    },
+    "datePicker": {
+        "startDate": "2020-07-27T00:00:00Z",
+        "selectedDate": "2023-01-19T20:53:52Z",
+        "endDate": "2023-01-19T20:53:53Z"
+    }
+}
\ No newline at end of file
diff --git a/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV4/charging_statistics.json b/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV4/charging_statistics.json
new file mode 100644 (file)
index 0000000..67a6aaf
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "description": "Laden Sie Ihren BMW und verfolgen Sie Ihre Ladehistorie. Ladevorgänge werden ab dem Aktivierungszeitpunkt gespeichert, d. h. ab dem 27.07.2020.",
+    "optStateType": "OPT_IN_WITHOUT_SESSIONS",
+    "statistics": {
+        "totalEnergyCharged": 0,
+        "numberOfChargingSessions": 0
+    }
+}
\ No newline at end of file
diff --git a/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV5/charging_sessions.json b/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV5/charging_sessions.json
new file mode 100644 (file)
index 0000000..7c9790e
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "chargingSessions": {
+        "total": "0 kWh",
+        "numberOfSessions": "0",
+        "emptyStateDescription": "Laden Sie Ihren BMW und verfolgen Sie Ihre Ladehistorie.\nLadevorgänge werden ab dem Aktivierungszeitpunkt gespeichert, d. h. ab dem 27.07.2020.",
+        "chargingListState": "CHARGE_AND_TRACK",
+        "costsGroupedByCurrency": []
+    },
+    "datePicker": {
+        "startDate": "2020-07-27T00:00:00Z",
+        "selectedDate": "2023-01-19T20:53:52Z",
+        "endDate": "2023-01-19T20:53:53Z"
+    }
+}
\ No newline at end of file
diff --git a/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV5/charging_statistics.json b/bundles/org.openhab.binding.mybmw/src/test/resources/responses/BEV5/charging_statistics.json
new file mode 100644 (file)
index 0000000..67a6aaf
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "description": "Laden Sie Ihren BMW und verfolgen Sie Ihre Ladehistorie. Ladevorgänge werden ab dem Aktivierungszeitpunkt gespeichert, d. h. ab dem 27.07.2020.",
+    "optStateType": "OPT_IN_WITHOUT_SESSIONS",
+    "statistics": {
+        "totalEnergyCharged": 0,
+        "numberOfChargingSessions": 0
+    }
+}
\ No newline at end of file
diff --git a/bundles/org.openhab.binding.mybmw/src/test/resources/responses/PHEV/charging_sessions.json b/bundles/org.openhab.binding.mybmw/src/test/resources/responses/PHEV/charging_sessions.json
new file mode 100644 (file)
index 0000000..7c9790e
--- /dev/null
@@ -0,0 +1,14 @@
+{
+    "chargingSessions": {
+        "total": "0 kWh",
+        "numberOfSessions": "0",
+        "emptyStateDescription": "Laden Sie Ihren BMW und verfolgen Sie Ihre Ladehistorie.\nLadevorgänge werden ab dem Aktivierungszeitpunkt gespeichert, d. h. ab dem 27.07.2020.",
+        "chargingListState": "CHARGE_AND_TRACK",
+        "costsGroupedByCurrency": []
+    },
+    "datePicker": {
+        "startDate": "2020-07-27T00:00:00Z",
+        "selectedDate": "2023-01-19T20:53:52Z",
+        "endDate": "2023-01-19T20:53:53Z"
+    }
+}
\ No newline at end of file
diff --git a/bundles/org.openhab.binding.mybmw/src/test/resources/responses/PHEV/charging_statistics.json b/bundles/org.openhab.binding.mybmw/src/test/resources/responses/PHEV/charging_statistics.json
new file mode 100644 (file)
index 0000000..67a6aaf
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "description": "Laden Sie Ihren BMW und verfolgen Sie Ihre Ladehistorie. Ladevorgänge werden ab dem Aktivierungszeitpunkt gespeichert, d. h. ab dem 27.07.2020.",
+    "optStateType": "OPT_IN_WITHOUT_SESSIONS",
+    "statistics": {
+        "totalEnergyCharged": 0,
+        "numberOfChargingSessions": 0
+    }
+}
\ No newline at end of file