[electroluxappliance] Fix commands reverting immediately due to premature state refresh (#20453)

* Fix commands reverting immediately due to premature state refresh

Signed-off-by: wplj <wplj@users.noreply.github.com>
This commit is contained in:
max bashyrov
2026-03-29 21:32:00 +02:00
committed by GitHub
parent d39e011cfa
commit 8f44fcc90f
@@ -16,10 +16,11 @@ import static org.openhab.binding.electroluxappliance.internal.ElectroluxApplian
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.electroluxappliance.internal.ElectroluxApplianceBindingConstants;
import org.openhab.binding.electroluxappliance.internal.api.ElectroluxGroupAPI;
import org.openhab.binding.electroluxappliance.internal.dto.AirPurifierStateDTO;
import org.openhab.binding.electroluxappliance.internal.dto.ApplianceDTO;
@@ -55,6 +56,7 @@ import org.slf4j.LoggerFactory;
public class ElectroluxAirPurifierHandler extends ElectroluxApplianceHandler {
private final Logger logger = LoggerFactory.getLogger(ElectroluxAirPurifierHandler.class);
private @Nullable ScheduledFuture<?> commandGracePeriod;
public ElectroluxAirPurifierHandler(Thing thing, @Reference TranslationProvider translationProvider,
@Reference LocaleProvider localeProvider) {
@@ -70,47 +72,59 @@ public class ElectroluxAirPurifierHandler extends ElectroluxApplianceHandler {
ApplianceDTO dto = getApplianceDTO();
ElectroluxGroupAPI api = getElectroluxGroupAPI();
if (api != null && dto != null) {
boolean commandSent = false;
if (CHANNEL_WORK_MODE.equals(channelUID.getId())) {
if (command.toString().equals(COMMAND_WORKMODE_POWEROFF)) {
api.workModePowerOff(dto.getApplianceId());
commandSent = true;
} else if (command.toString().equals(COMMAND_WORKMODE_AUTO)) {
api.workModeAuto(dto.getApplianceId());
commandSent = true;
} else if (command.toString().equals(COMMAND_WORKMODE_MANUAL)) {
api.workModeManual(dto.getApplianceId());
commandSent = true;
}
} else if (CHANNEL_FAN_SPEED.equals(channelUID.getId())) {
api.setFanSpeedLevel(dto.getApplianceId(), Integer.parseInt(command.toString()));
commandSent = true;
} else if (CHANNEL_IONIZER.equals(channelUID.getId())) {
if (command == OnOffType.OFF) {
api.setIonizer(dto.getApplianceId(), "false");
commandSent = true;
} else if (command == OnOffType.ON) {
api.setIonizer(dto.getApplianceId(), "true");
commandSent = true;
} else {
logger.debug("Unknown command! {}", command);
}
} else if (CHANNEL_UI_LIGHT.equals(channelUID.getId())) {
if (command == OnOffType.OFF) {
api.setUILight(dto.getApplianceId(), "false");
commandSent = true;
} else if (command == OnOffType.ON) {
api.setUILight(dto.getApplianceId(), "true");
commandSent = true;
} else {
logger.debug("Unknown command! {}", command);
}
} else if (CHANNEL_SAFETY_LOCK.equals(channelUID.getId())) {
if (command == OnOffType.OFF) {
api.setSafetyLock(dto.getApplianceId(), "false");
commandSent = true;
} else if (command == OnOffType.ON) {
api.setSafetyLock(dto.getApplianceId(), "true");
commandSent = true;
} else {
logger.debug("Unknown command! {}", command);
}
}
final Bridge bridge = getBridge();
if (bridge != null && bridge.getHandler() instanceof ElectroluxApplianceBridgeHandler bridgeHandler) {
bridgeHandler.handleCommand(
new ChannelUID(this.thing.getUID(), ElectroluxApplianceBindingConstants.CHANNEL_STATUS),
RefreshType.REFRESH);
if (commandSent) {
ScheduledFuture<?> existing = commandGracePeriod;
if (existing != null) {
existing.cancel(false);
}
commandGracePeriod = scheduler.schedule(() -> commandGracePeriod = null, 5, TimeUnit.SECONDS);
}
}
}
@@ -118,6 +132,10 @@ public class ElectroluxAirPurifierHandler extends ElectroluxApplianceHandler {
@Override
public void update(@Nullable ApplianceDTO dto) {
if (commandGracePeriod != null) {
logger.debug("Skipping state update - command grace period active");
return;
}
if (dto != null) {
// Update all channels from the updated data
getThing().getChannels().stream().map(Channel::getUID).filter(channelUID -> isLinked(channelUID))