2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.caddx.internal.handler;
15 import java.util.Collection;
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;
36 * This is a class for handling a Keypad type Thing.
38 * @author Georgios Moutsos - Initial contribution
41 public class ThingHandlerKeypad extends CaddxBaseThingHandler {
42 private final Logger logger = LoggerFactory.getLogger(ThingHandlerKeypad.class);
44 public ThingHandlerKeypad(Thing thing) {
45 super(thing, CaddxThingType.KEYPAD);
49 public void initialize() {
52 CaddxBridgeHandler bridgeHandler = getCaddxBridgeHandler();
53 if (bridgeHandler == null) {
57 // Follow the bridge status
58 updateStatus(bridgeHandler.getThing().getStatus());
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);
70 public void caddxEventReceived(CaddxEvent event, Thing thing) {
71 logger.trace("caddxEventReceived(): Event Received - {}.", event);
73 if (getThing().equals(thing)) {
74 CaddxMessage message = event.getCaddxMessage();
75 CaddxMessageType mt = message.getCaddxMessageType();
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);
88 updateStatus(ThingStatus.ONLINE);
93 public void bridgeStatusChanged(ThingStatusInfo bridgeStatusInfo) {
94 // Keypad follows the status of the bridge
95 updateStatus(bridgeStatusInfo.getStatus());
97 super.bridgeStatusChanged(bridgeStatusInfo);
101 public Collection<Class<? extends ThingHandlerService>> getServices() {
102 return Set.of(CaddxKeypadActions.class);
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());
110 CaddxBridgeHandler bridgeHandler = getCaddxBridgeHandler();
111 if (bridgeHandler == null) {
114 bridgeHandler.sendCommand(CaddxMessageContext.COMMAND, cmd, data);
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");
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));
127 CaddxBridgeHandler bridgeHandler = getCaddxBridgeHandler();
128 if (bridgeHandler == null) {
131 bridgeHandler.sendCommand(CaddxMessageContext.COMMAND, cmd, data);