]> git.basschouten.com Git - openhab-addons.git/blob
8005fc36b0ceddb69e66e4f311a208d124cf81cb
[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.communicator.virtual.DeleteDeviceModeVirtualDatapointHandler.*;
16 import static org.openhab.binding.homematic.internal.misc.HomematicConstants.*;
17
18 import java.io.IOException;
19
20 import org.openhab.binding.homematic.internal.communicator.AbstractHomematicGateway;
21 import org.openhab.binding.homematic.internal.misc.HomematicClientException;
22 import org.openhab.binding.homematic.internal.misc.MiscUtils;
23 import org.openhab.binding.homematic.internal.model.HmDatapoint;
24 import org.openhab.binding.homematic.internal.model.HmDatapointConfig;
25 import org.openhab.binding.homematic.internal.model.HmDatapointInfo;
26 import org.openhab.binding.homematic.internal.model.HmDevice;
27 import org.openhab.binding.homematic.internal.model.HmInterface;
28 import org.openhab.binding.homematic.internal.model.HmValueType;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 /**
33  * A virtual boolean datapoint which locks the device so it can not be accidentally removed from the gateway.
34  *
35  * @author Gerhard Riegler - Initial contribution
36  */
37 public class DeleteDeviceVirtualDatapointHandler extends AbstractVirtualDatapointHandler {
38     private final Logger logger = LoggerFactory.getLogger(DeleteDeviceVirtualDatapointHandler.class);
39
40     @Override
41     public String getName() {
42         return VIRTUAL_DATAPOINT_NAME_DELETE_DEVICE;
43     }
44
45     @Override
46     public void initialize(HmDevice device) {
47         if (!device.isGatewayExtras() && !(device.getHmInterface() == HmInterface.CUXD)) {
48             addDatapoint(device, 0, getName(), HmValueType.BOOL, Boolean.FALSE, false);
49         }
50     }
51
52     @Override
53     public boolean canHandleCommand(HmDatapoint dp, Object value) {
54         return getName().equals(dp.getName());
55     }
56
57     @Override
58     public void handleCommand(VirtualGateway gateway, HmDatapoint dp, HmDatapointConfig dpConfig, Object value)
59             throws IOException, HomematicClientException {
60         dp.setValue(value);
61         if (MiscUtils.isTrueValue(dp.getValue())) {
62             try {
63                 HmDatapoint deleteMode = dp.getChannel().getDatapoint(
64                         HmDatapointInfo.createValuesInfo(dp.getChannel(), VIRTUAL_DATAPOINT_NAME_DELETE_DEVICE_MODE));
65                 HmDevice device = dp.getChannel().getDevice();
66                 int flag = -1;
67                 switch (deleteMode.getOptionValue()) {
68                     case MODE_RESET:
69                         flag = 1;
70                         break;
71                     case MODE_FORCE:
72                         flag = 2;
73                         break;
74                     case MODE_DEFER:
75                         flag = 4;
76                 }
77                 if (flag == -1) {
78                     logger.info("Can't delete device '{}' from gateway '{}', DELETE_MODE is LOCKED",
79                             device.getAddress(), gateway.getId());
80                 } else {
81                     gateway.getRpcClient(device.getHmInterface()).deleteDevice(device, flag);
82                 }
83             } finally {
84                 gateway.disableDatapoint(dp, AbstractHomematicGateway.DEFAULT_DISABLE_DELAY);
85             }
86         }
87     }
88 }