]> git.basschouten.com Git - openhab-addons.git/blob
7e42e5a4795dc00fc0fba72e4ca64b4acfbe0ee7
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 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.homematic.internal.communicator.virtual;
14
15 import static org.openhab.binding.homematic.internal.misc.HomematicConstants.*;
16
17 import java.io.IOException;
18
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;
29
30 /**
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.
34  *
35  * @author Gerhard Riegler - Initial contribution
36  */
37 public class OnTimeAutomaticVirtualDatapointHandler extends AbstractVirtualDatapointHandler {
38     private final Logger logger = LoggerFactory.getLogger(OnTimeAutomaticVirtualDatapointHandler.class);
39
40     @Override
41     public String getName() {
42         return VIRTUAL_DATAPOINT_NAME_ON_TIME_AUTOMATIC;
43     }
44
45     @Override
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);
58                 }
59             }
60         }
61     }
62
63     @Override
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);
68
69         return ((isLevel || isState) && getVirtualDatapointValue(dp.getChannel()) > 0.0)
70                 || getName().equals(dp.getName());
71     }
72
73     @Override
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);
82             } else {
83                 logger.warn(
84                         "Can't find ON_TIME datapoint in channel '{}' in device '{}', ignoring virtual datapoint '{}'",
85                         channel.getNumber(), channel.getDevice().getAddress(), getName());
86             }
87             gateway.sendDatapointIgnoreVirtual(dp, dpConfig, value);
88         } else {
89             dp.setValue(value);
90         }
91     }
92
93     /**
94      * Returns the virtual datapoint value or 0 if not specified.
95      */
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();
101     }
102 }