2 * Copyright (c) 2010-2020 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.nano;
15 import static org.openhab.binding.wlanthermo.internal.WlanThermoBindingConstants.*;
18 import java.math.BigInteger;
19 import java.util.List;
21 import org.openhab.binding.wlanthermo.internal.api.nano.data.Channel;
22 import org.openhab.binding.wlanthermo.internal.api.nano.data.Data;
23 import org.openhab.binding.wlanthermo.internal.api.nano.data.Pm;
24 import org.openhab.binding.wlanthermo.internal.api.nano.data.System;
25 import org.openhab.binding.wlanthermo.internal.api.nano.settings.Settings;
26 import org.openhab.core.library.types.*;
27 import org.openhab.core.thing.ChannelUID;
28 import org.openhab.core.types.Command;
29 import org.openhab.core.types.State;
30 import org.openhab.core.types.UnDefType;
33 * The {@link WlanThermoNanoCommandHandler} is responsible for mapping the Commands to the respective data fields
36 * @author Christian Schlipp - Initial contribution
38 public class WlanThermoNanoCommandHandler {
40 public State getState(ChannelUID channelUID, Data data, Settings settings) {
42 System system = data.getSystem();
43 List<Channel> channel = data.getChannel();
44 if ("system".equals(channelUID.getGroupId()) && system != null) {
45 switch (channelUID.getIdWithoutGroup()) {
47 state = new DecimalType(system.getSoc());
50 state = OnOffType.from(system.getCharge());
52 case SYSTEM_RSSI_SIGNALSTRENGTH:
53 int dbm = system.getRssi();
55 state = new DecimalType(4);
56 } else if (dbm >= -95) {
57 state = new DecimalType(3);
58 } else if (dbm >= -105) {
59 state = new DecimalType(2);
61 state = new DecimalType(1);
65 state = new DecimalType(system.getRssi());
68 } else if (channelUID.getId().startsWith("channel")) {
69 int channelId = Integer.parseInt(channelUID.getGroupId().substring("channel".length())) - 1;
70 if (channel.size() > 0 && channelId <= channel.size()) {
71 switch (channelUID.getIdWithoutGroup()) {
73 state = new StringType(channel.get(channelId).getName());
76 state = new StringType(settings.sensors.get(channel.get(channelId).getTyp()));
79 if (channel.get(channelId).getTemp() == 999.0) {
80 state = UnDefType.UNDEF;
82 state = new DecimalType(channel.get(channelId).getTemp());
86 state = new DecimalType(channel.get(channelId).getMin());
89 state = new DecimalType(channel.get(channelId).getMax());
91 case CHANNEL_ALARM_DEVICE:
92 state = OnOffType.from(BigInteger.valueOf(channel.get(channelId).getAlarm()).testBit(1));
94 case CHANNEL_ALARM_PUSH:
95 state = OnOffType.from(BigInteger.valueOf(channel.get(channelId).getAlarm()).testBit(0));
97 case CHANNEL_ALARM_OPENHAB_HIGH:
98 if (channel.get(channelId).getTemp() != 999
99 && channel.get(channelId).getTemp() > channel.get(channelId).getMax()) {
100 state = OnOffType.ON;
102 state = OnOffType.OFF;
105 case CHANNEL_ALARM_OPENHAB_LOW:
106 if (channel.get(channelId).getTemp() != 999
107 && channel.get(channelId).getTemp() < channel.get(channelId).getMin()) {
108 state = OnOffType.ON;
110 state = OnOffType.OFF;
114 String color = channel.get(channelId).getColor();
115 if (color != null && !color.isEmpty()) {
116 Color c = Color.decode(color);
117 state = HSBType.fromRGB(c.getRed(), c.getGreen(), c.getBlue());
120 case CHANNEL_COLOR_NAME:
121 String colorHex = channel.get(channelId).getColor();
122 if (colorHex != null && !colorHex.isEmpty()) {
123 state = new StringType(UtilNano.toColorName(colorHex));
128 } else if (channelUID.getId().startsWith("pit1")) {
129 if (data.getPitmaster() != null && data.getPitmaster().getPm() != null
130 && data.getPitmaster().getPm().size() > 0) {
131 Pm pm = data.getPitmaster().getPm().get(0);
132 switch (channelUID.getIdWithoutGroup()) {
133 case CHANNEL_PITMASTER_CHANNEL_ID:
134 state = new DecimalType(pm.getChannel());
136 case CHANNEL_PITMASTER_PIDPROFILE:
137 state = new DecimalType(pm.getPid());
139 case CHANNEL_PITMASTER_DUTY_CYCLE:
140 state = new DecimalType(pm.getValue());
142 case CHANNEL_PITMASTER_SETPOINT:
143 state = new DecimalType(pm.getSet());
145 case CHANNEL_PITMASTER_STATE:
146 state = new StringType(pm.getTyp());
149 return UnDefType.UNDEF;
155 public boolean setState(ChannelUID channelUID, Command command, Data data) {
156 boolean success = false;
157 List<Channel> channel = data.getChannel();
158 if (channelUID.getId().startsWith("channel")) {
159 int channelId = Integer.parseInt(channelUID.getGroupId().substring("channel".length())) - 1;
160 if (channel.size() > 0 && channelId <= channel.size()) {
161 switch (channelUID.getIdWithoutGroup()) {
163 if (command instanceof StringType) {
164 channel.get(channelId).setName(command.toFullString());
169 if (command instanceof QuantityType) {
170 channel.get(channelId).setMin(((QuantityType) command).doubleValue());
175 if (command instanceof QuantityType) {
176 channel.get(channelId).setMax(((QuantityType) command).doubleValue());
180 case CHANNEL_ALARM_DEVICE:
181 if (command instanceof OnOffType) {
183 if (command == OnOffType.ON) {
184 value = BigInteger.valueOf(channel.get(channelId).getAlarm()).setBit(1);
186 value = BigInteger.valueOf(channel.get(channelId).getAlarm()).clearBit(1);
188 channel.get(channelId).setAlarm(value.intValue());
192 case CHANNEL_ALARM_PUSH:
193 if (command instanceof OnOffType) {
195 if (command == OnOffType.ON) {
196 value = BigInteger.valueOf(channel.get(channelId).getAlarm()).setBit(0);
198 value = BigInteger.valueOf(channel.get(channelId).getAlarm()).clearBit(0);
200 channel.get(channelId).setAlarm(value.intValue());
204 case CHANNEL_COLOR_NAME:
205 if (command instanceof StringType) {
206 channel.get(channelId).setColor(UtilNano.toHex(((StringType) command).toString()));
212 } else if (channelUID.getId().equals("pit1")) {
213 if (data.getPitmaster() != null && data.getPitmaster().getPm() != null
214 && data.getPitmaster().getPm().size() > 0) {
215 Pm pm = data.getPitmaster().getPm().get(0);
216 switch (channelUID.getIdWithoutGroup()) {
217 case CHANNEL_PITMASTER_CHANNEL_ID:
218 pm.setChannel(((QuantityType) command).intValue());
221 case CHANNEL_PITMASTER_PIDPROFILE:
222 pm.setPid(((QuantityType) command).intValue());
225 case CHANNEL_PITMASTER_SETPOINT:
226 pm.setSet(((QuantityType) command).doubleValue());
229 case CHANNEL_PITMASTER_STATE:
230 String state = ((StringType) command).toString();
231 if (state.equalsIgnoreCase("off") || state.equalsIgnoreCase("manual")
232 || state.equalsIgnoreCase("auto")) {
242 public String getTrigger(ChannelUID channelUID, Data data) {
243 String trigger = null;
244 List<Channel> channel = data.getChannel();
245 if (channelUID.getId().startsWith("channel")) {
246 int channelId = Integer.parseInt(channelUID.getGroupId().substring("channel".length())) - 1;
247 if (channel.size() > 0 && channelId <= channel.size()) {
248 if (CHANNEL_ALARM_OPENHAB.equals(channelUID.getIdWithoutGroup())) {
249 if (channel.get(channelId).getTemp() != 999) {
250 if (channel.get(channelId).getTemp() > channel.get(channelId).getMax()) {
251 trigger = TRIGGER_ALARM_MAX;
252 } else if (channel.get(channelId).getTemp() < channel.get(channelId).getMin()) {
253 trigger = TRIGGER_ALARM_MIN;