]> git.basschouten.com Git - openhab-addons.git/commitdiff
[evcc] Extend accepted types for commands & Handle quantity types of commands (#13795)
authorFlorian Hotze <florianh_dev@icloud.com>
Mon, 28 Nov 2022 21:17:26 +0000 (22:17 +0100)
committerGitHub <noreply@github.com>
Mon, 28 Nov 2022 21:17:26 +0000 (22:17 +0100)
* [evcc] Extend accepted command types
* [evcc] Convert QuantityType commands to required units
* [evcc] Allow evcc URL to end with a slash

Should fix an issue on the forum, where a user sent a command of DecimalType, but the binding expected a QuantityType.
See https://community.openhab.org/t/evcc-binding-electric-vehicle-charging-control/135209/15.
The accepted command types are extended for all channels if possible.

Signed-off-by: Florian Hotze <florianh_dev@icloud.com>
bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java
bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/EvccAPI.java

index 438e8181a89d1c60a7a41425cc4457cf3673202a..c75ab23221ac74fa3415a5df1d78d5254f1a7e6f 100644 (file)
@@ -95,16 +95,27 @@ public class EvccHandler extends BaseThingHandler {
                     case CHANNEL_LOADPOINT_MODE:
                         if (command instanceof StringType) {
                             evccAPI.setMode(loadpoint, command.toString());
+                        } else {
+                            logger.debug("Command has wrong type, StringType required!");
                         }
                         break;
                     case CHANNEL_LOADPOINT_MIN_SOC:
                         if (command instanceof QuantityType) {
-                            evccAPI.setMinSoC(loadpoint, ((QuantityType<?>) command).intValue());
+                            evccAPI.setMinSoC(loadpoint, ((QuantityType<?>) command).toUnit(Units.PERCENT).intValue());
+                        } else if (command instanceof DecimalType) {
+                            evccAPI.setMinSoC(loadpoint, ((DecimalType) command).intValue());
+                        } else {
+                            logger.debug("Command has wrong type, QuantityType or DecimalType required!");
                         }
                         break;
                     case CHANNEL_LOADPOINT_TARGET_SOC:
                         if (command instanceof QuantityType) {
-                            evccAPI.setTargetSoC(loadpoint, ((QuantityType<?>) command).intValue());
+                            evccAPI.setTargetSoC(loadpoint,
+                                    ((QuantityType<?>) command).toUnit(Units.PERCENT).intValue());
+                        } else if (command instanceof DecimalType) {
+                            evccAPI.setTargetSoC(loadpoint, ((DecimalType) command).intValue());
+                        } else {
+                            logger.debug("Command has wrong type, QuantityType or DecimalType required!");
                         }
                         break;
                     case CHANNEL_LOADPOINT_TARGET_TIME:
@@ -120,6 +131,8 @@ public class EvccHandler extends BaseThingHandler {
                                     logger.debug("Failed to set target charge: ", e);
                                 }
                             }
+                        } else {
+                            logger.debug("Command has wrong type, DateTimeType required!");
                         }
                         break;
                     case CHANNEL_LOADPOINT_TARGET_TIME_ENABLED:
@@ -129,21 +142,35 @@ public class EvccHandler extends BaseThingHandler {
                         } else if (command == OnOffType.OFF) {
                             evccAPI.unsetTargetCharge(loadpoint);
                             targetTimeEnabled = false;
+                        } else {
+                            logger.debug("Command has wrong type, OnOffType required!");
                         }
                         break;
                     case CHANNEL_LOADPOINT_PHASES:
                         if (command instanceof DecimalType) {
                             evccAPI.setPhases(loadpoint, ((DecimalType) command).intValue());
+                        } else {
+                            logger.debug("Command has wrong type, DecimalType required!");
                         }
                         break;
                     case CHANNEL_LOADPOINT_MIN_CURRENT:
                         if (command instanceof QuantityType) {
-                            evccAPI.setMinCurrent(loadpoint, ((QuantityType<?>) command).intValue());
+                            evccAPI.setMinCurrent(loadpoint,
+                                    ((QuantityType<?>) command).toUnit(Units.AMPERE).intValue());
+                        } else if (command instanceof DecimalType) {
+                            evccAPI.setMinCurrent(loadpoint, ((DecimalType) command).intValue());
+                        } else {
+                            logger.debug("Command has wrong type, QuantityType or DecimalType required!");
                         }
                         break;
                     case CHANNEL_LOADPOINT_MAX_CURRENT:
                         if (command instanceof QuantityType) {
-                            evccAPI.setMaxCurrent(loadpoint, ((QuantityType<?>) command).intValue());
+                            evccAPI.setMaxCurrent(loadpoint,
+                                    ((QuantityType<?>) command).toUnit(Units.AMPERE).intValue());
+                        } else if (command instanceof DecimalType) {
+                            evccAPI.setMaxCurrent(loadpoint, ((DecimalType) command).intValue());
+                        } else {
+                            logger.debug("Command has wrong type, QuantityType or DecimalType required!");
                         }
                         break;
                     default:
index 17c97d42a06cf652c8ae39b9ab14c3abdb22a773..53d87edca85bf4fdbda1403369f595cc6f36cae4 100644 (file)
@@ -41,7 +41,7 @@ public class EvccAPI {
     private String host;
 
     public EvccAPI(String host) {
-        this.host = host;
+        this.host = (host.endsWith("/") ? host.substring(0, host.length() - 1) : host);
     }
 
     /**