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.dscalarm.internal.handler;
15 import static org.openhab.binding.dscalarm.internal.DSCAlarmBindingConstants.*;
17 import java.util.EventObject;
19 import org.openhab.binding.dscalarm.internal.DSCAlarmCode;
20 import org.openhab.binding.dscalarm.internal.DSCAlarmEvent;
21 import org.openhab.binding.dscalarm.internal.DSCAlarmMessage;
22 import org.openhab.binding.dscalarm.internal.DSCAlarmMessage.DSCAlarmMessageInfoType;
23 import org.openhab.core.library.types.DecimalType;
24 import org.openhab.core.library.types.StringType;
25 import org.openhab.core.thing.ChannelUID;
26 import org.openhab.core.thing.Thing;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
31 * This is a class for handling a Zone type Thing.
33 * @author Russell Stephens - Initial Contribution
35 public class KeypadThingHandler extends DSCAlarmBaseThingHandler {
37 private final Logger logger = LoggerFactory.getLogger(KeypadThingHandler.class);
44 public KeypadThingHandler(Thing thing) {
46 setDSCAlarmThingType(DSCAlarmThingType.KEYPAD);
50 public void updateChannel(ChannelUID channelUID, int state, String description) {
51 logger.debug("updateChannel(): Keypad Channel UID: {}", channelUID);
52 if (channelUID != null) {
53 switch (channelUID.getId()) {
54 case KEYPAD_READY_LED:
55 updateState(channelUID, new DecimalType(state));
57 case KEYPAD_ARMED_LED:
58 updateState(channelUID, new DecimalType(state));
60 case KEYPAD_MEMORY_LED:
61 updateState(channelUID, new DecimalType(state));
63 case KEYPAD_BYPASS_LED:
64 updateState(channelUID, new DecimalType(state));
66 case KEYPAD_TROUBLE_LED:
67 updateState(channelUID, new DecimalType(state));
69 case KEYPAD_PROGRAM_LED:
70 updateState(channelUID, new DecimalType(state));
73 updateState(channelUID, new DecimalType(state));
75 case KEYPAD_BACKLIGHT_LED:
76 updateState(channelUID, new DecimalType(state));
79 updateState(channelUID, new DecimalType(state));
81 case KEYPAD_LCD_UPDATE:
82 case KEYPAD_LCD_CURSOR:
83 updateState(channelUID, new StringType(description));
86 logger.debug("updateChannel(): Keypad Channel not updated - {}.", channelUID);
93 * Handle Keypad LED events for the EyezOn Envisalink 3/2DS DSC Alarm Interface
97 private void keypadLEDStateEventHandler(EventObject event) {
98 DSCAlarmEvent dscAlarmEvent = (DSCAlarmEvent) event;
99 DSCAlarmMessage dscAlarmMessage = dscAlarmEvent.getDSCAlarmMessage();
100 String[] channelTypes = { KEYPAD_READY_LED, KEYPAD_ARMED_LED, KEYPAD_MEMORY_LED, KEYPAD_BYPASS_LED,
101 KEYPAD_TROUBLE_LED, KEYPAD_PROGRAM_LED, KEYPAD_FIRE_LED, KEYPAD_BACKLIGHT_LED };
103 DSCAlarmCode dscAlarmCode = DSCAlarmCode
104 .getDSCAlarmCodeValue(dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.CODE));
107 int bitField = Integer.decode("0x" + dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.DATA));
108 int[] masks = { 1, 2, 4, 8, 16, 32, 64, 128 };
109 int[] bits = new int[bitCount];
111 for (int i = 0; i < bitCount; i++) {
112 bits[i] = bitField & masks[i];
113 ChannelUID channelUID = new ChannelUID(getThing().getUID(), channelTypes[i]);
114 switch (dscAlarmCode) {
115 case KeypadLEDState: /* 510 */
116 updateChannel(channelUID, bits[i] != 0 ? 1 : 0, "");
118 case KeypadLEDFlashState: /* 511 */
120 updateChannel(channelUID, 2, "");
130 @SuppressWarnings("PMD.CompareObjectsWithEquals")
131 public void dscAlarmEventReceived(EventObject event, Thing thing) {
133 if (getThing() == thing) {
134 DSCAlarmEvent dscAlarmEvent = (DSCAlarmEvent) event;
135 DSCAlarmMessage dscAlarmMessage = dscAlarmEvent.getDSCAlarmMessage();
137 ChannelUID channelUID = null;
138 DSCAlarmCode dscAlarmCode = DSCAlarmCode
139 .getDSCAlarmCodeValue(dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.CODE));
140 String dscAlarmMessageData = dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.DATA);
142 logger.debug("dscAlarmEventRecieved(): Thing - {} Command - {}", thing.getUID(), dscAlarmCode);
144 switch (dscAlarmCode) {
145 case KeypadLEDState: /* 510 */
146 case KeypadLEDFlashState: /* 511 */
147 keypadLEDStateEventHandler(event);
149 case LCDUpdate: /* 901 */
150 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_LCD_UPDATE);
151 updateChannel(channelUID, 0, dscAlarmMessageData);
153 case LCDCursor: /* 902 */
154 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_LCD_CURSOR);
155 updateChannel(channelUID, 0, dscAlarmMessageData);
157 case LEDStatus: /* 903 */
158 int data = Integer.parseInt(dscAlarmMessageData.substring(0, 1));
160 .parseInt(dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.DATA).substring(1));
163 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_READY_LED);
164 updateChannel(channelUID, state, "");
167 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_ARMED_LED);
168 updateChannel(channelUID, state, "");
171 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_MEMORY_LED);
172 updateChannel(channelUID, state, "");
175 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_BYPASS_LED);
176 updateChannel(channelUID, state, "");
179 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_TROUBLE_LED);
180 updateChannel(channelUID, state, "");
183 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_PROGRAM_LED);
184 updateChannel(channelUID, state, "");
187 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_FIRE_LED);
188 updateChannel(channelUID, state, "");
191 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_BACKLIGHT_LED);
192 updateChannel(channelUID, state, "");
195 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_AC_LED);
196 updateChannel(channelUID, state, "");