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.powermax.internal.message;
15 import static java.util.Map.entry;
19 import org.eclipse.jdt.annotation.NonNullByDefault;
22 * Constants used in Powermax messages
24 * @author Ron Isaacson - Initial contribution
27 public class PowermaxMessageConstants {
29 private PowermaxMessageConstants() {
34 public static enum PowermaxSysEventType {
47 public static class PowermaxSysEvent {
48 private final String name;
49 private final PowermaxSysEventType type;
50 private final int restoreFor;
52 protected PowermaxSysEvent(String name, PowermaxSysEventType type, int restoreFor) {
55 this.restoreFor = restoreFor;
58 protected static PowermaxSysEvent of(String name) {
59 return new PowermaxSysEvent(name, PowermaxSysEventType.NONE, 0);
62 protected static PowermaxSysEvent of(String name, PowermaxSysEventType type) {
63 return new PowermaxSysEvent(name, type, 0);
66 protected static PowermaxSysEvent of(String name, PowermaxSysEventType type, int restoreFor) {
67 return new PowermaxSysEvent(name, type, restoreFor);
70 public PowermaxSysEventType getType() {
74 public int getRestoreFor() {
75 return this.restoreFor;
78 public boolean isAlarm() {
79 return (this.type == PowermaxSysEventType.ALARM);
82 public boolean isSilentAlarm() {
83 return (this.type == PowermaxSysEventType.SILENT_ALARM);
86 public boolean isAlert() {
87 return (this.type == PowermaxSysEventType.ALERT);
90 public boolean isPanic() {
91 return (this.type == PowermaxSysEventType.PANIC);
94 public boolean isTrouble() {
95 return (this.type == PowermaxSysEventType.TROUBLE);
98 public boolean isRestore() {
99 return (this.type == PowermaxSysEventType.RESTORE);
102 public boolean isGeneralRestore() {
103 return (this.type == PowermaxSysEventType.GENERAL_RESTORE);
106 public boolean isCancel() {
107 return (this.type == PowermaxSysEventType.CANCEL);
110 public boolean isReset() {
111 return (this.type == PowermaxSysEventType.RESET);
115 public String toString() {
120 // Important note: in all of the following lists, each entry line ends
121 // with an empty "//" comment. This is to prevent the "spotless" code
122 // formatter from trying to wrap these lines in a way that makes them
123 // much less readable.
125 private static final PowermaxSysEvent UNKNOWN_SYSTEM_EVENT = PowermaxSysEvent.of("UNKNOWN");
127 private static final Map<Integer, PowermaxSysEvent> SYSTEM_EVENTS = Map.ofEntries( //
128 entry(0x00, PowermaxSysEvent.of("None")), //
129 entry(0x01, PowermaxSysEvent.of("Interior Alarm", PowermaxSysEventType.ALARM)), //
130 entry(0x02, PowermaxSysEvent.of("Perimeter Alarm", PowermaxSysEventType.ALARM)), //
131 entry(0x03, PowermaxSysEvent.of("Delay Alarm", PowermaxSysEventType.ALARM)), //
132 entry(0x04, PowermaxSysEvent.of("24h Silent Alarm", PowermaxSysEventType.SILENT_ALARM)), //
133 entry(0x05, PowermaxSysEvent.of("24h Audible Alarm", PowermaxSysEventType.ALARM)), //
134 entry(0x06, PowermaxSysEvent.of("Tamper", PowermaxSysEventType.ALERT)), //
135 entry(0x07, PowermaxSysEvent.of("Control Panel Tamper", PowermaxSysEventType.ALARM)), //
136 entry(0x08, PowermaxSysEvent.of("Tamper Alarm", PowermaxSysEventType.ALARM)), //
137 entry(0x09, PowermaxSysEvent.of("Tamper Alarm", PowermaxSysEventType.TROUBLE)), //
138 entry(0x0A, PowermaxSysEvent.of("Communication Loss", PowermaxSysEventType.ALARM)), //
139 entry(0x0B, PowermaxSysEvent.of("Panic From KeyKeyfob", PowermaxSysEventType.PANIC)), //
140 entry(0x0C, PowermaxSysEvent.of("Panic From Control Panel", PowermaxSysEventType.PANIC)), //
141 entry(0x0D, PowermaxSysEvent.of("Duress", PowermaxSysEventType.SILENT_ALARM)), //
142 entry(0x0E, PowermaxSysEvent.of("Confirm Alarm", PowermaxSysEventType.ALARM)), //
143 entry(0x0F, PowermaxSysEvent.of("General Trouble", PowermaxSysEventType.TROUBLE)), //
144 entry(0x10, PowermaxSysEvent.of("General Trouble Restore", PowermaxSysEventType.RESTORE, 0x0F)), //
145 entry(0x11, PowermaxSysEvent.of("Interior Restore")), //
146 entry(0x12, PowermaxSysEvent.of("Perimeter Restore")), //
147 entry(0x13, PowermaxSysEvent.of("Delay Restore")), //
148 entry(0x14, PowermaxSysEvent.of("24h Silent Restore")), //
149 entry(0x15, PowermaxSysEvent.of("24h Audible Restore")), //
150 entry(0x16, PowermaxSysEvent.of("Tamper Restore", PowermaxSysEventType.RESTORE, 0x06)), //
151 entry(0x17, PowermaxSysEvent.of("Control Panel Tamper Restore")), //
152 entry(0x18, PowermaxSysEvent.of("Tamper Restore")), //
153 entry(0x19, PowermaxSysEvent.of("Tamper Restore")), //
154 entry(0x1A, PowermaxSysEvent.of("Communication Restore")), //
155 entry(0x1B, PowermaxSysEvent.of("Cancel Alarm", PowermaxSysEventType.CANCEL)), //
156 entry(0x1C, PowermaxSysEvent.of("General Restore", PowermaxSysEventType.GENERAL_RESTORE)), //
157 entry(0x1D, PowermaxSysEvent.of("Trouble Restore")), //
158 entry(0x1E, PowermaxSysEvent.of("Not used")), //
159 entry(0x1F, PowermaxSysEvent.of("Recent Close")), //
160 entry(0x20, PowermaxSysEvent.of("Fire", PowermaxSysEventType.ALARM)), //
161 entry(0x21, PowermaxSysEvent.of("Fire Restore")), //
162 entry(0x22, PowermaxSysEvent.of("No Activity", PowermaxSysEventType.ALERT)), //
163 entry(0x23, PowermaxSysEvent.of("Emergency", PowermaxSysEventType.ALERT)), //
164 entry(0x24, PowermaxSysEvent.of("Not used")), //
165 entry(0x25, PowermaxSysEvent.of("Disarm Latchkey", PowermaxSysEventType.ALERT)), //
166 entry(0x26, PowermaxSysEvent.of("Panic Restore")), //
167 entry(0x27, PowermaxSysEvent.of("Supervision (Inactive)", PowermaxSysEventType.TROUBLE)), //
168 entry(0x28, PowermaxSysEvent.of("Supervision Restore (Active)", PowermaxSysEventType.RESTORE, 0x27)), //
169 entry(0x29, PowermaxSysEvent.of("Low Battery", PowermaxSysEventType.TROUBLE)), //
170 entry(0x2A, PowermaxSysEvent.of("Low Battery Restore", PowermaxSysEventType.RESTORE, 0x29)), //
171 entry(0x2B, PowermaxSysEvent.of("AC Fail", PowermaxSysEventType.TROUBLE)), //
172 entry(0x2C, PowermaxSysEvent.of("AC Restore", PowermaxSysEventType.RESTORE, 0x2B)), //
173 entry(0x2D, PowermaxSysEvent.of("Control Panel Low Battery", PowermaxSysEventType.TROUBLE)), //
174 entry(0x2E, PowermaxSysEvent.of("Control Panel Low Battery Restore", PowermaxSysEventType.RESTORE, 0x2D)), //
175 entry(0x2F, PowermaxSysEvent.of("RF Jamming", PowermaxSysEventType.TROUBLE)), //
176 entry(0x30, PowermaxSysEvent.of("RF Jamming Restore", PowermaxSysEventType.RESTORE, 0x2F)), //
177 entry(0x31, PowermaxSysEvent.of("Communications Failure", PowermaxSysEventType.TROUBLE)), //
178 entry(0x32, PowermaxSysEvent.of("Communications Restore", PowermaxSysEventType.RESTORE, 0x31)), //
179 entry(0x33, PowermaxSysEvent.of("Telephone Line Failure", PowermaxSysEventType.TROUBLE)), //
180 entry(0x34, PowermaxSysEvent.of("Telephone Line Restore", PowermaxSysEventType.RESTORE, 0x33)), //
181 entry(0x35, PowermaxSysEvent.of("Auto Test")), //
182 entry(0x36, PowermaxSysEvent.of("Fuse Failure", PowermaxSysEventType.TROUBLE)), //
183 entry(0x37, PowermaxSysEvent.of("Fuse Restore", PowermaxSysEventType.RESTORE, 0x36)), //
184 entry(0x38, PowermaxSysEvent.of("KeyKeyfob Low Battery", PowermaxSysEventType.TROUBLE)), //
185 entry(0x39, PowermaxSysEvent.of("KeyKeyfob Low Battery Restore", PowermaxSysEventType.RESTORE, 0x38)), //
186 entry(0x3A, PowermaxSysEvent.of("Engineer Reset")), //
187 entry(0x3B, PowermaxSysEvent.of("Battery Disconnect")), //
188 entry(0x3C, PowermaxSysEvent.of("1-Way Keypad Low Battery", PowermaxSysEventType.TROUBLE)), //
189 entry(0x3D, PowermaxSysEvent.of("1-Way Keypad Low Battery Restore", PowermaxSysEventType.RESTORE, 0x3C)), //
190 entry(0x3E, PowermaxSysEvent.of("1-Way Keypad Inactive", PowermaxSysEventType.TROUBLE)), //
191 entry(0x3F, PowermaxSysEvent.of("1-Way Keypad Restore Active", PowermaxSysEventType.RESTORE, 0x3E)), //
192 entry(0x40, PowermaxSysEvent.of("Low Battery")), //
193 entry(0x41, PowermaxSysEvent.of("Clean Me", PowermaxSysEventType.TROUBLE)), //
194 entry(0x42, PowermaxSysEvent.of("Fire Trouble", PowermaxSysEventType.TROUBLE)), //
195 entry(0x43, PowermaxSysEvent.of("Low Battery", PowermaxSysEventType.TROUBLE)), //
196 entry(0x44, PowermaxSysEvent.of("Battery Restore", PowermaxSysEventType.RESTORE, 0x43)), //
197 entry(0x45, PowermaxSysEvent.of("AC Fail", PowermaxSysEventType.TROUBLE)), //
198 entry(0x46, PowermaxSysEvent.of("AC Restore", PowermaxSysEventType.RESTORE, 0x45)), //
199 entry(0x47, PowermaxSysEvent.of("Supervision (Inactive)", PowermaxSysEventType.TROUBLE)), //
200 entry(0x48, PowermaxSysEvent.of("Supervision Restore (Active)", PowermaxSysEventType.RESTORE, 0x47)), //
201 entry(0x49, PowermaxSysEvent.of("Gas Alert", PowermaxSysEventType.ALARM)), //
202 entry(0x4A, PowermaxSysEvent.of("Gas Alert Restore")), //
203 entry(0x4B, PowermaxSysEvent.of("Gas Trouble", PowermaxSysEventType.TROUBLE)), //
204 entry(0x4C, PowermaxSysEvent.of("Gas Trouble Restore", PowermaxSysEventType.RESTORE, 0x4B)), //
205 entry(0x4D, PowermaxSysEvent.of("Flood Alert", PowermaxSysEventType.ALARM)), //
206 entry(0x4E, PowermaxSysEvent.of("Flood Alert Restore")), //
207 entry(0x4F, PowermaxSysEvent.of("X-10 Trouble", PowermaxSysEventType.TROUBLE)), //
208 entry(0x50, PowermaxSysEvent.of("X-10 Trouble Restore", PowermaxSysEventType.RESTORE, 0x4F)), //
209 entry(0x51, PowermaxSysEvent.of("Arm Home")), //
210 entry(0x52, PowermaxSysEvent.of("Arm Away")), //
211 entry(0x53, PowermaxSysEvent.of("Quick Arm Home")), //
212 entry(0x54, PowermaxSysEvent.of("Quick Arm Away")), //
213 entry(0x55, PowermaxSysEvent.of("Disarm")), //
214 entry(0x56, PowermaxSysEvent.of("Fail To Auto-Arm")), //
215 entry(0x57, PowermaxSysEvent.of("Enter To Test Mode")), //
216 entry(0x58, PowermaxSysEvent.of("Exit From Test Mode")), //
217 entry(0x59, PowermaxSysEvent.of("Force Arm")), //
218 entry(0x5A, PowermaxSysEvent.of("Auto Arm")), //
219 entry(0x5B, PowermaxSysEvent.of("Instant Arm")), //
220 entry(0x5C, PowermaxSysEvent.of("Bypass")), //
221 entry(0x5D, PowermaxSysEvent.of("Fail To Arm")), //
222 entry(0x5E, PowermaxSysEvent.of("Door Open")), //
223 entry(0x5F, PowermaxSysEvent.of("Communication Established By Control Panel")), //
224 entry(0x60, PowermaxSysEvent.of("System Reset", PowermaxSysEventType.RESET)), //
225 entry(0x61, PowermaxSysEvent.of("Installer Programming")), //
226 entry(0x62, PowermaxSysEvent.of("Wrong Password")), //
227 entry(0x63, PowermaxSysEvent.of("Not Sys Event")), //
228 entry(0x64, PowermaxSysEvent.of("Not Sys Event")), //
229 entry(0x65, PowermaxSysEvent.of("Extreme Hot Alert")), //
230 entry(0x66, PowermaxSysEvent.of("Extreme Hot Alert Restore")), //
231 entry(0x67, PowermaxSysEvent.of("Freeze Alert")), //
232 entry(0x68, PowermaxSysEvent.of("Freeze Alert Restore")), //
233 entry(0x69, PowermaxSysEvent.of("Human Cold Alert")), //
234 entry(0x6A, PowermaxSysEvent.of("Human Cold Alert Restore")), //
235 entry(0x6B, PowermaxSysEvent.of("Human Hot Alert")), //
236 entry(0x6C, PowermaxSysEvent.of("Human Hot Alert Restore")), //
237 entry(0x6D, PowermaxSysEvent.of("Temperature Sensor Trouble")), //
238 entry(0x6E, PowermaxSysEvent.of("Temperature Sensor Trouble Restore")), //
239 entry(0x6F, PowermaxSysEvent.of("PIR Mask")), //
240 entry(0x70, PowermaxSysEvent.of("PIR Mask Restore")), //
241 entry(0x7B, PowermaxSysEvent.of("Alarmed")), //
242 entry(0x7C, PowermaxSysEvent.of("Restore")), //
243 entry(0x7D, PowermaxSysEvent.of("Alarmed")), //
244 entry(0x7E, PowermaxSysEvent.of("Restore")), //
245 entry(0x8E, PowermaxSysEvent.of("Exit Installer")), //
246 entry(0x8F, PowermaxSysEvent.of("Enter Installer")) //
250 * System event lookup
252 public static PowermaxSysEvent getSystemEvent(int code) {
253 return SYSTEM_EVENTS.getOrDefault(code, UNKNOWN_SYSTEM_EVENT);
258 private static final Map<Integer, String> ZONES_OR_USERS = Map.ofEntries( //
259 entry(0x00, "System"), //
260 entry(0x01, "Zone 1"), //
261 entry(0x02, "Zone 2"), //
262 entry(0x03, "Zone 3"), //
263 entry(0x04, "Zone 4"), //
264 entry(0x05, "Zone 5"), //
265 entry(0x06, "Zone 6"), //
266 entry(0x07, "Zone 7"), //
267 entry(0x08, "Zone 8"), //
268 entry(0x09, "Zone 9"), //
269 entry(0x0A, "Zone 10"), //
270 entry(0x0B, "Zone 11"), //
271 entry(0x0C, "Zone 12"), //
272 entry(0x0D, "Zone 13"), //
273 entry(0x0E, "Zone 14"), //
274 entry(0x0F, "Zone 15"), //
275 entry(0x10, "Zone 16"), //
276 entry(0x11, "Zone 17"), //
277 entry(0x12, "Zone 18"), //
278 entry(0x13, "Zone 19"), //
279 entry(0x14, "Zone 20"), //
280 entry(0x15, "Zone 21"), //
281 entry(0x16, "Zone 22"), //
282 entry(0x17, "Zone 23"), //
283 entry(0x18, "Zone 24"), //
284 entry(0x19, "Zone 25"), //
285 entry(0x1A, "Zone 26"), //
286 entry(0x1B, "Zone 27"), //
287 entry(0x1C, "Zone 28"), //
288 entry(0x1D, "Zone 29"), //
289 entry(0x1E, "Zone 30"), //
290 entry(0x1F, "Keyfob 1"), //
291 entry(0x20, "Keyfob 2"), //
292 entry(0x21, "Keyfob 3"), //
293 entry(0x22, "Keyfob 4"), //
294 entry(0x23, "Keyfob 5"), //
295 entry(0x24, "Keyfob 6"), //
296 entry(0x25, "Keyfob 7"), //
297 entry(0x26, "Keyfob 8"), //
298 entry(0x27, "User 1"), //
299 entry(0x28, "User 2"), //
300 entry(0x29, "User 3"), //
301 entry(0x2A, "User 4"), //
302 entry(0x2B, "User 5"), //
303 entry(0x2C, "User 6"), //
304 entry(0x2D, "User 7"), //
305 entry(0x2E, "User 8"), //
306 entry(0x2F, "Wireless Commander 1"), //
307 entry(0x30, "Wireless Commander 2"), //
308 entry(0x31, "Wireless Commander 3"), //
309 entry(0x32, "Wireless Commander 4"), //
310 entry(0x33, "Wireless Commander 5"), //
311 entry(0x34, "Wireless Commander 6"), //
312 entry(0x35, "Wireless Commander 7"), //
313 entry(0x36, "Wireless Commander 8"), //
314 entry(0x37, "Wireless Siren 1"), //
315 entry(0x38, "Wireless Siren 2"), //
316 entry(0x39, "Two-Way Wireless Keypad 1"), //
317 entry(0x3A, "Two-Way Wireless Keypad 2"), //
318 entry(0x3B, "Two-Way Wireless Keypad 3"), //
319 entry(0x3C, "Two-Way Wireless Keypad 4"), //
320 entry(0x3D, "X10 1"), //
321 entry(0x3E, "X10 2"), //
322 entry(0x3F, "X10 3"), //
323 entry(0x40, "X10 4"), //
324 entry(0x41, "X10 5"), //
325 entry(0x42, "X10 6"), //
326 entry(0x43, "X10 7"), //
327 entry(0x44, "X10 8"), //
328 entry(0x45, "X10 9"), //
329 entry(0x46, "X10 10"), //
330 entry(0x47, "X10 11"), //
331 entry(0x48, "X10 12"), //
332 entry(0x49, "X10 13"), //
333 entry(0x4A, "X10 14"), //
334 entry(0x4B, "X10 15"), //
335 entry(0x4C, "PGM"), //
336 entry(0x4D, "GSM"), //
337 entry(0x4E, "Powerlink"), //
338 entry(0x4F, "Proxy Tag 1"), //
339 entry(0x50, "Proxy Tag 2"), //
340 entry(0x51, "Proxy Tag 3"), //
341 entry(0x52, "Proxy Tag 4"), //
342 entry(0x53, "Proxy Tag 5"), //
343 entry(0x54, "Proxy Tag 6"), //
344 entry(0x55, "Proxy Tag 7"), //
345 entry(0x56, "Proxy Tag 8") //
351 public static String getZoneOrUser(int code) {
352 return ZONES_OR_USERS.getOrDefault(code, "UNKNOWN");
357 private static final Map<Integer, String> ZONE_EVENTS = Map.ofEntries( //
358 entry(0x00, "None"), //
359 entry(0x01, "Tamper Alarm"), //
360 entry(0x02, "Tamper Restore"), //
361 entry(0x03, "Open"), //
362 entry(0x04, "Closed"), //
363 entry(0x05, "Violated (Motion)"), //
364 entry(0x06, "Panic Alarm"), //
365 entry(0x07, "RF Jamming"), //
366 entry(0x08, "Tamper Open"), //
367 entry(0x09, "Communication Failure"), //
368 entry(0x0A, "Line Failure"), //
369 entry(0x0B, "Fuse"), //
370 entry(0x0C, "Not Active"), //
371 entry(0x0D, "Low Battery"), //
372 entry(0x0E, "AC Failure"), //
373 entry(0x0F, "Fire Alarm"), //
374 entry(0x10, "Emergency"), //
375 entry(0x11, "Siren Tamper"), //
376 entry(0x12, "Siren Tamper Restore"), //
377 entry(0x13, "Siren Low Battery"), //
378 entry(0x14, "Siren AC Fail") //
384 public static String getZoneEvent(int code) {
385 return ZONE_EVENTS.getOrDefault(code, "UNKNOWN");
390 private static final Map<Integer, String> ZONE_EVENT_TYPES = Map.ofEntries( //
391 entry(0x00, "None"), //
392 entry(0x01, "Alarm Message"), //
393 entry(0x02, "Open/Battery Message"), //
394 entry(0x03, "Inactive/Tamper Message"), //
395 entry(0x04, "Zone Message"), //
396 entry(0x06, "Enroll/Bypass Message") //
400 * Message type lookup
402 public static String getZoneEventType(int code) {
403 return ZONE_EVENT_TYPES.getOrDefault(code, "UNKNOWN");