2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.mielecloud.internal.handler.channel;
15 import static org.openhab.binding.mielecloud.internal.webservice.api.PowerStatus.*;
16 import static org.openhab.binding.mielecloud.internal.webservice.api.ProgramStatus.*;
18 import java.util.Arrays;
19 import java.util.Optional;
21 import org.eclipse.jdt.annotation.NonNullByDefault;
22 import org.openhab.binding.mielecloud.internal.webservice.api.CoolingDeviceTemperatureState;
23 import org.openhab.binding.mielecloud.internal.webservice.api.DeviceState;
24 import org.openhab.binding.mielecloud.internal.webservice.api.PowerStatus;
25 import org.openhab.binding.mielecloud.internal.webservice.api.ProgramStatus;
26 import org.openhab.binding.mielecloud.internal.webservice.api.WineStorageDeviceTemperatureState;
27 import org.openhab.binding.mielecloud.internal.webservice.api.json.StateType;
28 import org.openhab.core.library.types.OnOffType;
29 import org.openhab.core.library.types.StringType;
30 import org.openhab.core.types.State;
33 * Wrapper for {@link DeviceState} handling the type conversion to {@link State} for directly filling channels.
35 * @author Björn Lange - Initial contribution
36 * @author Benjamin Bolte - Add pre-heat finished, plate step, door state, door alarm and info state channel and map
37 * signal flags from API
38 * @author Björn Lange - Add elapsed time channel, dish warmer and robotic vacuum cleaner thing
41 public final class DeviceChannelState {
42 private final DeviceState device;
43 private final CoolingDeviceTemperatureState coolingTemperature;
44 private final WineStorageDeviceTemperatureState wineTemperature;
46 public DeviceChannelState(DeviceState device) {
48 this.coolingTemperature = new CoolingDeviceTemperatureState(device);
49 this.wineTemperature = new WineStorageDeviceTemperatureState(device);
52 public State getLightSwitch() {
53 return ChannelTypeUtil.booleanToState(device.getLightState());
56 public State getDoorState() {
57 return ChannelTypeUtil.booleanToState(device.getDoorState());
60 public State getDoorAlarm() {
61 return ChannelTypeUtil.booleanToState(device.getDoorAlarm());
64 public State getErrorState() {
65 return OnOffType.from(device.hasError());
68 public State getInfoState() {
69 return OnOffType.from(device.hasInfo());
72 public State getPowerOnOff() {
73 return new StringType(getPowerStatus().getState());
76 public State getProgramElapsedTime() {
77 return ChannelTypeUtil.intToState(device.getElapsedTime());
80 public State getOperationState() {
81 return ChannelTypeUtil.stringToState(device.getStatus());
84 public State getOperationStateRaw() {
85 return ChannelTypeUtil.intToState(device.getStatusRaw());
88 public State getProgramPhase() {
89 return ChannelTypeUtil.stringToState(device.getProgramPhase());
92 public State getProgramPhaseRaw() {
93 return ChannelTypeUtil.intToState(device.getProgramPhaseRaw());
96 public State getProgramActive() {
97 return ChannelTypeUtil.stringToState(device.getSelectedProgram());
100 public State getProgramActiveRaw() {
101 return ChannelTypeUtil.longToState(device.getSelectedProgramId());
104 public State getProgramActiveId() {
105 return ChannelTypeUtil.stringToState(device.getSelectedProgramId().map(Object::toString));
108 public State getFridgeSuperCool() {
109 return ChannelTypeUtil.booleanToState(isInState(StateType.SUPERCOOLING, StateType.SUPERCOOLING_SUPERFREEZING));
112 public State getFreezerSuperFreeze() {
113 return ChannelTypeUtil.booleanToState(isInState(StateType.SUPERFREEZING, StateType.SUPERCOOLING_SUPERFREEZING));
116 public State getFridgeTemperatureTarget() {
117 return ChannelTypeUtil.intToTemperatureState(coolingTemperature.getFridgeTargetTemperature());
120 public State getFreezerTemperatureTarget() {
121 return ChannelTypeUtil.intToTemperatureState(coolingTemperature.getFreezerTargetTemperature());
124 public State getFridgeTemperatureCurrent() {
125 return ChannelTypeUtil.intToTemperatureState(coolingTemperature.getFridgeTemperature());
128 public State getFreezerTemperatureCurrent() {
129 return ChannelTypeUtil.intToTemperatureState(coolingTemperature.getFreezerTemperature());
132 public State getProgramStartStop() {
133 return new StringType(getProgramStartStopStatus().getState());
136 public State getProgramStartStopPause() {
137 return new StringType(getProgramStartStopPauseStatus().getState());
140 public State getDelayedStartTime() {
141 return ChannelTypeUtil.intToState(device.getStartTime());
144 public State getDryingTarget() {
145 return ChannelTypeUtil.stringToState(device.getDryingTarget());
148 public State getDryingTargetRaw() {
149 return ChannelTypeUtil.intToState(device.getDryingTargetRaw());
152 public State hasPreHeatFinished() {
153 return ChannelTypeUtil.booleanToState(device.hasPreHeatFinished());
156 public State getTemperatureTarget() {
157 return ChannelTypeUtil.intToTemperatureState(device.getTargetTemperature(0));
160 public State getVentilationPower() {
161 return ChannelTypeUtil.stringToState(device.getVentilationStep());
164 public State getVentilationPowerRaw() {
165 return ChannelTypeUtil.intToState(device.getVentilationStepRaw());
168 public State getPlateStep(int index) {
169 return ChannelTypeUtil.stringToState(device.getPlateStep(index));
172 public State getPlateStepRaw(int index) {
173 return ChannelTypeUtil.intToState(device.getPlateStepRaw(index));
176 public State getTemperatureCurrent() {
177 return ChannelTypeUtil.intToTemperatureState(device.getTemperature(0));
180 public State getSpinningSpeed() {
181 return ChannelTypeUtil.stringToState(device.getSpinningSpeed());
184 public State getSpinningSpeedRaw() {
185 return ChannelTypeUtil.intToState(device.getSpinningSpeedRaw());
188 public State getBatteryLevel() {
189 return ChannelTypeUtil.intToState(device.getBatteryLevel());
192 public State getWineTemperatureTarget() {
193 return ChannelTypeUtil.intToState(wineTemperature.getTargetTemperature());
196 public State getWineTemperatureCurrent() {
197 return ChannelTypeUtil.intToTemperatureState(wineTemperature.getTemperature());
200 public State getWineTopTemperatureTarget() {
201 return ChannelTypeUtil.intToTemperatureState(wineTemperature.getTopTargetTemperature());
204 public State getWineTopTemperatureCurrent() {
205 return ChannelTypeUtil.intToTemperatureState(wineTemperature.getTopTemperature());
208 public State getWineMiddleTemperatureTarget() {
209 return ChannelTypeUtil.intToTemperatureState(wineTemperature.getMiddleTargetTemperature());
212 public State getWineMiddleTemperatureCurrent() {
213 return ChannelTypeUtil.intToTemperatureState(wineTemperature.getMiddleTemperature());
216 public State getWineBottomTemperatureTarget() {
217 return ChannelTypeUtil.intToTemperatureState(wineTemperature.getBottomTargetTemperature());
220 public State getWineBottomTemperatureCurrent() {
221 return ChannelTypeUtil.intToTemperatureState(wineTemperature.getBottomTemperature());
225 * Determines the status of the currently selected program.
227 private PowerStatus getPowerStatus() {
228 if (device.isInState(StateType.OFF) || device.isInState(StateType.NOT_CONNECTED)) {
236 * Determines the status of the currently selected program respecting the possibilities started and stopped.
238 protected ProgramStatus getProgramStartStopStatus() {
239 if (device.isInState(StateType.RUNNING)) {
240 return PROGRAM_STARTED;
242 return PROGRAM_STOPPED;
247 * Determines the status of the currently selected program respecting the possibilities started, stopped and paused.
249 protected ProgramStatus getProgramStartStopPauseStatus() {
250 if (device.isInState(StateType.RUNNING)) {
251 return PROGRAM_STARTED;
252 } else if (device.isInState(StateType.PAUSE)) {
253 return PROGRAM_PAUSED;
255 return PROGRAM_STOPPED;
260 * Gets whether the device is in one of the given states.
262 * @param stateType The states to check.
263 * @return An empty {@link Optional} if the raw status is unknown, otherwise an {@link Optional} with a value
264 * indicating whether the device is in one of the given states.
266 private Optional<Boolean> isInState(StateType... stateType) {
267 return device.getStateType().map(it -> Arrays.asList(stateType).contains(it));