]> git.basschouten.com Git - openhab-addons.git/blob
d2dd43a682b23b0caf654b776f437de8e7d16cd4
[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.dscalarm.internal.handler;
14
15 import static org.openhab.binding.dscalarm.internal.DSCAlarmBindingConstants.*;
16
17 import java.util.EventObject;
18
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.OnOffType;
24 import org.openhab.core.library.types.OpenClosedType;
25 import org.openhab.core.library.types.StringType;
26 import org.openhab.core.thing.ChannelUID;
27 import org.openhab.core.thing.Thing;
28 import org.openhab.core.types.Command;
29 import org.openhab.core.types.RefreshType;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 /**
34  * This is a class for handling a Zone type Thing.
35  *
36  * @author Russell Stephens - Initial Contribution
37  */
38 public class ZoneThingHandler extends DSCAlarmBaseThingHandler {
39
40     private final Logger logger = LoggerFactory.getLogger(ZoneThingHandler.class);
41
42     /**
43      * Constructor.
44      *
45      * @param thing
46      */
47     public ZoneThingHandler(Thing thing) {
48         super(thing);
49         setDSCAlarmThingType(DSCAlarmThingType.ZONE);
50     }
51
52     @Override
53     public void updateChannel(ChannelUID channelUID, int state, String description) {
54         logger.debug("updateChannel(): Zone Channel UID: {}", channelUID);
55
56         boolean trigger;
57         OnOffType onOffType;
58         OpenClosedType openClosedType;
59
60         if (channelUID != null) {
61             switch (channelUID.getId()) {
62                 case ZONE_MESSAGE:
63                     updateState(channelUID, new StringType(description));
64                     break;
65                 case ZONE_STATUS:
66                     openClosedType = (state > 0) ? OpenClosedType.OPEN : OpenClosedType.CLOSED;
67                     updateState(channelUID, openClosedType);
68                     break;
69                 case ZONE_BYPASS_MODE:
70                     onOffType = (state > 0) ? OnOffType.ON : OnOffType.OFF;
71                     updateState(channelUID, onOffType);
72                     break;
73                 case ZONE_IN_ALARM:
74                     trigger = state != 0;
75                     onOffType = trigger ? OnOffType.ON : OnOffType.OFF;
76                     updateState(channelUID, onOffType);
77                     break;
78                 case ZONE_TAMPER:
79                     trigger = state != 0;
80                     onOffType = trigger ? OnOffType.ON : OnOffType.OFF;
81                     updateState(channelUID, onOffType);
82                     break;
83                 case ZONE_FAULT:
84                     trigger = state != 0;
85                     onOffType = trigger ? OnOffType.ON : OnOffType.OFF;
86                     updateState(channelUID, onOffType);
87                     break;
88                 case ZONE_TRIPPED:
89                     trigger = state != 0;
90                     onOffType = trigger ? OnOffType.ON : OnOffType.OFF;
91                     updateState(channelUID, onOffType);
92                     break;
93                 default:
94                     logger.debug("updateChannel(): Zone Channel not updated - {}.", channelUID);
95                     break;
96             }
97         }
98     }
99
100     @Override
101     public void handleCommand(ChannelUID channelUID, Command command) {
102         logger.debug("handleCommand(): Command Received - {} {}.", channelUID, command);
103
104         if (command instanceof RefreshType) {
105             return;
106         }
107
108         if (dscAlarmBridgeHandler != null && dscAlarmBridgeHandler.isConnected()
109                 && channelUID.getId().equals(ZONE_BYPASS_MODE)) {
110             String data = getPartitionNumber() + "*1" + String.format("%02d", getZoneNumber()) + "#";
111
112             dscAlarmBridgeHandler.sendCommand(DSCAlarmCode.KeySequence, data);
113         }
114     }
115
116     /**
117      * Method to set Zone Message.
118      *
119      * @param message
120      */
121     private void zoneMessage(String message) {
122         updateState(new ChannelUID(getThing().getUID(), ZONE_MESSAGE), new StringType(message));
123     }
124
125     @Override
126     public void dscAlarmEventReceived(EventObject event, Thing thing) {
127         if (thing != null) {
128             if (getThing().equals(thing)) {
129                 DSCAlarmEvent dscAlarmEvent = (DSCAlarmEvent) event;
130                 DSCAlarmMessage dscAlarmMessage = dscAlarmEvent.getDSCAlarmMessage();
131
132                 ChannelUID channelUID = null;
133                 DSCAlarmCode dscAlarmCode = DSCAlarmCode
134                         .getDSCAlarmCodeValue(dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.CODE));
135                 logger.debug("dscAlarmEventRecieved(): Thing - {}   Command - {}", thing.getUID(), dscAlarmCode);
136
137                 int state = 0;
138                 String status = "";
139
140                 switch (dscAlarmCode) {
141                     case ZoneAlarm: /* 601 */
142                         state = 1;
143                         status = dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.DESCRIPTION);
144                     case ZoneAlarmRestore: /* 602 */
145                         channelUID = new ChannelUID(getThing().getUID(), ZONE_IN_ALARM);
146                         updateChannel(channelUID, state, "");
147                         zoneMessage(status);
148                         break;
149                     case ZoneTamper: /* 603 */
150                         state = 1;
151                         status = dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.DESCRIPTION);
152                     case ZoneTamperRestore: /* 604 */
153                         channelUID = new ChannelUID(getThing().getUID(), ZONE_TAMPER);
154                         updateChannel(channelUID, state, "");
155                         zoneMessage(status);
156                         break;
157                     case ZoneFault: /* 605 */
158                         state = 1;
159                         status = dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.DESCRIPTION);
160                     case ZoneFaultRestore: /* 606 */
161                         channelUID = new ChannelUID(getThing().getUID(), ZONE_FAULT);
162                         updateChannel(channelUID, state, "");
163                         zoneMessage(status);
164                         break;
165                     case ZoneOpen: /* 609 */
166                         state = 1;
167                         status = dscAlarmMessage.getMessageInfo(DSCAlarmMessageInfoType.DESCRIPTION);
168                     case ZoneRestored: /* 610 */
169                         channelUID = new ChannelUID(getThing().getUID(), ZONE_TRIPPED);
170                         updateChannel(channelUID, state, "");
171
172                         channelUID = new ChannelUID(getThing().getUID(), ZONE_STATUS);
173                         updateChannel(channelUID, state, "");
174                         zoneMessage(status);
175                         break;
176                     default:
177                         break;
178                 }
179             }
180         }
181     }
182 }