]> git.basschouten.com Git - openhab-addons.git/blob
d424edbd6601e93f78768c072702b7f7f09ba104
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2022 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.shelly.internal.handler;
14
15 import static org.openhab.binding.shelly.internal.api1.Shelly1ApiJsonDTO.*;
16
17 import java.math.BigDecimal;
18
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.openhab.core.library.types.HSBType;
21 import org.openhab.core.library.types.OnOffType;
22 import org.openhab.core.library.types.PercentType;
23
24 /**
25  * The {@link ShellyColorUtils} provides some utility functions around RGBW handling.
26  *
27  * @author Markus Michels - Initial contribution
28  */
29 @NonNullByDefault
30 public class ShellyColorUtils {
31     OnOffType power = OnOffType.OFF;
32     String mode = "";
33
34     int red = 0;
35     int green = 0;
36     int blue = 0;
37     int white = 0;
38     PercentType percentRed = new PercentType(0);
39     PercentType percentGreen = new PercentType(0);
40     PercentType percentBlue = new PercentType(0);
41     PercentType percentWhite = new PercentType(0);
42
43     int gain = 0;
44     int brightness = 0;
45     int temp = 0;
46     int minTemp = 0;
47     int maxTemp = 0;
48     PercentType percentGain = new PercentType(0);
49     PercentType percentBrightness = new PercentType(0);
50     PercentType percentTemp = new PercentType(0);
51     Integer effect = 0;
52
53     public ShellyColorUtils() {
54     }
55
56     public ShellyColorUtils(ShellyColorUtils col) {
57         minTemp = col.minTemp;
58         maxTemp = col.maxTemp;
59         setRed(col.red);
60         setGreen(col.green);
61         setBlue(col.blue);
62         setWhite(col.white);
63         setGain(col.gain);
64         setBrightness(col.brightness);
65         setTemp(col.temp);
66     }
67
68     public void setMode(String mode) {
69         this.mode = mode;
70     }
71
72     public void setMinMaxTemp(int min, int max) {
73         minTemp = min;
74         maxTemp = max;
75     }
76
77     public boolean setRGBW(int red, int green, int blue, int white) {
78         setRed(red);
79         setGreen(green);
80         setBlue(blue);
81         setWhite(white);
82         return true;
83     }
84
85     public boolean setRed(int value) {
86         boolean changed = red != value;
87         red = value;
88         percentRed = toPercent(red);
89         return changed;
90     }
91
92     public boolean setGreen(int value) {
93         boolean changed = green != value;
94         green = value;
95         percentGreen = toPercent(green);
96         return changed;
97     }
98
99     public boolean setBlue(int value) {
100         boolean changed = blue != value;
101         blue = value;
102         percentBlue = toPercent(blue);
103         return changed;
104     }
105
106     public boolean setWhite(int value) {
107         boolean changed = white != value;
108         white = value;
109         percentWhite = toPercent(white);
110         return changed;
111     }
112
113     public boolean setBrightness(int value) {
114         boolean changed = brightness != value;
115         brightness = value;
116         percentBrightness = toPercent(brightness, SHELLY_MIN_BRIGHTNESS, SHELLY_MAX_BRIGHTNESS);
117         return changed;
118     }
119
120     public boolean setGain(int value) {
121         boolean changed = gain != value;
122         gain = value;
123         percentGain = toPercent(gain, SHELLY_MIN_GAIN, SHELLY_MAX_GAIN);
124         return changed;
125     }
126
127     public boolean setTemp(int value) {
128         boolean changed = temp != value;
129         temp = value;
130         percentTemp = toPercent(temp, minTemp, maxTemp);
131         return changed;
132     }
133
134     public boolean setEffect(int value) {
135         boolean changed = effect != value;
136         effect = value;
137         return changed;
138     }
139
140     public HSBType toHSB() {
141         return HSBType.fromRGB(red, green, blue);
142     }
143
144     public Integer[] fromRGBW(String rgbwString) {
145         Integer values[] = new Integer[4];
146         values[0] = values[1] = values[2] = values[3] = -1;
147         try {
148             String rgbw[] = rgbwString.split(",");
149             for (int i = 0; i < rgbw.length; i++) {
150                 values[i] = Integer.parseInt(rgbw[i]);
151             }
152         } catch (NullPointerException e) { // might be a format problem
153             throw new IllegalArgumentException(
154                     "Unable to convert fullColor value: " + rgbwString + ", " + e.getMessage());
155         }
156         if (values[0] != -1) {
157             setRed(values[0]);
158         }
159         if (values[1] != -1) {
160             setGreen(values[1]);
161         }
162         if (values[2] != -1) {
163             setBlue(values[2]);
164         }
165         if (values[3] != -1) {
166             setWhite(values[3]);
167         }
168         return values;
169     }
170
171     public boolean isRgbValid() {
172         return (red != -1) && (blue != -1) && (green != -1);
173     }
174
175     public static PercentType toPercent(Integer value) {
176         return toPercent(value, 0, SHELLY_MAX_COLOR);
177     }
178
179     public static PercentType toPercent(Integer _value, Integer min, Integer max) {
180         double range = max.doubleValue() - min.doubleValue();
181         double value = _value.doubleValue();
182         value = value < min ? min.doubleValue() : value;
183         value = value > max ? max.doubleValue() : value;
184         double percent = 0.0;
185         if (range > 0) {
186             percent = Math.round((value - min) / range * 100);
187         }
188         return new PercentType(new BigDecimal(percent));
189     }
190 }