[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 <florianh_dev@icloud.com>
This commit is contained in:
Florian Hotze 2022-11-28 22:17:26 +01:00 committed by GitHub
parent d3ecba9e79
commit 446be35ac5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 5 deletions

View 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:

View 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);
}
/**