Skip to content

Commit 9207330

Browse files
authored
[dscalarm] Process Bypassed Zones Bitfield Dump (616) command (openhab#18056)
Signed-off-by: Vasilis Pantelis <[email protected]>
1 parent e32f717 commit 9207330

File tree

4 files changed

+296
-233
lines changed

4 files changed

+296
-233
lines changed

bundles/org.openhab.binding.dscalarm/src/main/java/org/openhab/binding/dscalarm/internal/DSCAlarmCode.java

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public enum DSCAlarmCode {
8888
ZoneRestored("610", "Zone Restored", "610: General status of the zone - restored."),
8989
EnvisalinkZoneTimerDump("615", "Envisalink Zone Timer Dump",
9090
"615: The raw zone timers used inside the Envisalink."),
91+
BypassedZonesBitfield("616", "Bypassed Zones Bitfield", "616: Bypassed zones bitfield."),
9192
DuressAlarm("620", "Duress Alarm", "620: A duress code has been entered on a system keypad."),
9293
FireKeyAlarm("621", "Fire Key Alarm", "621: A Fire key alarm has been activated."),
9394
FireKeyRestored("622", "Fire Key Alarm Restore", "622: A Fire key alarm has been restored."),

bundles/org.openhab.binding.dscalarm/src/main/java/org/openhab/binding/dscalarm/internal/DSCAlarmMessage.java

+162-167
Original file line numberDiff line numberDiff line change
@@ -79,187 +79,180 @@ public DSCAlarmMessage(String message) {
7979
* Processes the incoming DSC Alarm message and extracts the information.
8080
*/
8181
private void processDSCAlarmMessage() {
82-
DSCAlarmCode dscAlarmCode;
83-
84-
if (message.length() > 3) {
85-
try {
86-
if (message.length() >= 8 && message.charAt(2) == ':' && message.charAt(5) == ':') {
87-
timeStamp = message.substring(0, 8);
88-
message = message.substring(9, message.length() - 2);
89-
} else {
90-
message = message.substring(0, message.length() - 2);
91-
}
92-
93-
codeReceived = message.substring(0, 3);
82+
if (message.length() <= 3) {
83+
codeReceived = "-1";
84+
data = "";
85+
DSCAlarmCode dscAlarmCode = DSCAlarmCode.UnknownCode;
86+
name = dscAlarmCode.getName();
87+
description = dscAlarmCode.getDescription();
88+
logger.debug("parseAPIMessage(): Invalid Message Received");
89+
return;
90+
}
9491

95-
if (message.length() >= 4) {
96-
data = message.substring(3);
97-
}
98-
} catch (Exception e) {
99-
logger.warn("processDSCAlarmMessage(): Error processing message: ({}) ", message, e);
100-
return;
92+
try {
93+
if (message.length() >= 8 && message.charAt(2) == ':' && message.charAt(5) == ':') {
94+
timeStamp = message.substring(0, 8);
95+
message = message.substring(9, message.length() - 2);
96+
} else {
97+
message = message.substring(0, message.length() - 2);
10198
}
10299

103-
dscAlarmCode = DSCAlarmCode.getDSCAlarmCodeValue(codeReceived);
100+
codeReceived = message.substring(0, 3);
104101

105-
if (dscAlarmCode != null) {
106-
name = dscAlarmCode.getName();
107-
description = dscAlarmCode.getDescription();
102+
if (message.length() >= 4) {
103+
data = message.substring(3);
104+
}
105+
} catch (Exception e) {
106+
logger.warn("processDSCAlarmMessage(): Error processing message: ({}) ", message, e);
107+
return;
108+
}
108109

109-
MessageParameters messageParms = DSCALARM_MESSAGE_PARAMETERS.get(dscAlarmCode);
110+
DSCAlarmCode dscAlarmCode = DSCAlarmCode.getDSCAlarmCodeValue(codeReceived);
110111

111-
if (messageParms != null) {
112-
boolean hasPartition = messageParms.hasPartition();
113-
boolean hasZone = messageParms.hasZone();
112+
if (dscAlarmCode != null) {
113+
name = dscAlarmCode.getName();
114+
description = dscAlarmCode.getDescription();
114115

115-
if (hasPartition) {
116-
partition = message.substring(3, 4);
117-
}
116+
MessageParameters messageParams = DSCALARM_MESSAGE_PARAMETERS.get(dscAlarmCode);
118117

119-
if (hasZone) {
120-
if (hasPartition) {
121-
zone = message.substring(4);
122-
} else {
123-
zone = message.substring(3);
124-
}
125-
}
118+
if (messageParams != null) {
119+
boolean hasPartition = messageParams.hasPartition();
120+
boolean hasZone = messageParams.hasZone();
126121

127-
messageType = messageParms.getType();
122+
if (hasPartition) {
123+
partition = message.substring(3, 4);
128124
}
129125

130-
switch (dscAlarmCode) {
131-
case SystemError: /* 502 */
132-
int systemErrorCode = 0;
133-
systemErrorCode = Integer.parseInt(data);
134-
switch (systemErrorCode) {
135-
case 1:
136-
error = "Receive Buffer Overrun";
137-
break;
138-
case 2:
139-
error = "Receive Buffer Overflow";
140-
break;
141-
case 3:
142-
error = "Transmit Buffer Overflow";
143-
break;
144-
case 10:
145-
error = "Keybus Transmit Buffer Overrun";
146-
break;
147-
case 11:
148-
error = "Keybus Transmit Time Timeout";
149-
break;
150-
case 12:
151-
error = "Keybus Transmit Mode Timeout";
152-
break;
153-
case 13:
154-
error = "Keybus Transmit Keystring Timeout";
155-
break;
156-
case 14:
157-
error = "Keybus Interface Not Functioning";
158-
break;
159-
case 15:
160-
error = "Keybus Busy - Attempting to Disarm or Arm with user code";
161-
break;
162-
case 16:
163-
error = "Keybus Busy – Lockout";
164-
break;
165-
case 17:
166-
error = "Keybus Busy – Installers Mode";
167-
break;
168-
case 18:
169-
error = "Keybus Busy - General Busy";
170-
break;
171-
case 20:
172-
error = "API Command Syntax Error";
173-
break;
174-
case 21:
175-
error = "API Command Partition Error - Requested Partition is out of bounds";
176-
break;
177-
case 22:
178-
error = "API Command Not Supported";
179-
break;
180-
case 23:
181-
error = "API System Not Armed - Sent in response to a disarm command";
182-
break;
183-
case 24:
184-
error = "API System Not Ready to Arm - System is either not-secure, in exit-delay, or already armed";
185-
break;
186-
case 25:
187-
error = "API Command Invalid Length";
188-
break;
189-
case 26:
190-
error = "API User Code not Required";
191-
break;
192-
case 27:
193-
error = "API Invalid Characters in Command - No alpha characters are allowed except for checksum";
194-
break;
195-
case 28:
196-
error = "API Virtual Keypad is Disabled";
197-
break;
198-
case 29:
199-
error = "API Not Valid Parameter";
200-
break;
201-
case 30:
202-
error = "API Keypad Does Not Come Out of Blank Mode";
203-
break;
204-
case 31:
205-
error = "API IT-100 is Already in Thermostat Menu";
206-
break;
207-
case 32:
208-
error = "API IT-100 is NOT in Thermostat Menu";
209-
break;
210-
case 33:
211-
error = "API No Response From Thermostat or Escort Module";
212-
break;
213-
case 0:
214-
default:
215-
error = "No Error";
216-
break;
217-
}
218-
break;
219-
220-
case PartitionArmed: /* 652 */
221-
mode = message.substring(4);
222-
if ("0".equals(mode)) {
223-
name += " (Away)";
224-
} else if ("1".equals(mode)) {
225-
name += " (Stay)";
226-
} else if ("2".equals(mode)) {
227-
name += " (ZEA)";
228-
} else if ("3".equals(mode)) {
229-
name += " (ZES)";
230-
}
231-
messageType = DSCAlarmMessageType.PARTITION_EVENT;
232-
break;
233-
case UserClosing: /* 700 */
234-
user = message.substring(4);
235-
name = name.concat(": " + user);
236-
description = codeReceived + ": Partition " + partition + " has been armed by user " + user
237-
+ ".";
238-
messageType = DSCAlarmMessageType.PARTITION_EVENT;
239-
break;
240-
case UserOpening: /* 750 */
241-
user = message.substring(4);
242-
name = name.concat(": " + user);
243-
description = codeReceived + ": Partition " + partition + " has been disarmed by user " + user
244-
+ ".";
245-
messageType = DSCAlarmMessageType.PARTITION_EVENT;
246-
break;
247-
248-
default:
249-
break;
126+
if (hasZone) {
127+
int zoneIndex = hasPartition ? 4 : 3;
128+
zone = message.substring(zoneIndex);
250129
}
251130

252-
logger.debug(
253-
"parseAPIMessage(): Message Received ({}) - Code: {}, Name: {}, Description: {}, Data: {}\r\n",
254-
message, codeReceived, name, description, data);
131+
messageType = messageParams.getType();
255132
}
256-
} else {
257-
codeReceived = "-1";
258-
data = "";
259-
dscAlarmCode = DSCAlarmCode.getDSCAlarmCodeValue(codeReceived);
260-
name = dscAlarmCode.getName();
261-
description = dscAlarmCode.getDescription();
262-
logger.debug("parseAPIMessage(): Invalid Message Received");
133+
134+
switch (dscAlarmCode) {
135+
case SystemError: /* 502 */
136+
int systemErrorCode = 0;
137+
systemErrorCode = Integer.parseInt(data);
138+
switch (systemErrorCode) {
139+
case 1:
140+
error = "Receive Buffer Overrun";
141+
break;
142+
case 2:
143+
error = "Receive Buffer Overflow";
144+
break;
145+
case 3:
146+
error = "Transmit Buffer Overflow";
147+
break;
148+
case 10:
149+
error = "Keybus Transmit Buffer Overrun";
150+
break;
151+
case 11:
152+
error = "Keybus Transmit Time Timeout";
153+
break;
154+
case 12:
155+
error = "Keybus Transmit Mode Timeout";
156+
break;
157+
case 13:
158+
error = "Keybus Transmit Keystring Timeout";
159+
break;
160+
case 14:
161+
error = "Keybus Interface Not Functioning";
162+
break;
163+
case 15:
164+
error = "Keybus Busy - Attempting to Disarm or Arm with user code";
165+
break;
166+
case 16:
167+
error = "Keybus Busy – Lockout";
168+
break;
169+
case 17:
170+
error = "Keybus Busy – Installers Mode";
171+
break;
172+
case 18:
173+
error = "Keybus Busy - General Busy";
174+
break;
175+
case 20:
176+
error = "API Command Syntax Error";
177+
break;
178+
case 21:
179+
error = "API Command Partition Error - Requested Partition is out of bounds";
180+
break;
181+
case 22:
182+
error = "API Command Not Supported";
183+
break;
184+
case 23:
185+
error = "API System Not Armed - Sent in response to a disarm command";
186+
break;
187+
case 24:
188+
error = "API System Not Ready to Arm - System is either not-secure, in exit-delay, or already armed";
189+
break;
190+
case 25:
191+
error = "API Command Invalid Length";
192+
break;
193+
case 26:
194+
error = "API User Code not Required";
195+
break;
196+
case 27:
197+
error = "API Invalid Characters in Command - No alpha characters are allowed except for checksum";
198+
break;
199+
case 28:
200+
error = "API Virtual Keypad is Disabled";
201+
break;
202+
case 29:
203+
error = "API Not Valid Parameter";
204+
break;
205+
case 30:
206+
error = "API Keypad Does Not Come Out of Blank Mode";
207+
break;
208+
case 31:
209+
error = "API IT-100 is Already in Thermostat Menu";
210+
break;
211+
case 32:
212+
error = "API IT-100 is NOT in Thermostat Menu";
213+
break;
214+
case 33:
215+
error = "API No Response From Thermostat or Escort Module";
216+
break;
217+
case 0:
218+
default:
219+
error = "No Error";
220+
break;
221+
}
222+
break;
223+
case PartitionArmed: /* 652 */
224+
mode = message.substring(4);
225+
if ("0".equals(mode)) {
226+
name += " (Away)";
227+
} else if ("1".equals(mode)) {
228+
name += " (Stay)";
229+
} else if ("2".equals(mode)) {
230+
name += " (ZEA)";
231+
} else if ("3".equals(mode)) {
232+
name += " (ZES)";
233+
}
234+
messageType = DSCAlarmMessageType.PARTITION_EVENT;
235+
break;
236+
case UserClosing: /* 700 */
237+
user = message.substring(4);
238+
name = name.concat(": " + user);
239+
description = codeReceived + ": Partition " + partition + " has been armed by user " + user + ".";
240+
messageType = DSCAlarmMessageType.PARTITION_EVENT;
241+
break;
242+
case UserOpening: /* 750 */
243+
user = message.substring(4);
244+
name = name.concat(": " + user);
245+
description = codeReceived + ": Partition " + partition + " has been disarmed by user " + user
246+
+ ".";
247+
messageType = DSCAlarmMessageType.PARTITION_EVENT;
248+
break;
249+
250+
default:
251+
break;
252+
}
253+
254+
logger.debug("parseAPIMessage(): Message Received ({}) - Code: {}, Name: {}, Description: {}, Data: {}\r\n",
255+
message, codeReceived, name, description, data);
263256
}
264257
}
265258

@@ -451,6 +444,8 @@ public boolean hasZone() {
451444
new MessageParameters(DSCAlarmMessageType.ZONE_EVENT, false, true));
452445
DSCALARM_MESSAGE_PARAMETERS.put(DSCAlarmCode.EnvisalinkZoneTimerDump,
453446
new MessageParameters(DSCAlarmMessageType.PANEL_EVENT, false, false));
447+
DSCALARM_MESSAGE_PARAMETERS.put(DSCAlarmCode.BypassedZonesBitfield,
448+
new MessageParameters(DSCAlarmMessageType.ZONE_EVENT, false, false));
454449
DSCALARM_MESSAGE_PARAMETERS.put(DSCAlarmCode.DuressAlarm,
455450
new MessageParameters(DSCAlarmMessageType.PANEL_EVENT, false, false));
456451
DSCALARM_MESSAGE_PARAMETERS.put(DSCAlarmCode.FireKeyAlarm,

0 commit comments

Comments
 (0)