]> git.basschouten.com Git - openhab-addons.git/blob
a150148d6c775060c9e22eb20bd40b7213ba59c7
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 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.mini;
14
15 import static org.openhab.binding.wlanthermo.internal.WlanThermoBindingConstants.*;
16 import static org.openhab.binding.wlanthermo.internal.WlanThermoUtil.requireNonNull;
17
18 import java.awt.Color;
19
20 import javax.measure.Unit;
21 import javax.measure.quantity.Temperature;
22
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;
41
42 /**
43  * The {@link WlanThermoMiniCommandHandler} is responsible for mapping the Commands to the respective data fields
44  * of the API.
45  *
46  * @author Christian Schlipp - Initial contribution
47  */
48 @NonNullByDefault
49 public class WlanThermoMiniCommandHandler {
50
51     public static final String ERROR = "er";
52
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;
57
58         if (SYSTEM.equals(groupId)) {
59             switch (channelUID.getIdWithoutGroup()) {
60                 case WlanThermoBindingConstants.SYSTEM_CPU_TEMP:
61                     if (app.getCpuTemp() == null) {
62                         return UnDefType.UNDEF;
63                     } else {
64                         return new DecimalType(app.getCpuTemp());
65                     }
66                 case WlanThermoBindingConstants.SYSTEM_CPU_LOAD:
67                     if (app.getCpuLoad() == null) {
68                         return UnDefType.UNDEF;
69                     } else {
70                         return new DecimalType(app.getCpuLoad());
71                     }
72             }
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;
79                 }
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;
87                         } else {
88                             return new QuantityType<>(data.getTemp(), unit);
89                         }
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()) {
98                             return OnOffType.ON;
99                         } else {
100                             return OnOffType.OFF;
101                         }
102                     case WlanThermoBindingConstants.CHANNEL_ALARM_OPENHAB_LOW:
103                         if (!data.getState().equals(ERROR) && data.getTemp() < data.getTempMin()) {
104                             return OnOffType.ON;
105                         } else {
106                             return OnOffType.OFF;
107                         }
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());
113                 }
114             }
115         } else if (channelUID.getId().startsWith(CHANNEL_PITMASTER_PREFIX)) {
116             Pit pit;
117             if (groupId.equals(CHANNEL_PITMASTER_1)) {
118                 pit = app.getPit();
119             } else if (groupId.equals(CHANNEL_PITMASTER_2)) {
120                 pit = app.getPit2();
121             } else {
122                 return UnDefType.UNDEF;
123             }
124             if (pit == null || !pit.getEnabled()) {
125                 return UnDefType.UNDEF;
126             }
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());
140             }
141         }
142         throw new WlanThermoUnknownChannelException(channelUID);
143     }
144
145     public static String getTrigger(ChannelUID channelUID, App app)
146             throws WlanThermoUnknownChannelException, WlanThermoInputException {
147         String groupId = requireNonNull(channelUID.getGroupId());
148
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();
155                 }
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;
163                         } else {
164                             return TRIGGER_NONE;
165                         }
166                     }
167                 }
168             }
169         }
170         throw new WlanThermoUnknownChannelException(channelUID);
171     }
172 }