import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.HSBType;
import org.openhab.core.library.types.PercentType;
+import org.openhab.core.library.types.QuantityType;
+import org.openhab.core.library.unit.Units;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus;
} else {
throw new DaliException("unknown device type");
}
+ int mirek;
if (command instanceof DecimalType) {
// Color temperature in DALI is represented in mirek ("reciprocal megakelvin")
// It is one million times the reciprocal of the color temperature (in Kelvin)
- final int mirek = (int) (1E6f
- / (Math.min(Math.max(((DecimalType) command).intValue(), 1000), 20000)));
- final byte mirekLsb = (byte) (mirek & 0xff);
- final byte mirekMsb = (byte) ((mirek >> 8) & 0xff);
- // Write mirek value to the DTR0+DTR1 registers
- daliHandler.sendCommand(DaliStandardCommand.createSetDTR0Command(mirekLsb));
- daliHandler.sendCommand(DaliStandardCommand.createSetDTR1Command(mirekMsb));
- // Indicate that the follwing command is a DT8 (WW/CW and single-channel RGB) command
- daliHandler.sendCommand(DaliStandardCommand.createSetDeviceTypeCommand(8));
- // Set the color temperature to the value in DTR0+DTR1
- daliHandler.sendCommand(DaliStandardCommand.createSetColorTemperatureCommand(address));
- // Finish the command sequence
- daliHandler.sendCommand(DaliStandardCommand.createSetDeviceTypeCommand(8));
- daliHandler.sendCommand(DaliStandardCommand.createActivateCommand(address));
-
+ mirek = (int) (1E6f / (Math.min(Math.max(((DecimalType) command).intValue(), 1000), 20000)));
+ } else if (command instanceof QuantityType) {
+ // ensure it's in the correct units
+ QuantityType<?> commandQuantity = ((QuantityType) command).toInvertibleUnit(Units.MIRED);
+ if (commandQuantity == null) {
+ logger.warn("Unable to convert command {} to mireks", command);
+ return;
+ }
+ mirek = commandQuantity.toBigDecimal().intValue();
+ } else {
+ logger.warn("Unable to convert command {} to mireks", command);
+ return;
}
+ final byte mirekLsb = (byte) (mirek & 0xff);
+ final byte mirekMsb = (byte) ((mirek >> 8) & 0xff);
+ // Write mirek value to the DTR0+DTR1 registers
+ daliHandler.sendCommand(DaliStandardCommand.createSetDTR0Command(mirekLsb));
+ daliHandler.sendCommand(DaliStandardCommand.createSetDTR1Command(mirekMsb));
+ // Indicate that the follwing command is a DT8 (WW/CW and single-channel RGB) command
+ daliHandler.sendCommand(DaliStandardCommand.createSetDeviceTypeCommand(8));
+ // Set the color temperature to the value in DTR0+DTR1
+ daliHandler.sendCommand(DaliStandardCommand.createSetColorTemperatureCommand(address));
+ // Finish the command sequence
+ daliHandler.sendCommand(DaliStandardCommand.createSetDeviceTypeCommand(8));
+ daliHandler.sendCommand(DaliStandardCommand.createActivateCommand(address));
+
DaliAddress readAddress = address;
if (readDeviceTargetId != null) {
readAddress = DaliAddress.createShortAddress(readDeviceTargetId);
if (msb != null && !msb.mask && lsb != null && !lsb.mask) {
final int msbValue = msb.value != null ? msb.value : 0;
final int lsbValue = lsb.value != null ? lsb.value : 0;
- final int mirek = ((msbValue & 0xff) << 8) | (lsbValue & 0xff);
- final int kelvin = (int) (1E6f / mirek);
- updateState(channelUID, new DecimalType(kelvin));
+ final int mirekState = ((msbValue & 0xff) << 8) | (lsbValue & 0xff);
+ final int kelvin = (int) (1E6f / mirekState);
+ updateState(channelUID, new QuantityType(kelvin, Units.KELVIN));
}
}).exceptionally(e -> {
logger.warn("Error querying device status: {}", e.getMessage());