2 * Copyright (c) 2010-2020 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 };
104 ChannelUID channelUID = null;
105 DSCAlarmCode dscAlarmCode = DSCAlarmCode
106 .getDSCAlarmCodeValue(dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.CODE));
108 int bitField = Integer.decode("0x" + dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.DATA));
109 int[] masks = { 1, 2, 4, 8, 16, 32, 64, 128 };
110 int[] bits = new int[8];
112 for (int i = 0; i < 8; i++) {
113 bits[i] = bitField & masks[i];
115 channel = channelTypes[i];
118 channelUID = new ChannelUID(getThing().getUID(), channel);
120 switch (dscAlarmCode) {
121 case KeypadLEDState: /* 510 */
122 updateChannel(channelUID, bits[i] != 0 ? 1 : 0, "");
124 case KeypadLEDFlashState: /* 511 */
126 updateChannel(channelUID, 2, "");
137 public void dscAlarmEventReceived(EventObject event, Thing thing) {
139 if (getThing() == thing) {
140 DSCAlarmEvent dscAlarmEvent = (DSCAlarmEvent) event;
141 DSCAlarmMessage dscAlarmMessage = dscAlarmEvent.getDSCAlarmMessage();
143 ChannelUID channelUID = null;
144 DSCAlarmCode dscAlarmCode = DSCAlarmCode
145 .getDSCAlarmCodeValue(dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.CODE));
146 String dscAlarmMessageData = dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.DATA);
148 logger.debug("dscAlarmEventRecieved(): Thing - {} Command - {}", thing.getUID(), dscAlarmCode);
150 switch (dscAlarmCode) {
151 case KeypadLEDState: /* 510 */
152 case KeypadLEDFlashState: /* 511 */
153 keypadLEDStateEventHandler(event);
155 case LCDUpdate: /* 901 */
156 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_LCD_UPDATE);
157 updateChannel(channelUID, 0, dscAlarmMessageData);
159 case LCDCursor: /* 902 */
160 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_LCD_CURSOR);
161 updateChannel(channelUID, 0, dscAlarmMessageData);
163 case LEDStatus: /* 903 */
164 int data = Integer.parseInt(dscAlarmMessageData.substring(0, 1));
166 .parseInt(dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.DATA).substring(1));
169 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_READY_LED);
170 updateChannel(channelUID, state, "");
173 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_ARMED_LED);
174 updateChannel(channelUID, state, "");
177 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_MEMORY_LED);
178 updateChannel(channelUID, state, "");
181 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_BYPASS_LED);
182 updateChannel(channelUID, state, "");
185 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_TROUBLE_LED);
186 updateChannel(channelUID, state, "");
189 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_PROGRAM_LED);
190 updateChannel(channelUID, state, "");
193 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_FIRE_LED);
194 updateChannel(channelUID, state, "");
197 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_BACKLIGHT_LED);
198 updateChannel(channelUID, state, "");
201 channelUID = new ChannelUID(getThing().getUID(), KEYPAD_AC_LED);
202 updateChannel(channelUID, state, "");