]> git.basschouten.com Git - openhab-addons.git/blob
b7ddffbede3425b10c9a8cb6a77082f762d2e58e
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 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.caddx.internal.handler;
14
15 import java.util.Collection;
16 import java.util.Collections;
17
18 import org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.openhab.binding.caddx.internal.CaddxBindingConstants;
20 import org.openhab.binding.caddx.internal.CaddxEvent;
21 import org.openhab.binding.caddx.internal.CaddxMessage;
22 import org.openhab.binding.caddx.internal.CaddxMessageType;
23 import org.openhab.binding.caddx.internal.CaddxProperty;
24 import org.openhab.binding.caddx.internal.action.CaddxPartitionActions;
25 import org.openhab.core.library.types.DecimalType;
26 import org.openhab.core.library.types.OnOffType;
27 import org.openhab.core.thing.ChannelUID;
28 import org.openhab.core.thing.Thing;
29 import org.openhab.core.thing.ThingStatus;
30 import org.openhab.core.thing.binding.ThingHandlerService;
31 import org.openhab.core.types.Command;
32 import org.openhab.core.types.RefreshType;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36 /**
37  * This is a class for handling a Partition type Thing.
38  *
39  * @author Georgios Moutsos - Initial contribution
40  */
41 @NonNullByDefault
42 public class ThingHandlerPartition extends CaddxBaseThingHandler {
43
44     private final Logger logger = LoggerFactory.getLogger(ThingHandlerPartition.class);
45     private long lastRefreshTime = 0;
46
47     public ThingHandlerPartition(Thing thing) {
48         super(thing, CaddxThingType.PARTITION);
49     }
50
51     @Override
52     public void updateChannel(ChannelUID channelUID, String data) {
53         if (CaddxBindingConstants.PARTITION_SECONDARY_COMMAND.equals(channelUID.getId())) {
54             updateState(channelUID, new DecimalType(data));
55         } else {
56             OnOffType onOffType = ("true".equals(data)) ? OnOffType.ON : OnOffType.OFF;
57             updateState(channelUID, onOffType);
58         }
59     }
60
61     @Override
62     public void handleCommand(ChannelUID channelUID, Command command) {
63         logger.debug("handleCommand(): Command Received - {} {}.", channelUID, command);
64
65         String cmd = null;
66         String data = null;
67         CaddxBridgeHandler bridgeHandler = getCaddxBridgeHandler();
68         if (bridgeHandler == null) {
69             return;
70         }
71
72         if (command instanceof RefreshType) {
73             // Refresh only if 2 seconds have passed from the last refresh
74             if (System.currentTimeMillis() - lastRefreshTime > 2000) {
75                 cmd = CaddxBindingConstants.PARTITION_STATUS_REQUEST;
76                 data = String.format("%d", getPartitionNumber() - 1);
77             } else {
78                 return;
79             }
80             lastRefreshTime = System.currentTimeMillis();
81         } else if (channelUID.getId().equals(CaddxBindingConstants.PARTITION_SECONDARY_COMMAND)) {
82             cmd = channelUID.getId();
83             data = String.format("%s,%d", command.toString(), (1 << getPartitionNumber() - 1));
84         } else {
85             logger.debug("Unknown command {}", command);
86             return;
87         }
88
89         if (!data.startsWith("-")) {
90             bridgeHandler.sendCommand(cmd, data);
91         }
92     }
93
94     @Override
95     public void caddxEventReceived(CaddxEvent event, Thing thing) {
96         logger.trace("caddxEventReceived(): Event Received - {}", event);
97
98         if (getThing().equals(thing)) {
99             CaddxMessage message = event.getCaddxMessage();
100             CaddxMessageType mt = message.getCaddxMessageType();
101             ChannelUID channelUID = null;
102
103             for (CaddxProperty p : mt.properties) {
104                 if (!p.getId().isEmpty()) {
105                     String value = message.getPropertyById(p.getId());
106                     channelUID = new ChannelUID(getThing().getUID(), p.getId());
107                     updateChannel(channelUID, value);
108                 }
109             }
110
111             // Reset the command
112             String value = "-1";
113             channelUID = new ChannelUID(getThing().getUID(), CaddxBindingConstants.PARTITION_SECONDARY_COMMAND);
114             updateChannel(channelUID, value);
115
116             updateStatus(ThingStatus.ONLINE);
117         }
118     }
119
120     @Override
121     public Collection<Class<? extends ThingHandlerService>> getServices() {
122         return Collections.singleton(CaddxPartitionActions.class);
123     }
124
125     private void sendPrimaryCommand(String pin, String function) {
126         String cmd = CaddxBindingConstants.PARTITION_PRIMARY_COMMAND_WITH_PIN;
127
128         // Build the data
129         StringBuilder sb = new StringBuilder();
130         sb.append("0x").append(pin.charAt(1)).append(pin.charAt(0)).append(",0x").append(pin.charAt(3))
131                 .append(pin.charAt(2)).append(",0x").append(pin.charAt(5)).append(pin.charAt(4)).append(",")
132                 .append(function).append(",").append(Integer.toString(1 << getPartitionNumber() - 1));
133
134         CaddxBridgeHandler bridgeHandler = getCaddxBridgeHandler();
135         if (bridgeHandler == null) {
136             return;
137         }
138         bridgeHandler.sendCommand(cmd, sb.toString());
139     }
140
141     private void sendSecondaryCommand(String function) {
142         String cmd = CaddxBindingConstants.PARTITION_SECONDARY_COMMAND;
143
144         // Build the data
145         StringBuilder sb = new StringBuilder();
146         sb.append(function).append(",").append(Integer.toString(1 << getPartitionNumber() - 1));
147
148         CaddxBridgeHandler bridgeHandler = getCaddxBridgeHandler();
149         if (bridgeHandler == null) {
150             return;
151         }
152         bridgeHandler.sendCommand(cmd, sb.toString());
153     }
154
155     public void turnOffAnySounderOrAlarm(String pin) {
156         sendPrimaryCommand(pin, "0");
157     }
158
159     public void disarm(String pin) {
160         sendPrimaryCommand(pin, "1");
161     }
162
163     public void armInAwayMode(String pin) {
164         sendPrimaryCommand(pin, "2");
165     }
166
167     public void armInStayMode(String pin) {
168         sendPrimaryCommand(pin, "3");
169     }
170
171     public void cancel(String pin) {
172         sendPrimaryCommand(pin, "4");
173     }
174
175     public void initiateAutoArm(String pin) {
176         sendPrimaryCommand(pin, "5");
177     }
178
179     public void startWalkTestMode(String pin) {
180         sendPrimaryCommand(pin, "6");
181     }
182
183     public void stopWalkTestMode(String pin) {
184         sendPrimaryCommand(pin, "7");
185     }
186
187     public void stay() {
188         sendSecondaryCommand("0");
189     }
190
191     public void chime() {
192         sendSecondaryCommand("1");
193     }
194
195     public void exit() {
196         sendSecondaryCommand("2");
197     }
198
199     public void bypassInteriors() {
200         sendSecondaryCommand("3");
201     }
202
203     public void firePanic() {
204         sendSecondaryCommand("4");
205     }
206
207     public void medicalPanic() {
208         sendSecondaryCommand("5");
209     }
210
211     public void policePanic() {
212         sendSecondaryCommand("6");
213     }
214
215     public void smokeDetectorReset() {
216         sendSecondaryCommand("7");
217     }
218
219     public void autoCallbackDownload() {
220         sendSecondaryCommand("8");
221     }
222
223     public void manualPickupDownload() {
224         sendSecondaryCommand("9");
225     }
226
227     public void enableSilentExit() {
228         sendSecondaryCommand("10");
229     }
230
231     public void performTest() {
232         sendSecondaryCommand("11");
233     }
234
235     public void groupBypass() {
236         sendSecondaryCommand("12");
237     }
238
239     public void auxiliaryFunction1() {
240         sendSecondaryCommand("13");
241     }
242
243     public void auxiliaryFunction2() {
244         sendSecondaryCommand("14");
245     }
246
247     public void startKeypadSounder() {
248         sendSecondaryCommand("15");
249     }
250 }