From 446be35ac51e3da4dac2c88d69cc3ff273a180be Mon Sep 17 00:00:00 2001 From: Florian Hotze Date: Mon, 28 Nov 2022 22:17:26 +0100 Subject: [PATCH] [evcc] Extend accepted types for commands & Handle quantity types of commands (#13795) * [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 --- .../binding/evcc/internal/EvccHandler.java | 35 ++++++++++++++++--- .../binding/evcc/internal/api/EvccAPI.java | 2 +- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java index 438e8181a..c75ab2322 100644 --- a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java +++ b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java @@ -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: diff --git a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/EvccAPI.java b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/EvccAPI.java index 17c97d42a..53d87edca 100644 --- a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/EvccAPI.java +++ b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/EvccAPI.java @@ -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); } /**