2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.homematic.internal.communicator.virtual;
15 import static org.openhab.binding.homematic.internal.misc.HomematicConstants.*;
17 import java.io.IOException;
19 import org.openhab.binding.homematic.internal.misc.HomematicClientException;
20 import org.openhab.binding.homematic.internal.misc.MiscUtils;
21 import org.openhab.binding.homematic.internal.model.HmChannel;
22 import org.openhab.binding.homematic.internal.model.HmDatapoint;
23 import org.openhab.binding.homematic.internal.model.HmDatapointConfig;
24 import org.openhab.binding.homematic.internal.model.HmDatapointInfo;
25 import org.openhab.binding.homematic.internal.model.HmDevice;
26 import org.openhab.binding.homematic.internal.model.HmValueType;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
31 * A virtual Number datapoint which adds an automatic ON_TIME datapoint on supported device. This datapoint sets the
32 * ON_TIME datapoint every time a STATE or LEVEL datapoint is set, so that the light turns off automatically by the
33 * device after the specified time.
35 * @author Gerhard Riegler - Initial contribution
37 public class OnTimeAutomaticVirtualDatapointHandler extends AbstractVirtualDatapointHandler {
38 private final Logger logger = LoggerFactory.getLogger(OnTimeAutomaticVirtualDatapointHandler.class);
41 public String getName() {
42 return VIRTUAL_DATAPOINT_NAME_ON_TIME_AUTOMATIC;
46 public void initialize(HmDevice device) {
47 for (HmChannel channel : device.getChannels()) {
48 HmDatapointInfo dpInfoOnTime = HmDatapointInfo.createValuesInfo(channel, DATAPOINT_NAME_ON_TIME);
49 if (channel.hasDatapoint(dpInfoOnTime)) {
50 HmDatapointInfo dpInfoLevel = HmDatapointInfo.createValuesInfo(channel, DATAPOINT_NAME_LEVEL);
51 HmDatapointInfo dpInfoState = HmDatapointInfo.createValuesInfo(channel, DATAPOINT_NAME_STATE);
52 if (channel.hasDatapoint(dpInfoLevel) || channel.hasDatapoint(dpInfoState)) {
53 HmDatapoint dpOnTime = channel.getDatapoint(dpInfoOnTime);
54 HmDatapoint dpOnTimeAutomatic = dpOnTime.clone();
55 dpOnTimeAutomatic.setName(getName());
56 dpOnTimeAutomatic.setDescription(getName());
57 addDatapoint(channel, dpOnTimeAutomatic);
64 public boolean canHandleCommand(HmDatapoint dp, Object value) {
65 boolean isLevel = DATAPOINT_NAME_LEVEL.equals(dp.getName()) && value != null
66 && value instanceof Number numberCommand && numberCommand.doubleValue() > 0.0;
67 boolean isState = DATAPOINT_NAME_STATE.equals(dp.getName()) && MiscUtils.isTrueValue(value);
69 return ((isLevel || isState) && getVirtualDatapointValue(dp.getChannel()) > 0.0)
70 || getName().equals(dp.getName());
74 public void handleCommand(VirtualGateway gateway, HmDatapoint dp, HmDatapointConfig dpConfig, Object value)
75 throws IOException, HomematicClientException {
76 if (!getName().equals(dp.getName())) {
77 HmChannel channel = dp.getChannel();
78 HmDatapoint dpOnTime = channel
79 .getDatapoint(HmDatapointInfo.createValuesInfo(channel, DATAPOINT_NAME_ON_TIME));
80 if (dpOnTime != null) {
81 gateway.sendDatapoint(dpOnTime, new HmDatapointConfig(), getVirtualDatapointValue(channel), null);
84 "Can't find ON_TIME datapoint in channel '{}' in device '{}', ignoring virtual datapoint '{}'",
85 channel.getNumber(), channel.getDevice().getAddress(), getName());
87 gateway.sendDatapointIgnoreVirtual(dp, dpConfig, value);
94 * Returns the virtual datapoint value or 0 if not specified.
96 private Double getVirtualDatapointValue(HmChannel channel) {
97 HmDatapoint dpOnTimeAutomatic = getVirtualDatapoint(channel);
98 return dpOnTimeAutomatic == null || dpOnTimeAutomatic.getValue() == null
99 || dpOnTimeAutomatic.getType() != HmValueType.FLOAT ? 0.0
100 : ((Number) dpOnTimeAutomatic.getValue()).doubleValue();