|
12 | 12 | */
|
13 | 13 | package org.openhab.binding.avmfritz.internal.handler;
|
14 | 14 |
|
15 |
| -import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.*; |
16 |
| -import static org.openhab.binding.avmfritz.internal.dto.HeatingModel.*; |
| 15 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.BINDING_ID; |
| 16 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_ACTUALTEMP; |
| 17 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_BATTERY; |
| 18 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_BATTERY_LOW; |
| 19 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_BRIGHTNESS; |
| 20 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_COLOR; |
| 21 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_COLORTEMPERATURE; |
| 22 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_COLORTEMPERATURE_ABS; |
| 23 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_COMFORTTEMP; |
| 24 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_CONTACT_STATE; |
| 25 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_DEVICE_LOCKED; |
| 26 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_ECOTEMP; |
| 27 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_ENERGY; |
| 28 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_HUMIDITY; |
| 29 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_LAST_CHANGE; |
| 30 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_LOCKED; |
| 31 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_MODE; |
| 32 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_NEXTTEMP; |
| 33 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_NEXT_CHANGE; |
| 34 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_OBSTRUCTION_ALARM; |
| 35 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_ON_OFF; |
| 36 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_OUTLET; |
| 37 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_POWER; |
| 38 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_RADIATOR_MODE; |
| 39 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_ROLLERSHUTTER; |
| 40 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_SETTEMP; |
| 41 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_TEMPERATURE; |
| 42 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_TEMPERATURE_ALARM; |
| 43 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CHANNEL_VOLTAGE; |
| 44 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.CONFIG_CHANNEL_TEMP_OFFSET; |
| 45 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.MODE_BOOST; |
| 46 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.MODE_COMFORT; |
| 47 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.MODE_ECO; |
| 48 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.MODE_OFF; |
| 49 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.MODE_ON; |
| 50 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.MODE_UNKNOWN; |
| 51 | +import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.MODE_WINDOW_OPEN; |
| 52 | +import static org.openhab.binding.avmfritz.internal.dto.HeatingModel.TEMP_FRITZ_MAX; |
| 53 | +import static org.openhab.binding.avmfritz.internal.dto.HeatingModel.TEMP_FRITZ_OFF; |
| 54 | +import static org.openhab.binding.avmfritz.internal.dto.HeatingModel.TEMP_FRITZ_ON; |
| 55 | +import static org.openhab.binding.avmfritz.internal.dto.HeatingModel.TEMP_FRITZ_UNDEFINED; |
| 56 | +import static org.openhab.binding.avmfritz.internal.dto.HeatingModel.fromCelsius; |
| 57 | +import static org.openhab.binding.avmfritz.internal.dto.HeatingModel.normalizeCelsius; |
| 58 | +import static org.openhab.binding.avmfritz.internal.dto.HeatingModel.toCelsius; |
17 | 59 |
|
18 | 60 | import java.math.BigDecimal;
|
19 | 61 | import java.time.Instant;
|
|
82 | 124 | * @author Christoph Weitkamp - Added support for AVM FRITZ!DECT 300 and Comet DECT
|
83 | 125 | * @author Christoph Weitkamp - Added support for groups
|
84 | 126 | * @author Ulrich Mertin - Added support for HAN-FUN blinds
|
| 127 | + * @author Christoph Sommer - Added support for color temperature |
| 128 | + * @author Tobias Lange - Added abs color temperature and fixed on/off behavior of light blub |
85 | 129 | */
|
86 | 130 | @NonNullByDefault
|
87 | 131 | public abstract class AVMFritzBaseThingHandler extends BaseThingHandler implements FritzAhaStatusListener {
|
@@ -161,7 +205,8 @@ public void onDeviceUpdated(ThingUID thingUID, AVMFritzBaseModel device) {
|
161 | 205 | if (deviceModel.isHANFUNBlinds()) {
|
162 | 206 | updateLevelControl(deviceModel.getLevelControlModel());
|
163 | 207 | } else if (deviceModel.isColorLight()) {
|
164 |
| - updateColorLight(deviceModel.getColorControlModel(), deviceModel.getLevelControlModel()); |
| 208 | + updateColorLight(deviceModel.getColorControlModel(), deviceModel.getLevelControlModel(), |
| 209 | + deviceModel.getSimpleOnOffUnit()); |
165 | 210 | } else if (deviceModel.isDimmableLight() && !deviceModel.isHANFUNBlinds()) {
|
166 | 211 | updateDimmableLight(deviceModel.getLevelControlModel());
|
167 | 212 | } else if (deviceModel.isHANFUNUnit() && deviceModel.isHANFUNOnOff()) {
|
@@ -218,12 +263,28 @@ private void updateDimmableLight(@Nullable LevelControlModel levelControlModel)
|
218 | 263 | }
|
219 | 264 |
|
220 | 265 | private void updateColorLight(@Nullable ColorControlModel colorControlModel,
|
221 |
| - @Nullable LevelControlModel levelControlModel) { |
222 |
| - if (colorControlModel != null && levelControlModel != null) { |
| 266 | + @Nullable LevelControlModel levelControlModel, @Nullable SimpleOnOffModel simpleOnOff) { |
| 267 | + if (colorControlModel != null && levelControlModel != null && simpleOnOff != null) { |
223 | 268 | DecimalType hue = new DecimalType(colorControlModel.hue);
|
224 | 269 | PercentType saturation = ColorControlModel.toPercent(colorControlModel.saturation);
|
225 |
| - PercentType brightness = new PercentType(levelControlModel.getLevelPercentage()); |
| 270 | + PercentType brightness; |
| 271 | + if (simpleOnOff.state) { |
| 272 | + brightness = new PercentType(levelControlModel.getLevelPercentage()); |
| 273 | + } else { |
| 274 | + brightness = PercentType.ZERO; |
| 275 | + } |
226 | 276 | updateThingChannelState(CHANNEL_COLOR, new HSBType(hue, saturation, brightness));
|
| 277 | + |
| 278 | + if (colorControlModel.currentMode == 4) { |
| 279 | + int temperature = colorControlModel.temperature; |
| 280 | + int tempMired = 1000000 / temperature; |
| 281 | + int tempMinMired = 1000000 / 2700; |
| 282 | + int tempMaxMired = 1000000 / 6500; |
| 283 | + int pct = (tempMired - tempMinMired) * 100 / (tempMaxMired - tempMinMired); |
| 284 | + updateThingChannelState(CHANNEL_COLORTEMPERATURE, new PercentType(pct)); |
| 285 | + updateThingChannelState(CHANNEL_COLORTEMPERATURE_ABS, |
| 286 | + new QuantityType<>(BigDecimal.valueOf(temperature), Units.KELVIN)); |
| 287 | + } |
227 | 288 | }
|
228 | 289 | }
|
229 | 290 |
|
@@ -454,7 +515,41 @@ public void handleCommand(ChannelUID channelUID, Command command) {
|
454 | 515 | }
|
455 | 516 | }
|
456 | 517 | if (brightness != null) {
|
457 |
| - fritzBox.setLevelPercentage(ain, brightness); |
| 518 | + if (brightness.equals(BigDecimal.ZERO)) { |
| 519 | + fritzBox.setSwitch(ain, false); |
| 520 | + } else { |
| 521 | + fritzBox.setSwitch(ain, true); |
| 522 | + fritzBox.setLevelPercentage(ain, brightness); |
| 523 | + } |
| 524 | + } |
| 525 | + break; |
| 526 | + case CHANNEL_COLORTEMPERATURE: |
| 527 | + BigDecimal colorTemperaturePct = null; |
| 528 | + if (command instanceof PercentType) { |
| 529 | + colorTemperaturePct = ((PercentType) command).toBigDecimal(); |
| 530 | + } |
| 531 | + if (colorTemperaturePct != null) { |
| 532 | + int pct = colorTemperaturePct.intValue(); |
| 533 | + // AHA-HTTP-Inteface docu say that the values typically between 2700K and 6500K |
| 534 | + int tempMinMired = 1000000 / 2700; |
| 535 | + int tempMaxMired = 1000000 / 6500; |
| 536 | + int tempScaledMired = tempMinMired + ((tempMaxMired - tempMinMired) * pct / 100); |
| 537 | + int tempKelvin = 1000000 / tempScaledMired; |
| 538 | + fritzBox.setColorTemperature(ain, tempKelvin, 0); |
| 539 | + } |
| 540 | + break; |
| 541 | + case CHANNEL_COLORTEMPERATURE_ABS: |
| 542 | + BigDecimal colorTemperature = null; |
| 543 | + if (command instanceof QuantityType) { |
| 544 | + QuantityType<?> convertedCommand = ((QuantityType<?>) command).toInvertibleUnit(Units.KELVIN); |
| 545 | + if (convertedCommand != null) { |
| 546 | + colorTemperature = convertedCommand.toBigDecimal(); |
| 547 | + } |
| 548 | + } else if (command instanceof DecimalType) { |
| 549 | + colorTemperature = ((DecimalType) command).toBigDecimal(); |
| 550 | + } |
| 551 | + if (colorTemperature != null) { |
| 552 | + fritzBox.setColorTemperature(ain, colorTemperature.intValue(), 0); |
458 | 553 | }
|
459 | 554 | break;
|
460 | 555 | case CHANNEL_SETTEMP:
|
|
0 commit comments