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.wlanthermo.internal.api.mini;
15 import static org.openhab.binding.wlanthermo.internal.WlanThermoBindingConstants.*;
16 import static org.openhab.binding.wlanthermo.internal.WlanThermoUtil.requireNonNull;
18 import java.awt.Color;
20 import javax.measure.Unit;
21 import javax.measure.quantity.Temperature;
23 import org.eclipse.jdt.annotation.NonNullByDefault;
24 import org.openhab.binding.wlanthermo.internal.WlanThermoBindingConstants;
25 import org.openhab.binding.wlanthermo.internal.WlanThermoInputException;
26 import org.openhab.binding.wlanthermo.internal.WlanThermoUnknownChannelException;
27 import org.openhab.binding.wlanthermo.internal.api.mini.dto.builtin.App;
28 import org.openhab.binding.wlanthermo.internal.api.mini.dto.builtin.Channel;
29 import org.openhab.binding.wlanthermo.internal.api.mini.dto.builtin.Data;
30 import org.openhab.binding.wlanthermo.internal.api.mini.dto.builtin.Pit;
31 import org.openhab.core.library.types.DecimalType;
32 import org.openhab.core.library.types.HSBType;
33 import org.openhab.core.library.types.OnOffType;
34 import org.openhab.core.library.types.QuantityType;
35 import org.openhab.core.library.types.StringType;
36 import org.openhab.core.library.unit.ImperialUnits;
37 import org.openhab.core.library.unit.SIUnits;
38 import org.openhab.core.thing.ChannelUID;
39 import org.openhab.core.types.State;
40 import org.openhab.core.types.UnDefType;
43 * The {@link WlanThermoMiniCommandHandler} is responsible for mapping the Commands to the respective data fields
46 * @author Christian Schlipp - Initial contribution
49 public class WlanThermoMiniCommandHandler {
51 public static final String ERROR = "er";
53 public static State getState(ChannelUID channelUID, App app)
54 throws WlanThermoUnknownChannelException, WlanThermoInputException {
55 String groupId = requireNonNull(channelUID.getGroupId());
56 Unit<Temperature> unit = "fahrenheit".equals(app.getTempUnit()) ? ImperialUnits.FAHRENHEIT : SIUnits.CELSIUS;
58 if (SYSTEM.equals(groupId)) {
59 switch (channelUID.getIdWithoutGroup()) {
60 case WlanThermoBindingConstants.SYSTEM_CPU_TEMP:
61 if (app.getCpuTemp() == null) {
62 return UnDefType.UNDEF;
64 return new DecimalType(app.getCpuTemp());
66 case WlanThermoBindingConstants.SYSTEM_CPU_LOAD:
67 if (app.getCpuLoad() == null) {
68 return UnDefType.UNDEF;
70 return new DecimalType(app.getCpuLoad());
73 } else if (channelUID.getId().startsWith(CHANNEL_PREFIX)) {
74 int channelId = Integer.parseInt(groupId.substring(CHANNEL_PREFIX.length()));
75 if (channelId >= 0 && channelId <= 9) {
76 Channel channel = app.getChannel();
77 if (channel == null) {
78 return UnDefType.UNDEF;
80 Data data = channel.getData(channelId);
81 switch (channelUID.getIdWithoutGroup()) {
82 case WlanThermoBindingConstants.CHANNEL_NAME:
83 return new StringType(data.getName());
84 case WlanThermoBindingConstants.CHANNEL_TEMP:
85 if (data.getState().equals(ERROR)) {
86 return UnDefType.UNDEF;
88 return new QuantityType<>(data.getTemp(), unit);
90 case WlanThermoBindingConstants.CHANNEL_MIN:
91 return new QuantityType<>(data.getTempMin(), unit);
92 case WlanThermoBindingConstants.CHANNEL_MAX:
93 return new QuantityType<>(data.getTempMax(), unit);
94 case WlanThermoBindingConstants.CHANNEL_ALARM_DEVICE:
95 return OnOffType.from(data.getAlert());
96 case WlanThermoBindingConstants.CHANNEL_ALARM_OPENHAB_HIGH:
97 if (!data.getState().equals(ERROR) && data.getTemp() > data.getTempMax()) {
100 return OnOffType.OFF;
102 case WlanThermoBindingConstants.CHANNEL_ALARM_OPENHAB_LOW:
103 if (!data.getState().equals(ERROR) && data.getTemp() < data.getTempMin()) {
106 return OnOffType.OFF;
108 case WlanThermoBindingConstants.CHANNEL_COLOR:
109 Color c = Color.decode(WlanThermoMiniUtil.toHex(data.getColor()));
110 return HSBType.fromRGB(c.getRed(), c.getGreen(), c.getBlue());
111 case WlanThermoBindingConstants.CHANNEL_COLOR_NAME:
112 return new StringType(data.getColor());
115 } else if (channelUID.getId().startsWith(CHANNEL_PITMASTER_PREFIX)) {
117 if (groupId.equals(CHANNEL_PITMASTER_1)) {
119 } else if (groupId.equals(CHANNEL_PITMASTER_2)) {
122 return UnDefType.UNDEF;
124 if (pit == null || !pit.getEnabled()) {
125 return UnDefType.UNDEF;
127 switch (channelUID.getIdWithoutGroup()) {
128 case WlanThermoBindingConstants.CHANNEL_PITMASTER_ENABLED:
129 return OnOffType.from(pit.getEnabled());
130 case WlanThermoBindingConstants.CHANNEL_PITMASTER_CURRENT:
131 return new DecimalType(pit.getCurrent());
132 case WlanThermoBindingConstants.CHANNEL_PITMASTER_SETPOINT:
133 return new QuantityType<>(pit.getSetpoint(), unit);
134 case WlanThermoBindingConstants.CHANNEL_PITMASTER_DUTY_CYCLE:
135 return new DecimalType(pit.getControlOut());
136 case WlanThermoBindingConstants.CHANNEL_PITMASTER_LID_OPEN:
137 return OnOffType.from(pit.getOpenLid().equals("True"));
138 case WlanThermoBindingConstants.CHANNEL_PITMASTER_CHANNEL_ID:
139 return new DecimalType(pit.getCh());
142 throw new WlanThermoUnknownChannelException(channelUID);
145 public static String getTrigger(ChannelUID channelUID, App app)
146 throws WlanThermoUnknownChannelException, WlanThermoInputException {
147 String groupId = requireNonNull(channelUID.getGroupId());
149 if (channelUID.getId().startsWith(CHANNEL_PREFIX)) {
150 int channelId = Integer.parseInt(groupId.substring(CHANNEL_PREFIX.length())) - 1;
151 if (channelId >= 0 && channelId <= 9) {
152 Channel channel = app.getChannel();
153 if (channel == null) {
154 throw new WlanThermoInputException();
156 Data data = channel.getData(channelId);
157 if (CHANNEL_ALARM_OPENHAB.equals(channelUID.getIdWithoutGroup())) {
158 if (!data.getState().equals(ERROR)) {
159 if (data.getTemp() > data.getTempMax()) {
160 return TRIGGER_ALARM_MAX;
161 } else if (data.getTemp() < data.getTempMin()) {
162 return TRIGGER_ALARM_MIN;
170 throw new WlanThermoUnknownChannelException(channelUID);