Skip to content

Commit

Permalink
[homeconnect] Fix update of channels linked to program options
Browse files Browse the repository at this point in the history
Fix #10955

Signed-off-by: Laurent Garnier <lg.hc@free.fr>
  • Loading branch information
lolodomo committed Jul 26, 2021
1 parent 95402db commit a82420c
Showing 1 changed file with 85 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
import org.openhab.core.thing.binding.BridgeHandler;
import org.openhab.core.types.Command;
import org.openhab.core.types.RefreshType;
import org.openhab.core.types.State;
import org.openhab.core.types.StateOption;
import org.openhab.core.types.UnDefType;
import org.slf4j.Logger;
Expand Down Expand Up @@ -473,6 +474,21 @@ protected Optional<Channel> getThingChannel(String channelId) {
}
}

/**
* Get thing linked channel by given channel id.
*
* @param channelId channel id
* @return channel if linked
*/
protected Optional<Channel> getLinkedChannel(String channelId) {
Channel channel = getThing().getChannel(channelId);
if (channel == null || !isLinked(channelId)) {
return Optional.empty();
} else {
return Optional.of(channel);
}
}

/**
* Configure channel update handlers. Classes which extend {@link AbstractHomeConnectThingHandler} must implement
* this class and add handlers.
Expand Down Expand Up @@ -1334,109 +1350,76 @@ private void turnLightOn(final ChannelUID channelUID, final HomeConnectApiClient
}
}

private Optional<Option> getOption(List<Option> options, String optionKey) {
return options.stream().filter(option -> optionKey.equals(option.getKey())).findFirst();
}

private void setStringChannelFromOption(String channelId, List<Option> options, String optionKey,
Function<String, String> mappingFunc, State defaultState) {
getLinkedChannel(channelId).ifPresent(channel -> getOption(options, optionKey).map(option -> option.getValue())
.ifPresentOrElse(value -> updateState(channel.getUID(), new StringType(mappingFunc.apply(value))),
() -> updateState(channel.getUID(), defaultState)));
}

private void setQuantityChannelFromOption(String channelId, List<Option> options, String optionKey,
Function<@Nullable String, Unit<?>> unitMappingFunc, State defaultState) {
getLinkedChannel(channelId).ifPresent(channel -> getOption(options, optionKey) //
.ifPresentOrElse(
option -> updateState(channel.getUID(),
new QuantityType<>(option.getValueAsInt(), unitMappingFunc.apply(option.getUnit()))),
() -> updateState(channel.getUID(), defaultState)));
}

private void setOnOffChannelFromOption(String channelId, List<Option> options, String optionKey,
State defaultState) {
getLinkedChannel(channelId)
.ifPresent(channel -> getOption(options, optionKey).map(option -> option.getValueAsBoolean())
.ifPresentOrElse(value -> updateState(channel.getUID(), OnOffType.from(value)),
() -> updateState(channel.getUID(), defaultState)));
}

protected void processProgramOptions(List<Option> options) {
options.forEach(option -> {
String key = option.getKey();
if (key != null) {
switch (key) {
case OPTION_WASHER_TEMPERATURE:
getThingChannel(CHANNEL_WASHER_TEMPERATURE)
.ifPresent(channel -> updateState(channel.getUID(), new StringType(option.getValue())));
break;
case OPTION_WASHER_SPIN_SPEED:
getThingChannel(CHANNEL_WASHER_SPIN_SPEED)
.ifPresent(channel -> updateState(channel.getUID(), new StringType(option.getValue())));
break;
case OPTION_WASHER_IDOS_1_DOSING_LEVEL:
getThingChannel(CHANNEL_WASHER_IDOS1_LEVEL)
.ifPresent(channel -> updateState(channel.getUID(), new StringType(option.getValue())));
break;
case OPTION_WASHER_IDOS_2_DOSING_LEVEL:
getThingChannel(CHANNEL_WASHER_IDOS2_LEVEL)
.ifPresent(channel -> updateState(channel.getUID(), new StringType(option.getValue())));
break;
case OPTION_DRYER_DRYING_TARGET:
getThingChannel(CHANNEL_DRYER_DRYING_TARGET)
.ifPresent(channel -> updateState(channel.getUID(), new StringType(option.getValue())));
break;
case OPTION_HOOD_INTENSIVE_LEVEL:
String hoodIntensiveLevelValue = option.getValue();
if (hoodIntensiveLevelValue != null) {
getThingChannel(CHANNEL_HOOD_INTENSIVE_LEVEL)
.ifPresent(channel -> updateState(channel.getUID(),
new StringType(mapStageStringType(hoodIntensiveLevelValue))));
}
break;
case OPTION_HOOD_VENTING_LEVEL:
String hoodVentingLevel = option.getValue();
if (hoodVentingLevel != null) {
getThingChannel(CHANNEL_HOOD_VENTING_LEVEL)
.ifPresent(channel -> updateState(channel.getUID(),
new StringType(mapStageStringType(hoodVentingLevel))));
}
break;
case OPTION_SETPOINT_TEMPERATURE:
getThingChannel(CHANNEL_SETPOINT_TEMPERATURE).ifPresent(channel -> updateState(channel.getUID(),
new QuantityType<>(option.getValueAsInt(), mapTemperature(option.getUnit()))));
break;
case OPTION_DURATION:
getThingChannel(CHANNEL_DURATION).ifPresent(channel -> updateState(channel.getUID(),
new QuantityType<>(option.getValueAsInt(), SECOND)));
break;
case OPTION_FINISH_IN_RELATIVE:
case OPTION_REMAINING_PROGRAM_TIME:
getThingChannel(CHANNEL_REMAINING_PROGRAM_TIME_STATE)
.ifPresent(channel -> updateState(channel.getUID(),
new QuantityType<>(option.getValueAsInt(), SECOND)));
break;
case OPTION_ELAPSED_PROGRAM_TIME:
getThingChannel(CHANNEL_ELAPSED_PROGRAM_TIME).ifPresent(channel -> updateState(channel.getUID(),
new QuantityType<>(option.getValueAsInt(), SECOND)));
break;
case OPTION_PROGRAM_PROGRESS:
getThingChannel(CHANNEL_PROGRAM_PROGRESS_STATE)
.ifPresent(channel -> updateState(channel.getUID(),
new QuantityType<>(option.getValueAsInt(), PERCENT)));
break;
case OPTION_WASHER_IDOS_1_ACTIVE:
getThingChannel(CHANNEL_WASHER_IDOS1).ifPresent(
channel -> updateState(channel.getUID(), OnOffType.from(option.getValueAsBoolean())));
break;
case OPTION_WASHER_IDOS_2_ACTIVE:
getThingChannel(CHANNEL_WASHER_IDOS2).ifPresent(
channel -> updateState(channel.getUID(), OnOffType.from(option.getValueAsBoolean())));
break;
case OPTION_WASHER_VARIO_PERFECT:
getThingChannel(CHANNEL_WASHER_VARIO_PERFECT)
.ifPresent(channel -> updateState(channel.getUID(), new StringType(option.getValue())));
break;
case OPTION_WASHER_LESS_IRONING:
getThingChannel(CHANNEL_WASHER_LESS_IRONING).ifPresent(
channel -> updateState(channel.getUID(), OnOffType.from(option.getValueAsBoolean())));
break;
case OPTION_WASHER_PRE_WASH:
getThingChannel(CHANNEL_WASHER_PRE_WASH).ifPresent(
channel -> updateState(channel.getUID(), OnOffType.from(option.getValueAsBoolean())));
break;
case OPTION_WASHER_RINSE_PLUS:
getThingChannel(CHANNEL_WASHER_RINSE_PLUS)
.ifPresent(channel -> updateState(channel.getUID(), new StringType(option.getValue())));
break;
case OPTION_WASHER_SOAK:
getThingChannel(CHANNEL_WASHER_SOAK).ifPresent(
channel -> updateState(channel.getUID(), OnOffType.from(option.getValueAsBoolean())));
break;
case OPTION_WASHER_ENERGY_FORECAST:
getThingChannel(CHANNEL_PROGRAM_ENERGY).ifPresent(channel -> updateState(channel.getUID(),
new QuantityType<>(option.getValueAsInt(), PERCENT)));
break;
case OPTION_WASHER_WATER_FORECAST:
getThingChannel(CHANNEL_PROGRAM_WATER).ifPresent(channel -> updateState(channel.getUID(),
new QuantityType<>(option.getValueAsInt(), PERCENT)));
break;
}
}
});
setStringChannelFromOption(CHANNEL_WASHER_TEMPERATURE, options, OPTION_WASHER_TEMPERATURE, value -> value,
UnDefType.UNDEF);
setStringChannelFromOption(CHANNEL_WASHER_SPIN_SPEED, options, OPTION_WASHER_SPIN_SPEED, value -> value,
UnDefType.UNDEF);
setStringChannelFromOption(CHANNEL_WASHER_IDOS1_LEVEL, options, OPTION_WASHER_IDOS_1_DOSING_LEVEL,
value -> value, UnDefType.UNDEF);
setStringChannelFromOption(CHANNEL_WASHER_IDOS2_LEVEL, options, OPTION_WASHER_IDOS_2_DOSING_LEVEL,
value -> value, UnDefType.UNDEF);
setStringChannelFromOption(CHANNEL_DRYER_DRYING_TARGET, options, OPTION_DRYER_DRYING_TARGET, value -> value,
UnDefType.UNDEF);
setStringChannelFromOption(CHANNEL_HOOD_INTENSIVE_LEVEL, options, OPTION_HOOD_INTENSIVE_LEVEL,
value -> mapStageStringType(value), UnDefType.UNDEF);
setStringChannelFromOption(CHANNEL_HOOD_VENTING_LEVEL, options, OPTION_HOOD_VENTING_LEVEL,
value -> mapStageStringType(value), UnDefType.UNDEF);
setQuantityChannelFromOption(CHANNEL_SETPOINT_TEMPERATURE, options, OPTION_SETPOINT_TEMPERATURE,
unit -> mapTemperature(unit), UnDefType.UNDEF);
setQuantityChannelFromOption(CHANNEL_DURATION, options, OPTION_DURATION, unit -> SECOND, UnDefType.UNDEF);
if (getOption(options, OPTION_FINISH_IN_RELATIVE).isPresent()) {
setQuantityChannelFromOption(CHANNEL_REMAINING_PROGRAM_TIME_STATE, options, OPTION_FINISH_IN_RELATIVE,
unit -> SECOND, UnDefType.UNDEF);
} else {
setQuantityChannelFromOption(CHANNEL_REMAINING_PROGRAM_TIME_STATE, options, OPTION_REMAINING_PROGRAM_TIME,
unit -> SECOND, UnDefType.UNDEF);
}
setQuantityChannelFromOption(CHANNEL_ELAPSED_PROGRAM_TIME, options, OPTION_ELAPSED_PROGRAM_TIME, unit -> SECOND,
new QuantityType<>(0, SECOND));
setQuantityChannelFromOption(CHANNEL_PROGRAM_PROGRESS_STATE, options, OPTION_PROGRAM_PROGRESS, unit -> PERCENT,
new QuantityType<>(0, PERCENT));
setOnOffChannelFromOption(CHANNEL_WASHER_IDOS1, options, OPTION_WASHER_IDOS_1_ACTIVE, OnOffType.OFF);
setOnOffChannelFromOption(CHANNEL_WASHER_IDOS2, options, OPTION_WASHER_IDOS_2_ACTIVE, OnOffType.OFF);
setStringChannelFromOption(CHANNEL_WASHER_VARIO_PERFECT, options, OPTION_WASHER_VARIO_PERFECT, value -> value,
new StringType("LaundryCare.Common.EnumType.VarioPerfect.Off"));
setOnOffChannelFromOption(CHANNEL_WASHER_LESS_IRONING, options, OPTION_WASHER_LESS_IRONING, OnOffType.OFF);
setOnOffChannelFromOption(CHANNEL_WASHER_PRE_WASH, options, OPTION_WASHER_PRE_WASH, OnOffType.OFF);
setStringChannelFromOption(CHANNEL_WASHER_RINSE_PLUS, options, OPTION_WASHER_RINSE_PLUS, value -> value,
new StringType("LaundryCare.Washer.EnumType.RinsePlus.Off"));
setOnOffChannelFromOption(CHANNEL_WASHER_SOAK, options, OPTION_WASHER_SOAK, OnOffType.OFF);
setQuantityChannelFromOption(CHANNEL_PROGRAM_ENERGY, options, OPTION_WASHER_ENERGY_FORECAST, unit -> PERCENT,
UnDefType.UNDEF);
setQuantityChannelFromOption(CHANNEL_PROGRAM_WATER, options, OPTION_WASHER_WATER_FORECAST, unit -> PERCENT,
UnDefType.UNDEF);
}

protected String convertWasherTemperature(String value) {
Expand Down

0 comments on commit a82420c

Please sign in to comment.