]> git.basschouten.com Git - openhab-addons.git/blob
ef8d5b501a4c36002fd78d2cf75ed2f0eda99e96
[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.CaddxKeypadActions;
26 import org.openhab.core.library.types.StringType;
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.ThingStatusInfo;
31 import org.openhab.core.thing.binding.ThingHandlerService;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 /**
36  * This is a class for handling a Keypad type Thing.
37  *
38  * @author Georgios Moutsos - Initial contribution
39  */
40 @NonNullByDefault
41 public class ThingHandlerKeypad extends CaddxBaseThingHandler {
42     private final Logger logger = LoggerFactory.getLogger(ThingHandlerKeypad.class);
43
44     public ThingHandlerKeypad(Thing thing) {
45         super(thing, CaddxThingType.KEYPAD);
46     }
47
48     @Override
49     public void initialize() {
50         super.initialize();
51
52         CaddxBridgeHandler bridgeHandler = getCaddxBridgeHandler();
53         if (bridgeHandler == null) {
54             return;
55         }
56
57         // Follow the bridge status
58         updateStatus(bridgeHandler.getThing().getStatus());
59     }
60
61     @Override
62     public void updateChannel(ChannelUID channelUID, String data) {
63         if (channelUID.getId().equals(CaddxBindingConstants.KEYPAD_KEY_PRESSED)) {
64             StringType stringType = new StringType(data);
65             updateState(channelUID, stringType);
66         }
67     }
68
69     @Override
70     public void caddxEventReceived(CaddxEvent event, Thing thing) {
71         logger.trace("caddxEventReceived(): Event Received - {}.", event);
72
73         if (getThing().equals(thing)) {
74             CaddxMessage message = event.getCaddxMessage();
75             CaddxMessageType mt = message.getCaddxMessageType();
76
77             // Log event messages have special handling
78             if (CaddxMessageType.KEYPAD_MESSAGE_RECEIVED.equals(mt)) {
79                 for (CaddxProperty p : mt.properties) {
80                     if (!("".equals(p.getId()))) {
81                         String value = message.getPropertyById(p.getId());
82                         ChannelUID channelUID = new ChannelUID(getThing().getUID(), p.getId());
83                         updateChannel(channelUID, value);
84                     }
85                 }
86             }
87
88             updateStatus(ThingStatus.ONLINE);
89         }
90     }
91
92     @Override
93     public void bridgeStatusChanged(ThingStatusInfo bridgeStatusInfo) {
94         // Keypad follows the status of the bridge
95         updateStatus(bridgeStatusInfo.getStatus());
96
97         super.bridgeStatusChanged(bridgeStatusInfo);
98     }
99
100     @Override
101     public Collection<Class<? extends ThingHandlerService>> getServices() {
102         return Set.of(CaddxKeypadActions.class);
103     }
104
105     public void enterTerminalMode() {
106         String cmd = CaddxBindingConstants.KEYPAD_TERMINAL_MODE_REQUEST;
107         logger.debug("Address: {}, Seconds: {}", getKeypadAddress(), getTerminalModeSeconds());
108         String data = String.format("%d,15", getKeypadAddress(), getTerminalModeSeconds());
109
110         CaddxBridgeHandler bridgeHandler = getCaddxBridgeHandler();
111         if (bridgeHandler == null) {
112             return;
113         }
114         bridgeHandler.sendCommand(CaddxMessageContext.COMMAND, cmd, data);
115     }
116
117     public void sendKeypadTextMessage(String displayLocation, String text) {
118         if (text.length() != 8) {
119             logger.debug("Text to be displayed on the keypad has not the correct length");
120             return;
121         }
122         String cmd = CaddxBindingConstants.KEYPAD_SEND_KEYPAD_TEXT_MESSAGE;
123         String data = String.format("%d,0,%d,%d,%d,%d,%d,%d,%d,%d,%d", getKeypadAddress(), displayLocation,
124                 text.charAt(0), text.charAt(1), text.charAt(2), text.charAt(3), text.charAt(4), text.charAt(5),
125                 text.charAt(6), text.charAt(7));
126
127         CaddxBridgeHandler bridgeHandler = getCaddxBridgeHandler();
128         if (bridgeHandler == null) {
129             return;
130         }
131         bridgeHandler.sendCommand(CaddxMessageContext.COMMAND, cmd, data);
132     }
133 }