mirror of
https://github.com/danieldemus/openhab-addons
synced 2026-07-29 12:34:21 +02:00
[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:
+24
-6
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user