]> git.basschouten.com Git - openhab-addons.git/blob
e2e2b2fc34b81e9daba344987eb9245f7dc3b135
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 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.wlanthermo.internal.api.nano;
14
15 import static org.openhab.binding.wlanthermo.internal.WlanThermoBindingConstants.*;
16
17 import java.awt.*;
18 import java.math.BigInteger;
19 import java.util.List;
20
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;
31
32 /**
33  * The {@link WlanThermoNanoCommandHandler} is responsible for mapping the Commands to the respective data fields
34  * of the API.
35  *
36  * @author Christian Schlipp - Initial contribution
37  */
38 public class WlanThermoNanoCommandHandler {
39
40     public State getState(ChannelUID channelUID, Data data, Settings settings) {
41         State state = null;
42         System system = data.getSystem();
43         List<Channel> channel = data.getChannel();
44         if ("system".equals(channelUID.getGroupId()) && system != null) {
45             switch (channelUID.getIdWithoutGroup()) {
46                 case SYSTEM_SOC:
47                     state = new DecimalType(system.getSoc());
48                     break;
49                 case SYSTEM_CHARGE:
50                     state = OnOffType.from(system.getCharge());
51                     break;
52                 case SYSTEM_RSSI_SIGNALSTRENGTH:
53                     int dbm = system.getRssi();
54                     if (dbm >= -80) {
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);
60                     } else {
61                         state = new DecimalType(1);
62                     }
63                     break;
64                 case SYSTEM_RSSI:
65                     state = new DecimalType(system.getRssi());
66                     break;
67             }
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()) {
72                     case CHANNEL_NAME:
73                         state = new StringType(channel.get(channelId).getName());
74                         break;
75                     case CHANNEL_TYP:
76                         state = new StringType(settings.sensors.get(channel.get(channelId).getTyp()));
77                         break;
78                     case CHANNEL_TEMP:
79                         if (channel.get(channelId).getTemp() == 999.0) {
80                             state = UnDefType.UNDEF;
81                         } else {
82                             state = new DecimalType(channel.get(channelId).getTemp());
83                         }
84                         break;
85                     case CHANNEL_MIN:
86                         state = new DecimalType(channel.get(channelId).getMin());
87                         break;
88                     case CHANNEL_MAX:
89                         state = new DecimalType(channel.get(channelId).getMax());
90                         break;
91                     case CHANNEL_ALARM_DEVICE:
92                         state = OnOffType.from(BigInteger.valueOf(channel.get(channelId).getAlarm()).testBit(1));
93                         break;
94                     case CHANNEL_ALARM_PUSH:
95                         state = OnOffType.from(BigInteger.valueOf(channel.get(channelId).getAlarm()).testBit(0));
96                         break;
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;
101                         } else {
102                             state = OnOffType.OFF;
103                         }
104                         break;
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;
109                         } else {
110                             state = OnOffType.OFF;
111                         }
112                         break;
113                     case CHANNEL_COLOR:
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());
118                         }
119                         break;
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));
124                         }
125                         break;
126                 }
127             }
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());
135                         break;
136                     case CHANNEL_PITMASTER_PIDPROFILE:
137                         state = new DecimalType(pm.getPid());
138                         break;
139                     case CHANNEL_PITMASTER_DUTY_CYCLE:
140                         state = new DecimalType(pm.getValue());
141                         break;
142                     case CHANNEL_PITMASTER_SETPOINT:
143                         state = new DecimalType(pm.getSet());
144                         break;
145                     case CHANNEL_PITMASTER_STATE:
146                         state = new StringType(pm.getTyp());
147                 }
148             } else {
149                 return UnDefType.UNDEF;
150             }
151         }
152         return state;
153     }
154
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()) {
162                     case CHANNEL_NAME:
163                         if (command instanceof StringType) {
164                             channel.get(channelId).setName(command.toFullString());
165                             success = true;
166                         }
167                         break;
168                     case CHANNEL_MIN:
169                         if (command instanceof QuantityType) {
170                             channel.get(channelId).setMin(((QuantityType) command).doubleValue());
171                             success = true;
172                         }
173                         break;
174                     case CHANNEL_MAX:
175                         if (command instanceof QuantityType) {
176                             channel.get(channelId).setMax(((QuantityType) command).doubleValue());
177                             success = true;
178                         }
179                         break;
180                     case CHANNEL_ALARM_DEVICE:
181                         if (command instanceof OnOffType) {
182                             BigInteger value;
183                             if (command == OnOffType.ON) {
184                                 value = BigInteger.valueOf(channel.get(channelId).getAlarm()).setBit(1);
185                             } else {
186                                 value = BigInteger.valueOf(channel.get(channelId).getAlarm()).clearBit(1);
187                             }
188                             channel.get(channelId).setAlarm(value.intValue());
189                             success = true;
190                         }
191                         break;
192                     case CHANNEL_ALARM_PUSH:
193                         if (command instanceof OnOffType) {
194                             BigInteger value;
195                             if (command == OnOffType.ON) {
196                                 value = BigInteger.valueOf(channel.get(channelId).getAlarm()).setBit(0);
197                             } else {
198                                 value = BigInteger.valueOf(channel.get(channelId).getAlarm()).clearBit(0);
199                             }
200                             channel.get(channelId).setAlarm(value.intValue());
201                             success = true;
202                         }
203                         break;
204                     case CHANNEL_COLOR_NAME:
205                         if (command instanceof StringType) {
206                             channel.get(channelId).setColor(UtilNano.toHex(((StringType) command).toString()));
207                             success = true;
208                         }
209                         break;
210                 }
211             }
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());
219                         success = true;
220                         break;
221                     case CHANNEL_PITMASTER_PIDPROFILE:
222                         pm.setPid(((QuantityType) command).intValue());
223                         success = true;
224                         break;
225                     case CHANNEL_PITMASTER_SETPOINT:
226                         pm.setSet(((QuantityType) command).doubleValue());
227                         success = true;
228                         break;
229                     case CHANNEL_PITMASTER_STATE:
230                         String state = ((StringType) command).toString();
231                         if (state.equalsIgnoreCase("off") || state.equalsIgnoreCase("manual")
232                                 || state.equalsIgnoreCase("auto")) {
233                             pm.setTyp(state);
234                             success = true;
235                         }
236                 }
237             }
238         }
239         return success;
240     }
241
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;
254                         }
255                     }
256                 }
257             }
258         }
259         return trigger;
260     }
261 }