Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[avmfritz] Added support for HAN-FUN Color and Dimmable bulbs #11723

Merged
merged 1 commit into from
Dec 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions bundles/org.openhab.binding.avmfritz/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ The following sensors have been successfully tested using FRITZ!OS 7 for FRITZ!B
- [SmartHome Zwischenstecker außen](https://www.smarthome.de/geraete/smarthome-zwischenstecker-aussen-schwarz) - a switchable outdoor outlet (thing type `HAN_FUN_ON_OFF`)
- [Rollotron DECT 1213](https://www.rademacher.de/shop/rollladen-sonnenschutz/elektrischer-gurtwickler/rollotron-dect-1213) - an electronic belt winder (thing type `HAN_FUN_BLINDS`)
- [Becker BoxCTRL](https://becker-antriebe.shop/) - a radio controlled roller shutter drive (thing type `HAN_FUN_BLINDS`)
- SmartHome LED-Lampe E27 (farbig) - a dimmable colorized light bulb (thing type `HAN_FUN_COLOR_BULB`)
- SmartHome LED-Lampe E27 (warmweiß) - a dimmable light bulb (thing type `HAN_FUN_DIMMABLE_BULB`)
Copy link
Contributor

@lolodomo lolodomo Dec 7, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lamp rather than lampe ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for pointing this out. If you check other description of HAN-FUN thing types, translations, etc. you will find more German product descriptions. This is by intention as it is the original product name of the device.

<description>HAN-FUN contact (e.g. SmartHome Tür-/Fensterkontakt or SmartHome Bewegungsmelder).</description>

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok


The use of other Sensors should be possible, if these are compatible with DECT-ULE / HAN-FUN standards.

Expand Down Expand Up @@ -177,12 +179,14 @@ The AIN (actor identification number) can be found in the FRITZ!Box interface ->
| locked | Contact | Device is locked for switching over external sources (OPEN/CLOSE) | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E, FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| device_locked | Contact | Device is locked for switching manually (OPEN/CLOSE) - FRITZ!OS 6.90 | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E, FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| temperature | Number:Temperature | Current measured temperature | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!DECT Repeater 100, FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT, FRITZ!DECT 440 |
| humidity | Number:Dimensionless | Current measured humidity - FRITZ!OS 7.24 | FRITZ!DECT 440 |
| humidity | Number:Dimensionless | Current measured humidity - FRITZ!OS 7.24 | FRITZ!DECT 440 |
| energy | Number:Energy | Accumulated energy consumption | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E |
| power | Number:Power | Current power consumption | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E |
| voltage | Number:ElectricPotential | Current voltage - FRITZ!OS 7 | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E |
| outlet | Switch | Switchable outlet (ON/OFF) | FRITZ!DECT 210, FRITZ!DECT 200, FRITZ!Powerline 546E |
| on_off | Switch | Switchable device (ON/OFF) | FRITZ!DECT 500, HAN_FUN_ON_OFF |
| on_off | Switch | Switchable device (ON/OFF) | HAN_FUN_ON_OFF |
| brightness | Dimmer | Dimmable lights | HAN_FUN_DIMMABLE_BULB |
| color | Color | Color lights | FRITZ!DECT 500, HAN_FUN_COLOR_BULB |
| actual_temp | Number:Temperature | Current temperature of heating thermostat | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| set_temp | Number:Temperature | Set Temperature of heating thermostat | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
| eco_temp | Number:Temperature | Eco Temperature of heating thermostat | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT |
Expand All @@ -194,7 +198,7 @@ The AIN (actor identification number) can be found in the FRITZ!Box interface ->
| battery_low | Switch | Battery level low (ON/OFF) - FRITZ!OS 6.80 | FRITZ!DECT 301, FRITZ!DECT 300, Comet DECT, FRITZ!DECT 400, FRITZ!DECT 440 |
| contact_state | Contact | Contact state information (OPEN/CLOSED). | HAN-FUN contact (e.g. SmartHome Tür-/Fensterkontakt or SmartHome Bewegungsmelder)- FRITZ!OS 7 |
| last_change | DateTime | States the last time the button was pressed. | FRITZ!DECT 400, FRITZ!DECT 440, HAN-FUN switch (e.g. SmartHome Wandtaster) - FRITZ!OS 7 |
| rollershutter | Rollershutter | Rollershutter control and status. Accepts UP/DOWN/STOP commands and the opening level in percent. States the opening level in percent. | HAN-FUN blind (e.g. Rolltron DECT 1213) - FRITZ!OS 7 |
| rollershutter | Rollershutter | Rollershutter control and status. Accepts UP/DOWN/STOP commands and the opening level in percent. States the opening level in percent. | HAN-FUN blind (e.g. Rolltron DECT 1213) - FRITZ!OS 7 |

### Triggers

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ public class AVMFritzBindingConstants {
public static final String DEVICE_HAN_FUN_SWITCH = "HAN_FUN_SWITCH";
public static final String DEVICE_HAN_FUN_ON_OFF = "HAN_FUN_ON_OFF";
public static final String DEVICE_HAN_FUN_BLINDS = "HAN_FUN_BLINDS";
public static final String DEVICE_HAN_FUN_COLOR_BULB = "HAN_FUN_COLOR_BULB";
public static final String DEVICE_HAN_FUN_DIMMABLE_BULB = "HAN_FUN_DIMMABLE_BULB";

// List of main group types
public static final String GROUP_HEATING = "FRITZ_GROUP_HEATING";
Expand All @@ -78,6 +80,10 @@ public class AVMFritzBindingConstants {
public static final ThingTypeUID HAN_FUN_SWITCH_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_HAN_FUN_SWITCH);
public static final ThingTypeUID HAN_FUN_ON_OFF_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_HAN_FUN_ON_OFF);
public static final ThingTypeUID HAN_FUN_BLINDS_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_HAN_FUN_BLINDS);
public static final ThingTypeUID HAN_FUN_COLOR_BULB_THING_TYPE = new ThingTypeUID(BINDING_ID,
DEVICE_HAN_FUN_COLOR_BULB);
public static final ThingTypeUID HAN_FUN_DIMMABLE_BULB_THING_TYPE = new ThingTypeUID(BINDING_ID,
DEVICE_HAN_FUN_DIMMABLE_BULB);
public static final ThingTypeUID GROUP_HEATING_THING_TYPE = new ThingTypeUID(BINDING_ID, GROUP_HEATING);
public static final ThingTypeUID GROUP_SWITCH_THING_TYPE = new ThingTypeUID(BINDING_ID, GROUP_SWITCH);

Expand Down Expand Up @@ -132,9 +138,9 @@ public class AVMFritzBindingConstants {
public static final String CHANNEL_PRESS = "press";
public static final String CHANNEL_LAST_CHANGE = "last_change";
public static final String CHANNEL_ROLLERSHUTTER = "rollershutter";
public static final String CHANNEL_ON_OFF = "on_off";
public static final String CHANNEL_COLOR = "color";
public static final String CHANNEL_BRIGHTNESS = "brightness";
public static final String CHANNEL_ON_OFF = "on_off";

// List of all Channel config ids
public static final String CONFIG_CHANNEL_TEMP_OFFSET = "offset";
Expand Down Expand Up @@ -167,7 +173,8 @@ public class AVMFritzBindingConstants {
public static final String MODE_WINDOW_OPEN = "WINDOW_OPEN";
public static final String MODE_UNKNOWN = "UNKNOWN";

public static final Set<ThingTypeUID> SUPPORTED_LIGHTING_THING_TYPES = Set.of(DECT500_THING_TYPE);
public static final Set<ThingTypeUID> SUPPORTED_LIGHTING_THING_TYPES = Set.of(DECT500_THING_TYPE,
HAN_FUN_COLOR_BULB_THING_TYPE, HAN_FUN_DIMMABLE_BULB_THING_TYPE);

public static final Set<ThingTypeUID> SUPPORTED_BUTTON_THING_TYPES_UIDS = Set.of(DECT400_THING_TYPE,
DECT440_THING_TYPE, HAN_FUN_SWITCH_THING_TYPE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

import org.openhab.core.library.types.PercentType;

/**
* See {@link DeviceListModel}.
*
Expand All @@ -26,6 +28,8 @@
@XmlRootElement(name = "colorcontrol")
public class ColorControlModel {

private static final double SATURATION_FACTOR = 2.54;

@XmlAttribute(name = "supported_modes")
public int supportedModes;
@XmlAttribute(name = "current_mode")
Expand All @@ -34,10 +38,40 @@ public class ColorControlModel {
public int saturation;
public int temperature;

/**
* Converts a FRITZ!Box value to a percent value.
*
* @param fritzValue The FRITZ!Box value to be converted
* @return The percent value
*/
public static PercentType toPercent(int saturation) {
int saturationInPercent = (int) Math.ceil(saturation / SATURATION_FACTOR);
return restrictToBounds(saturationInPercent);
}

/**
* Converts a percent value to a FRITZ!Box value.
*
* @param saturationInPercent The percent value to be converted
* @return The FRITZ!Box value
*/
public static int fromPercent(PercentType saturationInPercent) {
return (int) Math.floor(saturationInPercent.intValue() * SATURATION_FACTOR);
}

@Override
public String toString() {
return new StringBuilder("[supportedModes=").append(supportedModes).append(",currentMode=").append(currentMode)
.append(",hue=").append(hue).append(",saturation=").append(saturation).append(",temperature=")
.append(temperature).append("]").toString();
}

private static PercentType restrictToBounds(int percentValue) {
if (percentValue < 0) {
return PercentType.ZERO;
} else if (percentValue > 100) {
return PercentType.HUNDRED;
}
return new PercentType(percentValue);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -240,12 +240,10 @@ public static BigDecimal fromCelsius(BigDecimal celsiusValue) {
}

/**
* Converts a celsius value to a FRITZ!Box value.
* Valid celsius values: 8 to 28 °C > 16 to 56
* 16 <= 8°C, 17 = 8.5°C...... 56 >= 28°C, 254 = ON, 253 = OFF
* Converts a FRITZ!Box value to a celsius value.
*
* @param celsiusValue The celsius value to be converted
* @return The FRITZ!Box value
* @param fritzValue The FRITZ!Box value to be converted
* @return The celsius value
*/
public static BigDecimal toCelsius(BigDecimal fritzValue) {
if (fritzValue == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,10 @@ public String getThingTypeId(AVMFritzBaseModel device) {
} else if (device instanceof DeviceModel && device.isHANFUNUnit()) {
if (device.isHANFUNBlinds()) {
return DEVICE_HAN_FUN_BLINDS;
} else if (device.isColorLight()) {
return DEVICE_HAN_FUN_COLOR_BULB;
} else if (device.isDimmableLight()) {
return DEVICE_HAN_FUN_DIMMABLE_BULB;
}
List<String> interfaces = Arrays
.asList(((DeviceModel) device).getEtsiunitinfo().getInterfaces().split(","));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,6 @@ public void onDeviceUpdated(ThingUID thingUID, AVMFritzBaseModel device) {
if (device.isHeatingThermostat()) {
updateHeatingThermostat(device.getHkr());
}
if (device.isHANFUNUnit() && device.isHANFUNOnOff()) {
updateSimpleOnOffUnit(device.getSimpleOnOffUnit());
}
if (device instanceof DeviceModel) {
DeviceModel deviceModel = (DeviceModel) device;
if (deviceModel.isTemperatureSensor()) {
Expand All @@ -164,6 +161,8 @@ public void onDeviceUpdated(ThingUID thingUID, AVMFritzBaseModel device) {
updateColorLight(deviceModel.getColorControlModel(), deviceModel.getLevelControlModel());
} else if (deviceModel.isDimmableLight()) {
updateDimmableLight(deviceModel.getLevelControlModel());
} else if (device.isHANFUNUnit() && device.isHANFUNOnOff()) {
updateSimpleOnOffUnit(device.getSimpleOnOffUnit());
}
}
}
Expand Down Expand Up @@ -208,10 +207,9 @@ private void updateColorLight(@Nullable ColorControlModel colorControlModel,
@Nullable LevelControlModel levelControlModel) {
if (colorControlModel != null && levelControlModel != null) {
DecimalType hue = new DecimalType(colorControlModel.hue);
PercentType saturation = new PercentType(colorControlModel.saturation);
PercentType saturation = ColorControlModel.toPercent(colorControlModel.saturation);
PercentType brightness = new PercentType(levelControlModel.getLevelPercentage());
updateThingChannelState(CHANNEL_COLOR, new HSBType(hue, saturation, brightness));
updateThingChannelState(CHANNEL_BRIGHTNESS, brightness);
}
}

Expand Down Expand Up @@ -414,10 +412,12 @@ public void handleCommand(ChannelUID channelUID, Command command) {
if (command instanceof HSBType) {
HSBType hsbType = (HSBType) command;
brightness = hsbType.getBrightness().toBigDecimal();
fritzBox.setHueAndSaturation(ain, hsbType.getHue().intValue(), hsbType.getSaturation().intValue(),
0);
fritzBox.setHueAndSaturation(ain, hsbType.getHue().intValue(),
ColorControlModel.fromPercent(hsbType.getSaturation()), 0);
} else if (command instanceof PercentType) {
brightness = ((PercentType) command).toBigDecimal();
} else if (command instanceof OnOffType) {
fritzBox.setSwitch(ain, OnOffType.ON.equals(command));
}
if (brightness != null) {
fritzBox.setLevelPercentage(ain, brightness);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,12 @@ thing-type.avmfritz.FRITZ_Powerline_546E_Solo.label = FRITZ!Powerline 546E
thing-type.avmfritz.FRITZ_Powerline_546E_Solo.description = A FRITZ!Powerline 546E with switchable outlet in stand-alone mode.
thing-type.avmfritz.HAN_FUN_BLINDS.label = HAN-FUN Blinds
thing-type.avmfritz.HAN_FUN_BLINDS.description = HAN-FUN blinds (e.g. RolloTron DECT 1213)
thing-type.avmfritz.HAN_FUN_COLOR_BULB.label = HAN-FUN Color Light
thing-type.avmfritz.HAN_FUN_COLOR_BULB.description = HAN-FUN color light (e.g SmartHome LED-Lampe E27 (farbig)).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lamp

thing-type.avmfritz.HAN_FUN_CONTACT.label = HAN-FUN Contact
thing-type.avmfritz.HAN_FUN_CONTACT.description = HAN-FUN contact (e.g. SmartHome Tür-/Fensterkontakt or SmartHome Bewegungsmelder).
thing-type.avmfritz.HAN_FUN_DIMMABLE_BULB.label = HAN-FUN Dimmable Light
thing-type.avmfritz.HAN_FUN_DIMMABLE_BULB.description = HAN-FUN dimmable light (e.g. SmartHome LED-Lampe E27 (warmweiß)).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lamp

thing-type.avmfritz.HAN_FUN_ON_OFF.label = HAN-FUN On / Off Device
thing-type.avmfritz.HAN_FUN_ON_OFF.description = HAN-FUN switchable device (e.g. SmartHome Zwischenstecker innen / SmartHome Zwischenstecker außen)
thing-type.avmfritz.HAN_FUN_SWITCH.label = HAN-FUN Switch
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
<description>FRITZ!DECT500 color light.</description>

<channels>
<channel id="onoffstate" typeId="system.power"/>
<channel id="brightness" typeId="system.brightness"/>
<channel id="color" typeId="system.color"/>
</channels>

Expand Down Expand Up @@ -314,6 +312,41 @@
<config-description-ref uri="thing-type:avmfritz:fritzdevice"/>
</thing-type>

<thing-type id="HAN_FUN_COLOR_BULB">
<supported-bridge-type-refs>
<bridge-type-ref id="fritzbox"/>
</supported-bridge-type-refs>

<label>HAN-FUN Color Light</label>
<description>HAN-FUN color light (e.g SmartHome LED-Lampe E27 (farbig)).</description>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lamp


<channels>
<channel id="color" typeId="system.color"/>
</channels>

<representation-property>ain</representation-property>

<config-description-ref uri="thing-type:avmfritz:fritzdevice"/>
</thing-type>


<thing-type id="HAN_FUN_DIMMABLE_BULB">
<supported-bridge-type-refs>
<bridge-type-ref id="fritzbox"/>
</supported-bridge-type-refs>

<label>HAN-FUN Dimmable Light</label>
<description>HAN-FUN dimmable light (e.g. SmartHome LED-Lampe E27 (warmweiß)).</description>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lamp


<channels>
<channel id="brightness" typeId="system.brightness"/>
</channels>

<representation-property>ain</representation-property>

<config-description-ref uri="thing-type:avmfritz:fritzdevice"/>
</thing-type>

<thing-type id="HAN_FUN_ON_OFF">
<supported-bridge-type-refs>
<bridge-type-ref id="fritzbox"/>
Expand Down
Loading