]> git.basschouten.com Git - openhab-addons.git/blob
964d9bcad75f82863dc2618a5a41f68d890ba1e0
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.homeconnect.internal.handler;
14
15 import static org.openhab.binding.homeconnect.internal.HomeConnectBindingConstants.*;
16
17 import java.util.Arrays;
18 import java.util.List;
19 import java.util.Map;
20 import java.util.Optional;
21
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.openhab.binding.homeconnect.internal.client.HomeConnectApiClient;
24 import org.openhab.binding.homeconnect.internal.client.exception.ApplianceOfflineException;
25 import org.openhab.binding.homeconnect.internal.client.exception.AuthorizationException;
26 import org.openhab.binding.homeconnect.internal.client.exception.CommunicationException;
27 import org.openhab.binding.homeconnect.internal.type.HomeConnectDynamicStateDescriptionProvider;
28 import org.openhab.core.library.types.StringType;
29 import org.openhab.core.thing.Channel;
30 import org.openhab.core.thing.ChannelUID;
31 import org.openhab.core.thing.Thing;
32 import org.openhab.core.types.Command;
33 import org.openhab.core.types.UnDefType;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 /**
38  * The {@link HomeConnectWasherHandler} is responsible for handling commands, which are
39  * sent to one of the channels of a washing machine.
40  *
41  * @author Jonas BrĂ¼stel - Initial contribution
42  */
43 @NonNullByDefault
44 public class HomeConnectWasherHandler extends AbstractHomeConnectThingHandler {
45
46     private static final List<String> INACTIVE_STATE = Arrays.asList(OPERATION_STATE_INACTIVE, OPERATION_STATE_READY);
47
48     private final Logger logger = LoggerFactory.getLogger(HomeConnectWasherHandler.class);
49
50     public HomeConnectWasherHandler(Thing thing,
51             HomeConnectDynamicStateDescriptionProvider dynamicStateDescriptionProvider) {
52         super(thing, dynamicStateDescriptionProvider);
53     }
54
55     @Override
56     protected void configureChannelUpdateHandlers(Map<String, ChannelUpdateHandler> handlers) {
57         // register default update handlers
58         handlers.put(CHANNEL_DOOR_STATE, defaultDoorStateChannelUpdateHandler());
59         handlers.put(CHANNEL_OPERATION_STATE, defaultOperationStateChannelUpdateHandler());
60         handlers.put(CHANNEL_REMOTE_CONTROL_ACTIVE_STATE, defaultRemoteControlActiveStateChannelUpdateHandler());
61         handlers.put(CHANNEL_REMOTE_START_ALLOWANCE_STATE, defaultRemoteStartAllowanceChannelUpdateHandler());
62         handlers.put(CHANNEL_LOCAL_CONTROL_ACTIVE_STATE, defaultLocalControlActiveStateChannelUpdateHandler());
63         handlers.put(CHANNEL_ACTIVE_PROGRAM_STATE, defaultActiveProgramStateUpdateHandler());
64         handlers.put(CHANNEL_SELECTED_PROGRAM_STATE,
65                 updateProgramOptionsStateDescriptionsAndSelectedProgramStateUpdateHandler());
66
67         // register washer specific handlers
68         handlers.put(CHANNEL_WASHER_SPIN_SPEED, (channelUID, cache) -> {
69             Optional<Channel> channel = getThingChannel(CHANNEL_SELECTED_PROGRAM_STATE);
70             if (channel.isPresent()) {
71                 updateProgramOptionsStateDescriptionsAndSelectedProgramStateUpdateHandler()
72                         .handle(channel.get().getUID(), cache);
73             }
74         });
75         handlers.put(CHANNEL_WASHER_TEMPERATURE, (channelUID, cache) -> {
76             Optional<Channel> channel = getThingChannel(CHANNEL_SELECTED_PROGRAM_STATE);
77             if (channel.isPresent()) {
78                 updateProgramOptionsStateDescriptionsAndSelectedProgramStateUpdateHandler()
79                         .handle(channel.get().getUID(), cache);
80             }
81         });
82     }
83
84     @Override
85     protected void configureEventHandlers(Map<String, EventHandler> handlers) {
86         // register default event handlers
87         handlers.put(EVENT_DOOR_STATE, defaultDoorStateEventHandler());
88         handlers.put(EVENT_REMOTE_CONTROL_ACTIVE, updateRemoteControlActiveAndProgramOptionsStateEventHandler());
89         handlers.put(EVENT_REMOTE_CONTROL_START_ALLOWED,
90                 defaultBooleanEventHandler(CHANNEL_REMOTE_START_ALLOWANCE_STATE));
91         handlers.put(EVENT_FINISH_IN_RELATIVE, defaultRemainingProgramTimeEventHandler());
92         handlers.put(EVENT_REMAINING_PROGRAM_TIME, defaultRemainingProgramTimeEventHandler());
93         handlers.put(EVENT_PROGRAM_PROGRESS, defaultPercentQuantityTypeEventHandler(CHANNEL_PROGRAM_PROGRESS_STATE));
94         handlers.put(EVENT_LOCAL_CONTROL_ACTIVE, defaultBooleanEventHandler(CHANNEL_LOCAL_CONTROL_ACTIVE_STATE));
95         handlers.put(EVENT_ACTIVE_PROGRAM, defaultActiveProgramEventHandler());
96         handlers.put(EVENT_OPERATION_STATE, defaultOperationStateEventHandler());
97         handlers.put(EVENT_SELECTED_PROGRAM, updateProgramOptionsAndSelectedProgramStateEventHandler());
98
99         // register washer specific event handlers
100         handlers.put(EVENT_WASHER_TEMPERATURE,
101                 event -> getThingChannel(CHANNEL_WASHER_TEMPERATURE).ifPresent(channel -> updateState(channel.getUID(),
102                         event.getValue() == null ? UnDefType.UNDEF : new StringType(event.getValue()))));
103         handlers.put(EVENT_WASHER_SPIN_SPEED,
104                 event -> getThingChannel(CHANNEL_WASHER_SPIN_SPEED).ifPresent(channel -> updateState(channel.getUID(),
105                         event.getValue() == null ? UnDefType.UNDEF : new StringType(event.getValue()))));
106         handlers.put(EVENT_WASHER_IDOS_1_DOSING_LEVEL,
107                 event -> getThingChannel(CHANNEL_WASHER_IDOS1).ifPresent(channel -> updateState(channel.getUID(),
108                         event.getValue() == null ? UnDefType.UNDEF : new StringType(event.getValue()))));
109         handlers.put(EVENT_WASHER_IDOS_2_DOSING_LEVEL,
110                 event -> getThingChannel(CHANNEL_WASHER_IDOS2).ifPresent(channel -> updateState(channel.getUID(),
111                         event.getValue() == null ? UnDefType.UNDEF : new StringType(event.getValue()))));
112     }
113
114     @Override
115     protected void handleCommand(final ChannelUID channelUID, final Command command,
116             final HomeConnectApiClient apiClient)
117             throws CommunicationException, AuthorizationException, ApplianceOfflineException {
118         super.handleCommand(channelUID, command, apiClient);
119         String operationState = getOperationState();
120
121         // only handle these commands if operation state allows it
122         if (operationState != null && INACTIVE_STATE.contains(operationState) && command instanceof StringType) {
123             switch (channelUID.getId()) {
124                 case CHANNEL_WASHER_TEMPERATURE:
125                     apiClient.setProgramOptions(getThingHaId(), OPTION_WASHER_TEMPERATURE, command.toFullString(), null,
126                             false, false);
127                     break;
128                 case CHANNEL_WASHER_SPIN_SPEED:
129                     apiClient.setProgramOptions(getThingHaId(), OPTION_WASHER_SPIN_SPEED, command.toFullString(), null,
130                             false, false);
131                     break;
132                 case CHANNEL_WASHER_IDOS1:
133                     apiClient.setProgramOptions(getThingHaId(), OPTION_WASHER_IDOS_1_DOSING_LEVEL,
134                             command.toFullString(), null, false, false);
135                     break;
136                 case CHANNEL_WASHER_IDOS2:
137                     apiClient.setProgramOptions(getThingHaId(), OPTION_WASHER_IDOS_2_DOSING_LEVEL,
138                             command.toFullString(), null, false, false);
139                     break;
140             }
141         } else {
142             logger.debug("Device can not handle command {} in current operation state ({}). haId={}", command,
143                     operationState, getThingHaId());
144         }
145     }
146
147     @Override
148     public String toString() {
149         return "HomeConnectWasherHandler [haId: " + getThingHaId() + "]";
150     }
151
152     @Override
153     protected void resetProgramStateChannels(boolean offline) {
154         super.resetProgramStateChannels(offline);
155         getThingChannel(CHANNEL_REMAINING_PROGRAM_TIME_STATE).ifPresent(c -> updateState(c.getUID(), UnDefType.UNDEF));
156         getThingChannel(CHANNEL_PROGRAM_PROGRESS_STATE).ifPresent(c -> updateState(c.getUID(), UnDefType.UNDEF));
157         getThingChannel(CHANNEL_ACTIVE_PROGRAM_STATE).ifPresent(c -> updateState(c.getUID(), UnDefType.UNDEF));
158         if (offline) {
159             getThingChannel(CHANNEL_WASHER_TEMPERATURE).ifPresent(c -> updateState(c.getUID(), UnDefType.UNDEF));
160             getThingChannel(CHANNEL_WASHER_SPIN_SPEED).ifPresent(c -> updateState(c.getUID(), UnDefType.UNDEF));
161             getThingChannel(CHANNEL_WASHER_IDOS1).ifPresent(c -> updateState(c.getUID(), UnDefType.UNDEF));
162             getThingChannel(CHANNEL_WASHER_IDOS2).ifPresent(c -> updateState(c.getUID(), UnDefType.UNDEF));
163         }
164     }
165 }