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