]> git.basschouten.com Git - openhab-addons.git/commitdiff
[miele] State/program/phase: Add raw channels and improve text channels (#11341)
authorjlaur <jacob-github@vindvejr.dk>
Sun, 10 Oct 2021 18:34:55 +0000 (20:34 +0200)
committerGitHub <noreply@github.com>
Sun, 10 Oct 2021 18:34:55 +0000 (20:34 +0200)
* Add raw channels for state, program and phase.
* Provide program/phase texts when missing from XGW 3000 and for multicast.
* Consistent handling of missing program/phase text across all appliance types.
* Fix tumble dryer example configuration.
* Changed tumble dryer Finished phase text for consistency.

Fixes #11335

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
23 files changed:
bundles/org.openhab.binding.miele/README.md
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/MieleBindingConstants.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/ApplianceChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/CoffeeMachineChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/DishwasherChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/FridgeFreezerChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HobChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/HoodChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/MieleApplianceHandler.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/OvenChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/TumbleDryerChannelSelector.java
bundles/org.openhab.binding.miele/src/main/java/org/openhab/binding/miele/internal/handler/WashingMachineChannelSelector.java
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/channeltypes.xml
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/coffeemachine.xml
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/dishwasher.xml
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridge.xml
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/fridgefreezer.xml
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/hob.xml
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/hood.xml
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/oven.xml
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/tumbledryer.xml
bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing/washingmachine.xml

index 1a71c52920e427898f78c860bfb132eccecd4284..39878f1a178c6ce90472fda249c603a0f90356a3 100644 (file)
@@ -32,7 +32,7 @@ When an XGW3000 gateway is discovered, all appliances can be subsequently discov
 
 ## Thing Configuration
 
-Each appliances needs the device UID as a configuration parameter.
+Each appliance needs the device UID as a configuration parameter.
 The UID is nowhere to be found on the appliances, but since the discovery works quite reliably, a manual configuration is not needed.
 
 Once you got hold of the IDs, a manual configuration looks like this:
@@ -55,17 +55,306 @@ Thing coffeemachine coffeemachine [uid="001d63fffe020505#190"]
 
 ## Channels
 
-The definition of the channels in use can best be checked in the [source repository](https://github.com/openhab/openhab-addons/tree/main/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing).
+See below which channels are available for each appliance type. Raw program and phase values are individual for each appliance type,
+while these raw state values are unique across all appliance types:
 
-## Example
+| State | Description                  | Appliances                                                      |
+|-------|------------------------------|-----------------------------------------------------------------|
+| 0     | Unknown                      | All                                                             |
+| 1     | Off                          | All                                                             |
+| 2     | Stand-By                     | All                                                             |
+| 3     | Programmed                   | Coffee Machine, Dishwasher, Oven, Tumble Dryer, Washing Machine |
+| 4     | Waiting to Start             | Coffee Machine, Dishwasher, Oven, Tumble Dryer, Washing Machine |
+| 5     | Running                      | All                                                             |
+| 6     | Paused                       | Coffee Machine, Dishwasher, Oven, Tumble Dryer, Washing Machine |
+| 7     | End                          | Coffee Machine, Dishwasher, Oven, Tumble Dryer, Washing Machine |
+| 8     | Failure                      | All                                                             |
+| 9     | Abort                        | Coffee Machine, Dishwasher, Oven, Tumble Dryer, Washing Machine |
+| 10    | Idle                         | All                                                             |
+| 11    | Rinse Hold                   | Washing Machine, Tumble Dryer                                   |
+| 12    | Service                      | All                                                             |
+| 13    | Super Freezing               | Fridge/Freezer combination                                      |
+| 14    | Super Cooling                | Fridge, Fridge/Freezer combination                              |
+| 15    | Super Heating                | Hob                                                             |
+| 144   | Default                      | All                                                             |
+| 145   | Locked                       | All                                                             |
+| 146   | Super Cooling/Super Freezing | Fridge/Freezer combination                                      |
+| 255   | Not Connected                | All                                                             |
 
-demo.items:
+### Coffee Machine
 
+| Channel             | Type                 | Read/write | Description                                                         |
+|---------------------|----------------------|------------|---------------------------------------------------------------------|
+| state               | String               | Read       | Current status of the appliance                                     |
+| rawState            | Number               | Read       | Current status of the appliance as raw number                       |
+| program             | String               | Read       | Current program or function running on the appliance                |
+| rawProgram          | Number               | Read       | Current program or function running on the appliance as raw number  |
+| type                | String               | Read       | Type of the program running on the appliance                        |
+| phase               | String               | Read       | Current phase of the program running on the appliance               |
+| rawPhase            | Number               | Read       | Current phase of the program running on the appliance as raw number |
+| door                | Contact              | Read       | Current state of the door of the appliance                          |
+| switch              | Switch               | Write      | Switch the appliance on or off                                      |
+
+### Dishwasher
+
+| Channel             | Type                 | Read/write | Description                                                         |
+|---------------------|----------------------|------------|---------------------------------------------------------------------|
+| state               | String               | Read       | Current status of the appliance                                     |
+| rawState            | Number               | Read       | Current status of the appliance as raw number                       |
+| program             | String               | Read       | Current program or function running on the appliance                |
+| rawProgram          | Number               | Read       | Current program or function running on the appliance as raw number  |
+| phase               | String               | Read       | Current phase of the program running on the appliance               |
+| rawPhase            | Number               | Read       | Current phase of the program running on the appliance as raw number |
+| start               | DateTime             | Read       | Programmed start time of the program                                |
+| duration            | DateTime             | Read       | Duration of the program running on the appliance                    |
+| elapsed             | DateTime             | Read       | Time elapsed in the program running on the appliance                |
+| finish              | DateTime             | Read       | Time to finish the program running on the appliance                 |
+| door                | Contact              | Read       | Current state of the door of the appliance                          |
+| switch              | Switch               | Write      | Switch the appliance on or off                                      |
+| powerConsumption    | Number:Power         | Read       | Power consumption by the currently running program on the appliance |
+| waterConsumption    | Number:Volume        | Read       | Water consumption by the currently running program on the appliance |
+
+### Fridge
+
+| Channel             | Type                 | Read/write | Description                                                         |
+|---------------------|----------------------|------------|---------------------------------------------------------------------|
+| state               | String               | Read       | Current status of the appliance                                     |
+| rawState            | Number               | Read       | Current status of the appliance as raw number                       |
+| supercool           | Switch               | Read/Write | Start or stop Super Cooling                                         |
+| current             | Number:Temperature   | Read       | Current temperature in the fridge                                   |
+| target              | Number:Temperature   | Read       | Target temperature to be reached by the fridge                      |
+| door                | Contact              | Read       | Current state of the door of the appliance                          |
+| switch              | Switch               | Write      | Switch the appliance on or off                                      |
+
+### Fridge/Freezer combination
+
+| Channel             | Type                 | Read/write | Description                                                         |
+|---------------------|----------------------|------------|---------------------------------------------------------------------|
+| state               | String               | Read       | Current status of the appliance                                     |
+| rawState            | Number               | Read       | Current status of the appliance as raw number                       |
+| freezerstate        | String               | Read       | Current status of the freezer compartment                           |
+| fridgestate         | String               | Read       | Current status of the fridge compartment                            |
+| supercool           | Switch               | Read/Write | Start or stop Super Cooling                                         |
+| superfreeze         | Switch               | Read/Write | Start or stop Super Freezing                                        |
+| freezercurrent      | Number:Temperature   | Read       | Current temperature in the freezer compartment                      |
+| freezertarget       | Number:Temperature   | Read       | Target temperature to be reached by the freezer compartment         |
+| fridgecurrent       | Number:Temperature   | Read       | Current temperature in the fridge compartment                       |
+| fridgetarget        | Number:Temperature   | Read       | Target temperature to be reached by the fridge compartment          |
+| door                | Contact              | Read       | Current state of the door of the appliance                          |
+| start               | Switch               | Write      | Switch the appliance on or off                                      |
+
+### Hob
+
+| Channel             | Type                 | Read/write | Description                                                         |
+|---------------------|----------------------|------------|---------------------------------------------------------------------|
+| state               | String               | Read       | Current status of the appliance                                     |
+| rawState            | Number               | Read       | Current status of the appliance as raw number                       |
+| plate1power         | Number               | Read       | Power level of heating zone/plate 1                                 |
+| plate1heat          | Number               | Read       | Remaining heat level of heating zone/plate 1                        |
+| plate1time          | String               | Read       | Remaining time of heating zone/plate 1                              |
+| plate2power         | Number               | Read       | Power level of heating zone/plate 2                                 |
+| plate2heat          | Number               | Read       | Remaining heat level of heating zone/plate 2                        |
+| plate2time          | String               | Read       | Remaining time of heating zone/plate 2                              |
+| plate3power         | Number               | Read       | Power level of heating zone/plate 3                                 |
+| plate3heat          | Number               | Read       | Remaining heat level of heating zone/plate 3                        |
+| plate3time          | String               | Read       | Remaining time of heating zone/plate 3                              |
+| plate4power         | Number               | Read       | Power level of heating zone/plate 4                                 |
+| plate4heat          | Number               | Read       | Remaining heat level of heating zone/plate 4                        |
+| plate4time          | String               | Read       | Remaining time of heating zone/plate 4                              |
+| plate5power         | Number               | Read       | Power level of heating zone/plate 5                                 |
+| plate5heat          | Number               | Read       | Remaining heat level of heating zone/plate 5                        |
+| plate5time          | String               | Read       | Remaining time of heating zone/plate 5                              |
+| plate6power         | Number               | Read       | Power level of heating zone/plate 6                                 |
+| plate6heat          | Number               | Read       | Remaining heat level of heating zone/plate 6                        |
+| plate6time          | String               | Read       | Remaining time of heating zone/plate 6                              |
+
+### Hood
+
+| Channel             | Type                 | Read/write | Description                                                         |
+|---------------------|----------------------|------------|---------------------------------------------------------------------|
+| state               | String               | Read       | Current status of the appliance                                     |
+| rawState            | Number               | Read       | Current status of the appliance as raw number                       |
+| light               | Switch               | Write      | Switch the appliance on or off                                      |
+| ventilation         | Number               | Read       | Current ventilation power                                           |
+| stop                | Switch               | Write      | Stop the appliance                                                  |
+
+### Oven
+
+| Channel             | Type                 | Read/write | Description                                                         |
+|---------------------|----------------------|------------|---------------------------------------------------------------------|
+| state               | String               | Read       | Current status of the appliance                                     |
+| rawState            | Number               | Read       | Current status of the appliance as raw number                       |
+| program             | String               | Read       | Current program or function running on the appliance                |
+| rawProgram          | Number               | Read       | Current program or function running on the appliance as raw number  |
+| type                | String               | Read       | Type of the program running on the appliance                        |
+| phase               | String               | Read       | Current phase of the program running on the appliance               |
+| rawPhase            | Number               | Read       | Current phase of the program running on the appliance as raw number |
+| start               | DateTime             | Read       | Programmed start time of the program                                |
+| duration            | DateTime             | Read       | Duration of the program running on the appliance                    |
+| elapsed             | DateTime             | Read       | Time elapsed in the program running on the appliance                |
+| finish              | DateTime             | Read       | Time to finish the program running on the appliance                 |
+| target              | Number:Temperature   | Read       | Target temperature to be reached by the oven                        |
+| measured            | Number:Temperature   | Read       | Actual measured temperature in the oven                             |
+| temp1               | Number:Temperature   | Read       | Program temperature in the oven 1                                   |
+| temp2               | Number:Temperature   | Read       | Program temperature in the oven 2                                   |
+| door                | Contact              | Read       | Current state of the door of the appliance                          |
+| switch              | Switch               | Write      | Switch the appliance on or off                                      |
+| stop                | Switch               | Write      | Stop the appliance                                                  |
+
+### Microwave/Oven combination
+
+See oven.
+
+### Tumble Dryer
+
+| Channel             | Type                 | Read/write | Description                                                         |
+|---------------------|----------------------|------------|---------------------------------------------------------------------|
+| state               | String               | Read       | Current status of the appliance                                     |
+| rawState            | Number               | Read       | Current status of the appliance as raw number                       |
+| program             | String               | Read       | Current program or function running on the appliance                |
+| rawProgram          | Number               | Read       | Current program or function running on the appliance as raw number  |
+| type                | String               | Read       | Type of the program running on the appliance                        |
+| phase               | String               | Read       | Current phase of the program running on the appliance               |
+| rawPhase            | Number               | Read       | Current phase of the program running on the appliance as raw number |
+| start               | DateTime             | Read       | Programmed start time of the program                                |
+| duration            | DateTime             | Read       | Duration of the program running on the appliance                    |
+| elapsed             | DateTime             | Read       | Time elapsed in the program running on the appliance                |
+| finish              | DateTime             | Read       | Time to finish the program running on the appliance                 |
+| door                | Contact              | Read       | Current state of the door of the appliance                          |
+| switch              | Switch               | Write      | Switch the appliance on or off                                      |
+| step                | Number               | Read       | Current step in the program running on the appliance                |
+
+### Washing Machine
+
+| Channel             | Type                 | Read/write | Description                                                         |
+|---------------------|----------------------|------------|---------------------------------------------------------------------|
+| state               | String               | Read       | Current status of the appliance                                     |
+| rawState            | Number               | Read       | Current status of the appliance as raw number                       |
+| program             | String               | Read       | Current program or function running on the appliance                |
+| rawProgram          | Number               | Read       | Current program or function running on the appliance as raw number  |
+| type                | String               | Read       | Type of the program running on the appliance                        |
+| phase               | String               | Read       | Current phase of the program running on the appliance               |
+| rawPhase            | Number               | Read       | Current phase of the program running on the appliance as raw number |
+| start               | DateTime             | Read       | Programmed start time of the program                                |
+| duration            | DateTime             | Read       | Duration of the program running on the appliance                    |
+| elapsed             | DateTime             | Read       | Time elapsed in the program running on the appliance                |
+| finish              | DateTime             | Read       | Time to finish the program running on the appliance                 |
+| door                | Contact              | Read       | Current state of the door of the appliance                          |
+| switch              | Switch               | Write      | Switch the appliance on or off                                      |
+| target              | Number:Temperature   | Read       | Temperature of the selected program                                 |
+| spinningspeed       | String               | Read       | Spinning speed in the program running on the appliance              |
+| powerConsumption    | Number:Power         | Read       | Power consumption by the currently running program on the appliance |
+| waterConsumption    | Number:Volume        | Read       | Water consumption by the currently running program on the appliance |
+
+# Configuration Examples
+
+## things/miele.things
+
+```
+Bridge miele:xgw3000:home [ipAddress="192.168.0.18", interface="192.168.0.5"] {
+    Things:
+        Thing fridgefreezer freezer [uid="00124b000424be44#2"]
+        Thing hood hood [uid="001d63fffe020685#210"]
+        Thing fridge fridge [uid="00124b000424bdc0#2"]
+        Thing oven oven [uid="001d63fffe020390#210"]
+        Thing oven microwave [uid="001d63fffe0206eb#210"]
+        Thing hob hob [uid="00124b000424bed7#2"]
+        Thing dishwasher dishwasher [uid="001d63fffe020683#210"]
+        Thing tumbledryer tumbledryer [uid="001d63fffe0200ba#210"]
+        Thing washingmachine washingmachine [uid="001d63fffe020505#210"]
+        Thing coffeemachine coffeemachine [uid="001d63fffe020505#190"]
+}
 ```
-String MieleFridgeState  (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:state"}
-Switch MieleFridgeSuperCool (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:supercool"}
-Number:Temperature MieleFridgeCurrent (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:current"}
-Number:Temperature MieleFridgeTarget (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:target"}
-Contact MieleFridgeDoor (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:door"}
-Switch MieleFridgeStart (gMiele,gMieleFridge) {channel="miele:fridge:dilbeek:fridge:start"}
+
+## items/miele.items
+
+```
+String Dishwasher_State                                     {channel="miele:dishwasher:home:dishwasher:state"}
+Number Dishwasher_RawState                                  {channel="miele:dishwasher:home:dishwasher:rawState"}
+String Dishwasher_Program "Program [%s]"                    {channel="miele:dishwasher:home:dishwasher:program"}
+String Dishwasher_Phase "Phase [%s]"                        {channel="miele:dishwasher:home:dishwasher:phase"}
+DateTime Dishwasher_ElapsedTime "Elapsed time" <time>       {channel="miele:dishwasher:home:dishwasher:elapsed"}
+DateTime Dishwasher_FinishTime "Remaining time" <time>      {channel="miele:dishwasher:home:dishwasher:finish"}
+Number:Power Dishwasher_PowerConsumption                    {channel="miele:dishwasher:home:dishwasher:powerConsumption"}
+Number:Volume Dishwasher_WaterConsumption                   {channel="miele:dishwasher:home:dishwasher:waterConsumption"}
+
+String Fridge_State                                         {channel="miele:fridge:home:fridge:state"}
+Contact Fridge_Door                                         {channel="miele:fridge:home:fridge:door"}
+Switch Fridge_SuperCool                                     {channel="miele:fridge:home:fridge:supercool"}
+Number:Temperature Fridge_CurrentTemperature <temperature>  {channel="miele:fridge:home:fridge:current"}
+Number:Temperature Fridge_TargetTemperature  <temperature>  {channel="miele:fridge:home:fridge:target"}
+Switch Fridge_Start                                         {channel="miele:fridge:home:fridge:start"}
+
+String Oven_State                                           {channel="miele:oven:home:oven:state"}
+Number Oven_RawState                                        {channel="miele:oven:home:oven:rawState"}
+String Oven_Program "Program [%s]"                          {channel="miele:oven:home:oven:program"}
+String Oven_Phase "Phase [%s]"                              {channel="miele:oven:home:oven:phase"}
+DateTime Oven_ElapsedTime "Elapsed time" <time>             {channel="miele:oven:home:oven:elapsed"}
+DateTime Oven_FinishTime "Remaining time" <time>            {channel="miele:oven:home:oven:finish"}
+Number:Temperature Oven_CurrentTemperature <temperature>    {channel="miele:oven:home:oven:measured"}
+Number:Temperature Oven_TargetTemperature <temperature>     {channel="miele:oven:home:oven:target"}
+Switch Oven_Stop                                            {channel="miele:oven:home:oven:stop", autoupdate="false"}
+
+String WashingMachine_State                                 {channel="miele:washingmachine:home:washingmachine:state"}
+Number WashingMachine_RawState                              {channel="miele:washingmachine:home:washingmachine:rawState"}
+String WashingMachine_Program "Program [%s]"                {channel="miele:washingmachine:home:washingmachine:program"}
+String WashingMachine_Phase "Phase [%s]"                    {channel="miele:washingmachine:home:washingmachine:phase"}
+Number:Temperature WashingMachine_Temperature <temperature> {channel="miele:washingmachine:home:washingmachine:target"}
+String WashingMachine_SpinningSpeed                         {channel="miele:washingmachine:home:washingmachine:spinningspeed"}
+DateTime WashingMachine_ElapsedTime "Elapsed time" <time>   {channel="miele:washingmachine:home:washingmachine:elapsed"}
+DateTime WashingMachine_FinishTime "Remaining time" <time>  {channel="miele:washingmachine:home:washingmachine:finish"}
+Number:Power WashingMachine_PowerConsumption                {channel="miele:washingmachine:home:washingmachine:powerConsumption"}
+Number:Volume WashingMachine_WaterConsumption               {channel="miele:washingmachine:home:washingmachine:waterConsumption"}
+
+String TumbleDryer_State                                    {channel="miele:tumbledryer:home:tumbledryer:state"}
+Number TumbleDryer_RawState                                 {channel="miele:tumbledryer:home:tumbledryer:rawState"}
+String TumbleDryer_Program "Program [%s]"                   {channel="miele:tumbledryer:home:tumbledryer:program"}
+String TumbleDryer_Phase "Phase [%s]"                       {channel="miele:tumbledryer:home:tumbledryer:phase"}
+DateTime TumbleDryer_ElapsedTime "Elapsed time" <time>      {channel="miele:tumbledryer:home:tumbledryer:elapsed"}
+DateTime TumbleDryer_FinishTime "Remaining time" <time>     {channel="miele:tumbledryer:home:tumbledryer:finish"}
+```
+
+## sitemaps/miele.sitemap
+
+```
+sitemap miele label="Miele" {
+    Frame label="Miele" {
+        Text item=Oven_State label="Oven [%s]" icon="kitchen" {
+            Text item=Oven_Program visibility=[Oven_RawState>1]
+            Text item=Oven_Phase visibility=[Oven_Phase!=UNDEF]
+            Text item=Oven_ElapsedTime
+            Text item=Oven_FinishTime
+            Switch item=Oven_Stop
+        }
+        Text item=WashingMachine_State label="Washing Machine [%s]" icon="washingmachine" {
+            Text item=WashingMachine_Program visibility=[WashingMachine_RawState>1]
+            Text item=WashingMachine_Temperature visibility=[WashingMachine_Program!=UNDEF]
+            Text item=WashingMachine_SpinningSpeed visibility=[WashingMachine_Program!=UNDEF]
+            Text item=WashingMachine_Phase visibility=[WashingMachine_Phase!=UNDEF]
+            Text item=WashingMachine_ElapsedTime
+            Text item=WashingMachine_FinishTime
+            Text item=WashingMachine_PowerConsumption
+            Text item=WashingMachine_WaterConsumption
+        }
+        Text item=TumbleDryer_State label="Tumble Dryer [%s]" icon="dryer" {
+            Text item=TumbleDryer_Program visibility=[TumbleDryer_RawState>1]
+            Text item=TumbleDryer_Phase visibility=[TumbleDryer_Phase!=UNDEF]
+            Text item=TumbleDryer_ElapsedTime
+            Text item=TumbleDryer_FinishTime
+        }
+        Text item=Dishwasher_State label="Dishwasher [%s]" icon="dryer" {
+            Text item=Dishwasher_Program visibility=[Dishwasher_RawState>1]
+            Text itemDishwasher_Phase visibility=[Dishwasher_Phase!=UNDEF]
+            Text item=Dishwasher_ElapsedTime
+            Text item=Dishwasher_FinishTime
+            Text item=Dishwasher_PowerConsumption
+            Text item=Dishwasher_WaterConsumption
+        }
+        Text item=Fridge_CurrentTemperature label="Fridge" icon="climate" {
+            Text item=Fridge_CurrentTemperature
+            Text item=Fridge_TargetTemperature
+            Switch item=Fridge_SuperCool icon="snow"
+        }
+    }
+}
 ```
index d9fd24ae909b093174a278f69d6d3f4be22c16b9..d286209118f7686f476cb2647e9d71a84f246d7c 100644 (file)
@@ -30,11 +30,22 @@ public class MieleBindingConstants {
     public static final String APPLIANCE_ID = "uid";
     public static final String DEVICE_CLASS = "dc";
     public static final String PROTOCOL_PROPERTY_NAME = "protocol";
+
+    // JSON-RPC property names
     public static final String SERIAL_NUMBER_PROPERTY_NAME = "serialNumber";
     public static final String EXTENDED_DEVICE_STATE_PROPERTY_NAME = "extendedDeviceState";
     public static final String STATE_PROPERTY_NAME = "state";
+    public static final String PROGRAM_ID_PROPERTY_NAME = "programId";
+    public static final String PHASE_PROPERTY_NAME = "phase";
+    public static final String RAW_PHASE_PROPERTY_NAME = "rawPhase";
 
     // Shared Channel ID's
+    public static final String STATE_TEXT_CHANNEL_ID = "state";
+    public static final String STATE_CHANNEL_ID = "rawState";
+    public static final String PROGRAM_TEXT_CHANNEL_ID = "program";
+    public static final String PROGRAM_CHANNEL_ID = "rawProgram";
+    public static final String PHASE_TEXT_CHANNEL_ID = "phase";
+    public static final String PHASE_CHANNEL_ID = "rawPhase";
     public static final String SUPERCOOL_CHANNEL_ID = "supercool";
     public static final String SUPERFREEZE_CHANNEL_ID = "superfreeze";
     public static final String POWER_CONSUMPTION_CHANNEL_ID = "powerConsumption";
@@ -77,6 +88,10 @@ public class MieleBindingConstants {
     public static final int STATE_LOCKED = 145;
     public static final int STATE_NOT_CONNECTED = 255;
 
+    // Miele missing string prefixes
+    public static final String MISSING_PROGRAM_TEXT_PREFIX = "program.";
+    public static final String MISSING_PHASE_TEXT_PREFIX = "phase.";
+
     // Bridge config properties
     public static final String HOST = "ipAddress";
     public static final String INTERFACE = "interface";
index 23b9fae8fc2407655b47bc5e84796409fff18fed..9ed9a638d204619fea2058979fe3b06818ee960d 100644 (file)
@@ -52,7 +52,6 @@ public interface ApplianceChannelSelector {
     boolean isExtendedState();
 
     /**
-     *
      * Returns a State for the given string, taking into
      * account the metadata provided. The meta data is sent by
      * the Miele appliance and is used to decide the State type
@@ -61,4 +60,12 @@ public interface ApplianceChannelSelector {
      * @param dmd - the device meta data
      */
     State getState(String s, DeviceMetaData dmd);
+
+    /**
+     * Returns a raw State for the given string, not taking into
+     * account any metadata.
+     *
+     * @param s - the value to be used to instantiate the State
+     */
+    State getState(String s);
 }
index 44b0bf3bbd3421d2fd50c112cfc55996319ae107..c88a70863654f53c4e1425588f0e407e1ca51fa3 100644 (file)
  */
 package org.openhab.binding.miele.internal.handler;
 
+import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
+
 import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.Map;
 import java.util.Map.Entry;
 
 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.OpenClosedType;
 import org.openhab.core.library.types.StringType;
@@ -31,6 +36,7 @@ import com.google.gson.JsonElement;
  * The {@link ApplianceChannelSelector} for coffee machines
  *
  * @author Stephan Esch - Initial contribution
+ * @author Jacob Laursen - Added raw channels
  */
 public enum CoffeeMachineChannelSelector implements ApplianceChannelSelector {
 
@@ -38,10 +44,31 @@ public enum CoffeeMachineChannelSelector implements ApplianceChannelSelector {
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
     BRAND_ID("brandId", "brandId", StringType.class, true),
     COMPANY_ID("companyId", "companyId", StringType.class, true),
-    STATE("state", "state", StringType.class, false),
-    PROGRAMID("programId", "program", StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
+    PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd) {
+            State state = getTextState(s, dmd, programs, MISSING_PROGRAM_TEXT_PREFIX);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd);
+        }
+    },
+    PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false),
     PROGRAMTYPE("programType", "type", StringType.class, false),
-    PROGRAMPHASE("phase", "phase", StringType.class, false),
+    PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd) {
+            State state = getTextState(s, dmd, phases, MISSING_PHASE_TEXT_PREFIX);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd);
+        }
+    },
+    PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false),
     // lightingStatus signalFailure signalInfo
     DOOR("signalDoor", "door", OpenClosedType.class, false) {
         @Override
@@ -61,6 +88,10 @@ public enum CoffeeMachineChannelSelector implements ApplianceChannelSelector {
 
     private final Logger logger = LoggerFactory.getLogger(CoffeeMachineChannelSelector.class);
 
+    private final static Map<String, String> programs = Collections.<String, String> emptyMap();
+
+    private final static Map<String, String> phases = Collections.<String, String> emptyMap();
+
     private final String mieleID;
     private final String channelID;
     private final Class<? extends Type> typeClass;
@@ -130,6 +161,24 @@ public enum CoffeeMachineChannelSelector implements ApplianceChannelSelector {
         return null;
     }
 
+    public State getTextState(String s, DeviceMetaData dmd, Map<String, String> valueMap, String prefix) {
+        if ("0".equals(s)) {
+            return UnDefType.UNDEF;
+        }
+
+        if (dmd == null || dmd.LocalizedValue == null || dmd.LocalizedValue.startsWith(prefix)) {
+            String text = valueMap.get(s);
+            if (text != null) {
+                return getState(text);
+            }
+            if (dmd == null || dmd.LocalizedValue == null) {
+                return getState(prefix + s);
+            }
+        }
+
+        return null;
+    }
+
     public String getMieleEnum(String s, DeviceMetaData dmd) {
         if (dmd.MieleEnum != null) {
             for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
index a8c819a025c826611aaa662a943aac2d2d1c1c18..2044cf22a17943ca82a99e50c48996f263bf7813 100644 (file)
  */
 package org.openhab.binding.miele.internal.handler;
 
-import static org.openhab.binding.miele.internal.MieleBindingConstants.EXTENDED_DEVICE_STATE_PROPERTY_NAME;
-import static org.openhab.binding.miele.internal.MieleBindingConstants.POWER_CONSUMPTION_CHANNEL_ID;
-import static org.openhab.binding.miele.internal.MieleBindingConstants.WATER_CONSUMPTION_CHANNEL_ID;
+import static java.util.Map.entry;
+import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.TimeZone;
 
 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
 import org.openhab.core.library.types.DateTimeType;
+import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.OpenClosedType;
 import org.openhab.core.library.types.QuantityType;
@@ -41,7 +42,7 @@ import com.google.gson.JsonElement;
  *
  * @author Karel Goderis - Initial contribution
  * @author Kai Kreuzer - Changed START_TIME to DateTimeType
- * @author Jacob Laursen - Added power/water consumption channels
+ * @author Jacob Laursen - Added power/water consumption channels, raw channels
  */
 public enum DishwasherChannelSelector implements ApplianceChannelSelector {
 
@@ -49,9 +50,30 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector {
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true, false),
     BRAND_ID("brandId", "brandId", StringType.class, true, false),
     COMPANY_ID("companyId", "companyId", StringType.class, true, false),
-    STATE("state", "state", StringType.class, false, false),
-    PROGRAMID("programId", "program", StringType.class, false, false),
-    PROGRAMPHASE("phase", "phase", StringType.class, false, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false, false),
+    STATE(null, STATE_CHANNEL_ID, DecimalType.class, false, false),
+    PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd) {
+            State state = getTextState(s, dmd, programs, MISSING_PROGRAM_TEXT_PREFIX);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd);
+        }
+    },
+    PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false, false),
+    PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd) {
+            State state = getTextState(s, dmd, phases, MISSING_PHASE_TEXT_PREFIX);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd);
+        }
+    },
+    PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false, false),
     START_TIME("startTime", "start", DateTimeType.class, false, false) {
         @Override
         public State getState(String s, DeviceMetaData dmd) {
@@ -130,6 +152,14 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector {
 
     private final Logger logger = LoggerFactory.getLogger(DishwasherChannelSelector.class);
 
+    private final static Map<String, String> programs = Map.ofEntries(entry("26", "Pots & Pans"),
+            entry("27", "Clean Machine"), entry("28", "Economy"), entry("30", "Normal"), entry("32", "Sensor Wash"),
+            entry("34", "Energy Saver"), entry("35", "China & Crystal"), entry("36", "Extra Quiet"),
+            entry("37", "SaniWash"), entry("38", "QuickPowerWash"), entry("42", "Tall items"));
+
+    private final static Map<String, String> phases = Map.ofEntries(entry("2", "Pre-Wash"), entry("3", "Main Wash"),
+            entry("4", "Rinses"), entry("6", "Final rinse"), entry("7", "Drying"));
+
     private final String mieleID;
     private final String channelID;
     private final Class<? extends Type> typeClass;
@@ -201,6 +231,24 @@ public enum DishwasherChannelSelector implements ApplianceChannelSelector {
         return null;
     }
 
+    public State getTextState(String s, DeviceMetaData dmd, Map<String, String> valueMap, String prefix) {
+        if ("0".equals(s)) {
+            return UnDefType.UNDEF;
+        }
+
+        if (dmd == null || dmd.LocalizedValue == null || dmd.LocalizedValue.startsWith(prefix)) {
+            String text = valueMap.get(s);
+            if (text != null) {
+                return getState(text);
+            }
+            if (dmd == null || dmd.LocalizedValue == null) {
+                return getState(prefix + s);
+            }
+        }
+
+        return null;
+    }
+
     public String getMieleEnum(String s, DeviceMetaData dmd) {
         if (dmd.MieleEnum != null) {
             for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
index 6fc1244efb53e15bd602277c02e3429a7eefcd19..469e3a92582d7322fb34b9868547415f1ac4563e 100644 (file)
  */
 package org.openhab.binding.miele.internal.handler;
 
-import static org.openhab.binding.miele.internal.MieleBindingConstants.SUPERCOOL_CHANNEL_ID;
+import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import java.lang.reflect.Method;
 import java.util.Map.Entry;
 
 import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil;
 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.OpenClosedType;
 import org.openhab.core.library.types.QuantityType;
@@ -35,6 +36,7 @@ import com.google.gson.JsonElement;
  * The {@link ApplianceChannelSelector} for fridges
  *
  * @author Karel Goderis - Initial contribution
+ * @author Jacob Laursen - Added UoM for temperatures, raw channels
  */
 public enum FridgeChannelSelector implements ApplianceChannelSelector {
 
@@ -42,7 +44,8 @@ public enum FridgeChannelSelector implements ApplianceChannelSelector {
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
     BRAND_ID("brandId", "brandId", StringType.class, true),
     COMPANY_ID("companyId", "companyId", StringType.class, true),
-    STATE("state", "state", StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
     SUPERCOOL(null, SUPERCOOL_CHANNEL_ID, OnOffType.class, false),
     FRIDGECURRENTTEMP("currentTemperature", "current", QuantityType.class, false) {
         @Override
index 60d76e29bbc5adc1fa5f5459b8a2c3929672ce0f..baed695db30a69cd6fa71ecda79d19ea469f0e8b 100644 (file)
  */
 package org.openhab.binding.miele.internal.handler;
 
-import static org.openhab.binding.miele.internal.MieleBindingConstants.SUPERCOOL_CHANNEL_ID;
-import static org.openhab.binding.miele.internal.MieleBindingConstants.SUPERFREEZE_CHANNEL_ID;
+import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import java.lang.reflect.Method;
 import java.util.Map.Entry;
 
 import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil;
 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
+import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.OpenClosedType;
 import org.openhab.core.library.types.QuantityType;
@@ -37,6 +37,7 @@ import com.google.gson.JsonElement;
  * a freezer compartment
  *
  * @author Karel Goderis - Initial contribution
+ * @author Jacob Laursen - Added UoM for temperatures, raw channels
  */
 public enum FridgeFreezerChannelSelector implements ApplianceChannelSelector {
 
@@ -44,7 +45,8 @@ public enum FridgeFreezerChannelSelector implements ApplianceChannelSelector {
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
     BRAND_ID("brandId", "brandId", StringType.class, true),
     COMPANY_ID("companyId", "companyId", StringType.class, true),
-    STATE("state", "state", StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
     FREEZERSTATE("freezerState", "freezerstate", StringType.class, false),
     FRIDGESTATE("fridgeState", "fridgestate", StringType.class, false),
     SUPERCOOL(null, SUPERCOOL_CHANNEL_ID, OnOffType.class, false),
index 4c6f1021625641d4fc047681ab73a82985acc7d1..a8a3ef2089729e455d7340855b858c93b8fc4132 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.miele.internal.handler;
 
+import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
+
 import java.lang.reflect.Method;
 import java.util.Map.Entry;
 
@@ -29,6 +31,7 @@ import com.google.gson.JsonElement;
  * The {@link ApplianceChannelSelector} for hobs
  *
  * @author Karel Goderis - Initial contribution
+ * @author Jacob Laursen - Added raw channels
  */
 public enum HobChannelSelector implements ApplianceChannelSelector {
 
@@ -36,7 +39,8 @@ public enum HobChannelSelector implements ApplianceChannelSelector {
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
     BRAND_ID("brandId", "brandId", StringType.class, true),
     COMPANY_ID("companyId", "companyId", StringType.class, true),
-    STATE("state", "state", StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
     PLATES("plateNumbers", "plates", DecimalType.class, true),
     PLATE1_POWER("plate1PowerStep", "plate1power", DecimalType.class, false),
     PLATE1_HEAT("plate1RemainingHeat", "plate1heat", DecimalType.class, false) {
index 0c99dc5caffee2c20f653151f76faf46548ae7ed..bdedbf2a3f01368a8ec917e5f22767c532e4bf02 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.miele.internal.handler;
 
+import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
+
 import java.lang.reflect.Method;
 import java.util.Map.Entry;
 
@@ -31,6 +33,7 @@ import com.google.gson.JsonElement;
  * The {@link ApplianceChannelSelector} for ventilation hoods
  *
  * @author Karel Goderis - Initial contribution
+ * @author Jacob Laursen - Added raw channels
  */
 public enum HoodChannelSelector implements ApplianceChannelSelector {
 
@@ -38,7 +41,8 @@ public enum HoodChannelSelector implements ApplianceChannelSelector {
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
     BRAND_ID("brandId", "brandId", StringType.class, true),
     COMPANY_ID("companyId", "companyId", StringType.class, true),
-    STATE("state", "state", StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
     VENTILATION("ventilationPower", "ventilation", DecimalType.class, false),
     LIGHT("lightingStatus", "light", OnOffType.class, false) {
         @Override
index 9b7082433fe1b73c2c21f2090d94cfe887ec3a67..b2a7b70e78b612debccbc649f1648310b5ef6551 100644 (file)
@@ -241,9 +241,10 @@ public abstract class MieleApplianceHandler<E extends Enum<E> & ApplianceChannel
                     ChannelUID theChannelUID = new ChannelUID(getThing().getUID(), selector.getChannelID());
 
                     if (dp.Value != null) {
-                        logger.trace("Update state of {} with getState '{}'", theChannelUID,
-                                selector.getState(dpValue, dmd));
-                        updateState(theChannelUID, selector.getState(dpValue, dmd));
+                        State state = selector.getState(dpValue, dmd);
+                        logger.trace("Update state of {} with getState '{}'", theChannelUID, state);
+                        updateState(theChannelUID, state);
+                        updateRawChannel(dp.Name, dpValue);
                     } else {
                         updateState(theChannelUID, UnDefType.UNDEF);
                     }
@@ -266,6 +267,36 @@ public abstract class MieleApplianceHandler<E extends Enum<E> & ApplianceChannel
         updateState(channelUid, state);
     }
 
+    /**
+     * Update raw value channels for properties already mapped to text channels.
+     * Currently ApplianceChannelSelector only supports 1:1 mapping from property
+     * to channel.
+     */
+    private void updateRawChannel(String propertyName, String value) {
+        String channelId;
+        switch (propertyName) {
+            case STATE_PROPERTY_NAME:
+                channelId = STATE_CHANNEL_ID;
+                break;
+            case PROGRAM_ID_PROPERTY_NAME:
+                channelId = PROGRAM_CHANNEL_ID;
+                break;
+            default:
+                return;
+        }
+        ApplianceChannelSelector selector = null;
+        try {
+            selector = getValueSelectorFromChannelID(channelId);
+        } catch (IllegalArgumentException e) {
+            logger.trace("{} is not a valid channel for a {}", channelId, modelID);
+            return;
+        }
+        ChannelUID channelUid = new ChannelUID(getThing().getUID(), channelId);
+        State state = selector.getState(value);
+        logger.trace("Update state of {} with getState '{}'", channelUid, state);
+        updateState(channelUid, state);
+    }
+
     @Override
     public void onApplianceRemoved(HomeDevice appliance) {
         if (applianceId == null) {
index 4e8858e4157dd4bc4921918d1a334d581ee2f45c..7866c2e806118a6eb3641ea617e29d40284ffd96 100644 (file)
  */
 package org.openhab.binding.miele.internal.handler;
 
+import static java.util.Map.entry;
+import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
+
 import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.TimeZone;
 
 import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil;
 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
 import org.openhab.core.library.types.DateTimeType;
+import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.OpenClosedType;
 import org.openhab.core.library.types.QuantityType;
@@ -38,6 +43,7 @@ import com.google.gson.JsonElement;
  *
  * @author Karel Goderis - Initial contribution
  * @author Kai Kreuzer - Changed START_TIME to DateTimeType
+ * @author Jacob Laursen - Added UoM for temperatures, raw channels
  */
 public enum OvenChannelSelector implements ApplianceChannelSelector {
 
@@ -45,10 +51,22 @@ public enum OvenChannelSelector implements ApplianceChannelSelector {
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
     BRAND_ID("brandId", "brandId", StringType.class, true),
     COMPANY_ID("companyId", "companyId", StringType.class, true),
-    STATE("state", "state", StringType.class, false),
-    PROGRAMID("programId", "program", StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
+    PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false),
+    PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false),
     PROGRAMTYPE("programType", "type", StringType.class, false),
-    PROGRAMPHASE("phase", "phase", StringType.class, false),
+    PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd) {
+            State state = getTextState(s, dmd, phases, MISSING_PHASE_TEXT_PREFIX);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd);
+        }
+    },
+    PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false),
     START_TIME("startTime", "start", DateTimeType.class, false) {
         @Override
         public State getState(String s, DeviceMetaData dmd) {
@@ -149,6 +167,10 @@ public enum OvenChannelSelector implements ApplianceChannelSelector {
 
     private final Logger logger = LoggerFactory.getLogger(OvenChannelSelector.class);
 
+    private final static Map<String, String> phases = Map.ofEntries(entry("1", "Heating"), entry("2", "Temp. hold"),
+            entry("3", "Door Open"), entry("4", "Pyrolysis"), entry("7", "Lighting"), entry("8", "Searing phase"),
+            entry("10", "Defrost"), entry("11", "Cooling down"), entry("12", "Energy save phase"));
+
     private final String mieleID;
     private final String channelID;
     private final Class<? extends Type> typeClass;
@@ -226,6 +248,24 @@ public enum OvenChannelSelector implements ApplianceChannelSelector {
         }
     }
 
+    public State getTextState(String s, DeviceMetaData dmd, Map<String, String> valueMap, String prefix) {
+        if ("0".equals(s)) {
+            return UnDefType.UNDEF;
+        }
+
+        if (dmd == null || dmd.LocalizedValue == null || dmd.LocalizedValue.startsWith(prefix)) {
+            String text = valueMap.get(s);
+            if (text != null) {
+                return getState(text);
+            }
+            if (dmd == null || dmd.LocalizedValue == null) {
+                return getState(prefix + s);
+            }
+        }
+
+        return null;
+    }
+
     public String getMieleEnum(String s, DeviceMetaData dmd) {
         if (dmd.MieleEnum != null) {
             for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
index eec05044510cd7f33a44281fdd2fe3ab9904e33e..8c990860a9dc8e879d3be83b3adc1017fd3ea719 100644 (file)
  */
 package org.openhab.binding.miele.internal.handler;
 
+import static java.util.Map.entry;
+import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
+
 import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.TimeZone;
 
@@ -37,6 +41,7 @@ import com.google.gson.JsonElement;
  *
  * @author Karel Goderis - Initial contribution
  * @author Kai Kreuzer - Changed START_TIME to DateTimeType
+ * @author Jacob Laursen - Added raw channels
  */
 public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
 
@@ -44,10 +49,31 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true),
     BRAND_ID("brandId", "brandId", StringType.class, true),
     COMPANY_ID("companyId", "companyId", StringType.class, true),
-    STATE("state", "state", StringType.class, false),
-    PROGRAMID("programId", "program", StringType.class, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false),
+    STATE(null, STATE_CHANNEL_ID, DecimalType.class, false),
+    PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd) {
+            State state = getTextState(s, dmd, programs, MISSING_PROGRAM_TEXT_PREFIX);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd);
+        }
+    },
+    PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false),
     PROGRAMTYPE("programType", "type", StringType.class, false),
-    PROGRAMPHASE("phase", "phase", StringType.class, false),
+    PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd) {
+            State state = getTextState(s, dmd, phases, MISSING_PHASE_TEXT_PREFIX);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd);
+        }
+    },
+    PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false),
     START_TIME("startTime", "start", DateTimeType.class, false) {
         @Override
         public State getState(String s, DeviceMetaData dmd) {
@@ -129,6 +155,21 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
 
     private final Logger logger = LoggerFactory.getLogger(TumbleDryerChannelSelector.class);
 
+    private final static Map<String, String> programs = Map.ofEntries(entry("10", "Automatic Plus"),
+            entry("23", "Cottons hygiene"), entry("30", "Minimum iron"), entry("31", "Gentle minimum iron"),
+            entry("40", "Woollens handcare"), entry("50", "Delicates"), entry("60", "Warm Air"),
+            entry("70", "Cool air"), entry("80", "Express"), entry("90", "Cottons"), entry("100", "Gentle smoothing"),
+            entry("120", "Proofing"), entry("130", "Denim"), entry("131", "Gentle denim"), entry("140", "Shirts"),
+            entry("141", "Gentle shirts"), entry("150", "Sportswear"), entry("160", "Outerwear"),
+            entry("170", "Silks handcare"), entry("190", "Standard pillows"), entry("220", "Basket programme"),
+            entry("240", "Smoothing"), entry("65000", "Cottons, auto load control"),
+            entry("65001", "Minimum iron, auto load control"));
+
+    private final static Map<String, String> phases = Map.ofEntries(entry("1", "Programme running"),
+            entry("2", "Drying"), entry("3", "Drying Machine iron"), entry("4", "Drying Hand iron"),
+            entry("5", "Drying Normal"), entry("6", "Drying Normal+"), entry("7", "Cooling down"),
+            entry("8", "Drying Hand iron"), entry("10", "Finished"));
+
     private final String mieleID;
     private final String channelID;
     private final Class<? extends Type> typeClass;
@@ -198,6 +239,24 @@ public enum TumbleDryerChannelSelector implements ApplianceChannelSelector {
         return null;
     }
 
+    public State getTextState(String s, DeviceMetaData dmd, Map<String, String> valueMap, String prefix) {
+        if ("0".equals(s)) {
+            return UnDefType.UNDEF;
+        }
+
+        if (dmd == null || dmd.LocalizedValue == null || dmd.LocalizedValue.startsWith(prefix)) {
+            String text = valueMap.get(s);
+            if (text != null) {
+                return getState(text);
+            }
+            if (dmd == null || dmd.LocalizedValue == null) {
+                return getState(prefix + s);
+            }
+        }
+
+        return null;
+    }
+
     public String getMieleEnum(String s, DeviceMetaData dmd) {
         if (dmd.MieleEnum != null) {
             for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
index 294cfb61af9b8fd6162d212e8d9ecf387693ce43..714627e69c2e372aa5337c9972060563c15eba29 100644 (file)
  */
 package org.openhab.binding.miele.internal.handler;
 
-import static org.openhab.binding.miele.internal.MieleBindingConstants.EXTENDED_DEVICE_STATE_PROPERTY_NAME;
-import static org.openhab.binding.miele.internal.MieleBindingConstants.POWER_CONSUMPTION_CHANNEL_ID;
-import static org.openhab.binding.miele.internal.MieleBindingConstants.WATER_CONSUMPTION_CHANNEL_ID;
+import static java.util.Map.entry;
+import static org.openhab.binding.miele.internal.MieleBindingConstants.*;
 
 import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.TimeZone;
 
@@ -26,6 +26,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.openhab.binding.miele.internal.ExtendedDeviceStateUtil;
 import org.openhab.binding.miele.internal.handler.MieleBridgeHandler.DeviceMetaData;
 import org.openhab.core.library.types.DateTimeType;
+import org.openhab.core.library.types.DecimalType;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.OpenClosedType;
 import org.openhab.core.library.types.QuantityType;
@@ -43,7 +44,7 @@ import com.google.gson.JsonElement;
  *
  * @author Karel Goderis - Initial contribution
  * @author Kai Kreuzer - Changed START_TIME to DateTimeType
- * @author Jacob Laursen - Added power/water consumption channels
+ * @author Jacob Laursen - Added power/water consumption channels, UoM for temperatures, raw channels
  */
 public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
 
@@ -51,10 +52,31 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
     DEVICE_TYPE("mieleDeviceType", "deviceType", StringType.class, true, false),
     BRAND_ID("brandId", "brandId", StringType.class, true, false),
     COMPANY_ID("companyId", "companyId", StringType.class, true, false),
-    STATE("state", "state", StringType.class, false, false),
-    PROGRAMID("programId", "program", StringType.class, false, false),
+    STATE_TEXT(STATE_PROPERTY_NAME, STATE_TEXT_CHANNEL_ID, StringType.class, false, false),
+    STATE(null, STATE_CHANNEL_ID, DecimalType.class, false, false),
+    PROGRAM_TEXT(PROGRAM_ID_PROPERTY_NAME, PROGRAM_TEXT_CHANNEL_ID, StringType.class, false, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd) {
+            State state = getTextState(s, dmd, programs, MISSING_PROGRAM_TEXT_PREFIX);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd);
+        }
+    },
+    PROGRAM(null, PROGRAM_CHANNEL_ID, DecimalType.class, false, false),
     PROGRAMTYPE("programType", "type", StringType.class, false, false),
-    PROGRAMPHASE("phase", "phase", StringType.class, false, false),
+    PROGRAM_PHASE_TEXT(PHASE_PROPERTY_NAME, PHASE_TEXT_CHANNEL_ID, StringType.class, false, false) {
+        @Override
+        public State getState(String s, DeviceMetaData dmd) {
+            State state = getTextState(s, dmd, phases, MISSING_PHASE_TEXT_PREFIX);
+            if (state != null) {
+                return state;
+            }
+            return super.getState(s, dmd);
+        }
+    },
+    PROGRAM_PHASE(RAW_PHASE_PROPERTY_NAME, PHASE_CHANNEL_ID, DecimalType.class, false, false),
     START_TIME("startTime", "start", DateTimeType.class, false, false) {
         @Override
         public State getState(String s, DeviceMetaData dmd) {
@@ -152,6 +174,19 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
 
     private final Logger logger = LoggerFactory.getLogger(WashingMachineChannelSelector.class);
 
+    private final static Map<String, String> programs = Map.ofEntries(entry("1", "Cottons"), entry("3", "Minimum iron"),
+            entry("4", "Delicates"), entry("8", "Woollens"), entry("9", "Silks"), entry("17", "Starch"),
+            entry("18", "Rinse"), entry("21", "Drain/Spin"), entry("22", "Curtains"), entry("23", "Shirts"),
+            entry("24", "Denim"), entry("27", "Proofing"), entry("29", "Sportswear"), entry("31", "Automatic Plus"),
+            entry("37", "Outerwear"), entry("39", "Pillows"), entry("50", "Dark Garments"), entry("53", "First wash"),
+            entry("75", "Steam care"), entry("76", "Freshen up"), entry("91", "Maintenance wash"),
+            entry("95", "Down duvets"), entry("122", "Express 20"), entry("129", "Down filled items"),
+            entry("133", "Cottons Eco"), entry("146", "QuickPowerWash"), entry("65532", "Mix"));
+
+    private final static Map<String, String> phases = Map.ofEntries(entry("1", "Pre-wash"), entry("4", "Washing"),
+            entry("5", "Rinses"), entry("7", "Clean"), entry("9", "Drain"), entry("10", "Spin"),
+            entry("11", "Anti-crease"), entry("12", "Finished"));
+
     private final String mieleID;
     private final String channelID;
     private final Class<? extends Type> typeClass;
@@ -232,6 +267,24 @@ public enum WashingMachineChannelSelector implements ApplianceChannelSelector {
         }
     }
 
+    public State getTextState(String s, DeviceMetaData dmd, Map<String, String> valueMap, String prefix) {
+        if ("0".equals(s)) {
+            return UnDefType.UNDEF;
+        }
+
+        if (dmd == null || dmd.LocalizedValue == null || dmd.LocalizedValue.startsWith(prefix)) {
+            String text = valueMap.get(s);
+            if (text != null) {
+                return getState(text);
+            }
+            if (dmd == null || dmd.LocalizedValue == null) {
+                return getState(prefix + s);
+            }
+        }
+
+        return null;
+    }
+
     public String getMieleEnum(String s, DeviceMetaData dmd) {
         if (dmd.MieleEnum != null) {
             for (Entry<String, JsonElement> enumEntry : dmd.MieleEnum.entrySet()) {
index 92fde09740ff8a250a0edd67bae7879a760df522..93e4eba7846146b1938ba7061bcdede65e1cf855 100644 (file)
@@ -6,11 +6,18 @@
 
        <channel-type id="state">
                <item-type>String</item-type>
-               <label>Status</label>
+               <label>State</label>
                <description>Current status of the appliance</description>
                <state readOnly="true"></state>
        </channel-type>
 
+       <channel-type id="rawState" advanced="true">
+               <item-type>Number</item-type>
+               <label>Raw State</label>
+               <description>Current status of the appliance as raw number</description>
+               <state readOnly="true"></state>
+       </channel-type>
+
        <channel-type id="program">
                <item-type>String</item-type>
                <label>Program</label>
                <state readOnly="true"></state>
        </channel-type>
 
+       <channel-type id="rawProgram" advanced="true">
+               <item-type>Number</item-type>
+               <label>Raw Program</label>
+               <description>Current program or function running on the appliance as raw number</description>
+               <state readOnly="true"></state>
+       </channel-type>
+
        <channel-type id="type" advanced="true">
                <item-type>String</item-type>
                <label>Program Type</label>
                <state readOnly="true"></state>
        </channel-type>
 
+       <channel-type id="rawPhase" advanced="true">
+               <item-type>Number</item-type>
+               <label>Raw Phase</label>
+               <description>Current phase of the program running on the appliance as raw number</description>
+               <state readOnly="true"></state>
+       </channel-type>
+
        <channel-type id="start" advanced="true">
                <item-type>DateTime</item-type>
                <label>Start Time</label>
        <channel-type id="supercool">
                <item-type>Switch</item-type>
                <label>Super Cool</label>
-               <description>Start Super Cooling</description>
+               <description>Start or stop Super Cooling</description>
                <state readOnly="false"></state>
        </channel-type>
 
index 09d210dcc90877b64c8b2332e471559cb757ca1a..d7ae1d8bcff2a90176bff5c45b95555a7e13502a 100644 (file)
 
                <channels>
                        <channel id="state" typeId="state"/>
+                       <channel id="rawState" typeId="rawState"/>
                        <channel id="program" typeId="program"/>
+                       <channel id="rawProgram" typeId="rawProgram"/>
                        <channel id="type" typeId="type"/>
                        <channel id="phase" typeId="phase"/>
+                       <channel id="rawPhase" typeId="rawPhase"/>
                        <channel id="door" typeId="door"/>
                        <channel id="switch" typeId="switch"/>
                </channels>
index f081d6146fbf286318de74e0676c078a95e9bcf4..a50081e91ac7300866ba9c843bfd1fc55838ffba 100644 (file)
 
                <channels>
                        <channel id="state" typeId="state"/>
+                       <channel id="rawState" typeId="rawState"/>
                        <channel id="program" typeId="program"/>
+                       <channel id="rawProgram" typeId="rawProgram"/>
                        <channel id="phase" typeId="phase"/>
+                       <channel id="rawPhase" typeId="rawPhase"/>
                        <channel id="start" typeId="start"/>
                        <channel id="duration" typeId="duration"/>
                        <channel id="elapsed" typeId="elapsed"/>
index ec2ed3ac6eaf82dd01cf449d688813aa7dad5cda..8e154f1870ffa4feb8555dae88ed0f6123f3f2a8 100644 (file)
@@ -15,6 +15,7 @@
 
                <channels>
                        <channel id="state" typeId="state"/>
+                       <channel id="rawState" typeId="rawState"/>
                        <channel id="supercool" typeId="supercool"/>
                        <channel id="current" typeId="currentTemperature">
                                <description>Current temperature in the fridge</description>
index d024ef00c58bc729e18d3207d071a753942b63ca..c257767d84063f80a5407c89e9840df0b27a11e6 100644 (file)
@@ -15,6 +15,7 @@
 
                <channels>
                        <channel id="state" typeId="state"/>
+                       <channel id="rawState" typeId="rawState"/>
                        <channel id="freezerstate" typeId="freezerstate"/>
                        <channel id="fridgestate" typeId="fridgestate"/>
                        <channel id="supercool" typeId="supercool"/>
index ab12ed6204d07c1c5d3a33dabbc87e3f34ab174c..a3897500329d8ff746aa0c0f09d7525da5300425 100644 (file)
@@ -15,6 +15,7 @@
 
                <channels>
                        <channel id="state" typeId="state"/>
+                       <channel id="rawState" typeId="rawState"/>
                        <channel id="plate1power" typeId="power"/>
                        <channel id="plate1heat" typeId="heat"/>
                        <channel id="plate1time" typeId="time"/>
index af075365e3ca1b66c157534896d1f4ee24924b00..a396b962de4e3a70b4f73e7d36b723f4977a6041 100644 (file)
@@ -15,6 +15,7 @@
 
                <channels>
                        <channel id="state" typeId="state"/>
+                       <channel id="rawState" typeId="rawState"/>
                        <channel id="light" typeId="switch"/>
                        <channel id="ventilation" typeId="ventilation"/>
                        <channel id="stop" typeId="stop"/>
index 3c935d4d97c02e1777d34701382cdcc420d96c9c..58fa91d19679e441ff7d47deda36d08e52f3bd4c 100644 (file)
 
                <channels>
                        <channel id="state" typeId="state"/>
+                       <channel id="rawState" typeId="rawState"/>
                        <channel id="program" typeId="program"/>
+                       <channel id="rawProgram" typeId="rawProgram"/>
                        <channel id="type" typeId="type"/>
                        <channel id="phase" typeId="phase"/>
+                       <channel id="rawPhase" typeId="rawPhase"/>
                        <channel id="start" typeId="start"/>
                        <channel id="duration" typeId="duration"/>
                        <channel id="elapsed" typeId="elapsed"/>
index af71518dff8ce0df9db467020a1d01b62e9686ec..ea5716fb9a26b73446d09f4eeab0aea22c7a0127 100644 (file)
 
                <channels>
                        <channel id="state" typeId="state"/>
+                       <channel id="rawState" typeId="rawState"/>
                        <channel id="program" typeId="program"/>
+                       <channel id="rawProgram" typeId="rawProgram"/>
                        <channel id="type" typeId="type"/>
                        <channel id="phase" typeId="phase"/>
+                       <channel id="rawPhase" typeId="rawPhase"/>
                        <channel id="start" typeId="start"/>
                        <channel id="duration" typeId="duration"/>
                        <channel id="elapsed" typeId="elapsed"/>
index f7bf77e7ff84653d32d407f1393bd0bc4cad45df..39a2a95b5ac622c97366a466c0a514edf1f27b6d 100644 (file)
 
                <channels>
                        <channel id="state" typeId="state"/>
+                       <channel id="rawState" typeId="rawState"/>
                        <channel id="program" typeId="program"/>
+                       <channel id="rawProgram" typeId="rawProgram"/>
                        <channel id="type" typeId="type"/>
                        <channel id="phase" typeId="phase"/>
+                       <channel id="rawPhase" typeId="rawPhase"/>
                        <channel id="start" typeId="start"/>
                        <channel id="duration" typeId="duration"/>
                        <channel id="elapsed" typeId="elapsed"/>