Skip to content

Commit 6718e2e

Browse files
committed
Add DisplayTextOnLedScreen and SystemTroubleStatusReply Messages
Signed-off-by: Matt Myers <[email protected]>
1 parent 83e120e commit 6718e2e

File tree

8 files changed

+180
-43
lines changed

8 files changed

+180
-43
lines changed

bundles/org.openhab.binding.elkm1/src/main/java/org/openhab/binding/elkm1/internal/elk/ElkAlarmConnection.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,11 @@ public void shutdown() {
184184
*/
185185
public void sendCommand(ElkMessage message) {
186186
synchronized (toSend) {
187-
this.toSend.add(message);
187+
if (message.validElkCommand) {
188+
this.toSend.add(message);
189+
} else {
190+
logger.error("Invalid Command not sent");
191+
}
188192
}
189193

190194
if (!sentSomething) {

bundles/org.openhab.binding.elkm1/src/main/java/org/openhab/binding/elkm1/internal/elk/ElkCommand.java

+2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public enum ElkCommand {
4444
ControlOutputOn("cn"),
4545
CustomValueReply("CR"),
4646
OutputStatusReply("CS"),
47+
DisplayTextOnLedScreen("dm"),
4748
EntryExitData("EE"),
4849
SendEmailTrigger("EM"),
4950
ValidOrInvalidUserCode("IC"),
@@ -54,6 +55,7 @@ public enum ElkCommand {
5455
StringTextDescription("sd"),
5556
StringTextDescriptionReply("SD"),
5657
SpeakPhraseAtVoiceOutput("sp"),
58+
SystemTroubleStatusReply("ss"),
5759
TemperatureReply("ST"),
5860
SpeakWordAtVoiceOutput("sw"),
5961
TaskChangeUpdate("TC"),

bundles/org.openhab.binding.elkm1/src/main/java/org/openhab/binding/elkm1/internal/elk/ElkMessage.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,20 @@
1212
*/
1313
package org.openhab.binding.elkm1.internal.elk;
1414

15-
import org.eclipse.jdt.annotation.NonNullByDefault;
16-
1715
/**
1816
* The basic default elk message that everything else will use as a base.
1917
*
2018
* @author David Bennett - Initial Contribution
2119
*/
22-
@NonNullByDefault
20+
// @NonNullByDefault
2321
public abstract class ElkMessage {
2422
// Has the two char message type in it.
2523
private final ElkCommand command;
24+
public boolean validElkCommand;
2625

2726
public ElkMessage(ElkCommand command) {
2827
this.command = command;
28+
this.validElkCommand = true;
2929
}
3030

3131
public ElkCommand getElkCommand() {

bundles/org.openhab.binding.elkm1/src/main/java/org/openhab/binding/elkm1/internal/elk/ElkMessageFactory.java

+17-14
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.openhab.binding.elkm1.internal.elk.message.ReplyRealTimeClock;
2323
import org.openhab.binding.elkm1.internal.elk.message.SendEmailTrigger;
2424
import org.openhab.binding.elkm1.internal.elk.message.StringTextDescriptionReply;
25+
import org.openhab.binding.elkm1.internal.elk.message.SystemTroubleStatusReply;
2526
import org.openhab.binding.elkm1.internal.elk.message.ValidOrInvalidUserCode;
2627
import org.openhab.binding.elkm1.internal.elk.message.VersionReply;
2728
import org.openhab.binding.elkm1.internal.elk.message.ZoneChangeUpdate;
@@ -51,12 +52,28 @@ public ElkMessage createMessage(String input) {
5152
}
5253
// Figure out the elk message to create.
5354
switch (input.substring(2, 4)) {
55+
case "AM":
56+
return new AlarmMemory(data.data);
5457
case "AS":
5558
return new ArmingStatusReply(data.getData());
5659
case "AZ":
5760
return new AlarmZoneReply(data.data);
61+
case "CC":
62+
return new OutputChangeUpdate(data.data);
63+
case "EE":
64+
return new EntryExitData(data.data);
65+
case "EM":
66+
return new SendEmailTrigger(data.data);
67+
case "IC":
68+
return new ValidOrInvalidUserCode(data.data);
69+
case "KC":
70+
return new KeypadKeyChangeUpdate(data.data);
71+
case "RR":
72+
return new ReplyRealTimeClock(data.data);
5873
case "SD":
5974
return new StringTextDescriptionReply(data.data);
75+
case "SS":
76+
return new SystemTroubleStatusReply(data.data);
6077
case "VN":
6178
return new VersionReply(data.data);
6279
case "XK":
@@ -69,20 +86,6 @@ public ElkMessage createMessage(String input) {
6986
return new ZonePartitionReply(data.data);
7087
case "ZS":
7188
return new ZoneStatusReply(data.data);
72-
case "KC":
73-
return new KeypadKeyChangeUpdate(data.data);
74-
case "AM":
75-
return new AlarmMemory(data.data);
76-
case "CC":
77-
return new OutputChangeUpdate(data.data);
78-
case "EM":
79-
return new SendEmailTrigger(data.data);
80-
case "IC":
81-
return new ValidOrInvalidUserCode(data.data);
82-
case "EE":
83-
return new EntryExitData(data.data);
84-
case "RR":
85-
return new ReplyRealTimeClock(data.data);
8689
}
8790
return null;
8891
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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.elkm1.internal.elk.message;
14+
15+
import org.openhab.binding.elkm1.internal.elk.ElkCommand;
16+
import org.openhab.binding.elkm1.internal.elk.ElkMessage;
17+
import org.slf4j.Logger;
18+
import org.slf4j.LoggerFactory;
19+
20+
/**
21+
* The Send Elk Command class, to put the elk into armed away mode.
22+
*
23+
* @author Matt Myers - Initial Contribution
24+
*
25+
*/
26+
public class DisplayTextOnLedScreen extends ElkMessage {
27+
private final Logger logger = LoggerFactory.getLogger(DisplayTextOnLedScreen.class);
28+
private int keypadArea;
29+
private int messageClear;
30+
private int beep;
31+
private int timeToDisplay;
32+
private String line1;
33+
private String line2;
34+
35+
public DisplayTextOnLedScreen(String command) throws Exception {
36+
super(ElkCommand.DisplayTextOnLedScreen);
37+
38+
if (command.length() != 42) {
39+
this.validElkCommand = false;
40+
logger.error("Invalid Command length of {}: {}", command.length(), command);
41+
return;
42+
}
43+
44+
String keypadArea = command.substring(2, 3);
45+
String messageClear = command.substring(3, 4);
46+
String beep = command.substring(4, 5);
47+
String timeToDisplay = command.substring(5, 10);
48+
String line1 = command.substring(10, 26);
49+
String line2 = command.substring(26, 42);
50+
51+
this.keypadArea = Integer.valueOf(keypadArea);
52+
if (this.keypadArea < 1 || this.keypadArea > 8) {
53+
this.validElkCommand = false;
54+
}
55+
56+
this.messageClear = Integer.valueOf(messageClear);
57+
if (this.messageClear < 0 || this.messageClear > 2) {
58+
this.validElkCommand = false;
59+
}
60+
61+
this.beep = Integer.valueOf(beep);
62+
if (this.beep < 0 || this.beep > 1) {
63+
this.validElkCommand = false;
64+
}
65+
66+
this.timeToDisplay = Integer.valueOf(timeToDisplay);
67+
if (this.timeToDisplay < 0 || this.timeToDisplay > 65535) {
68+
this.validElkCommand = false;
69+
}
70+
71+
if (!this.validElkCommand) {
72+
logger.error("Invalid Command: {}", command);
73+
}
74+
75+
this.line1 = line1;
76+
this.line2 = line2;
77+
}
78+
79+
@Override
80+
public String getData() {
81+
return String.format("%01d", keypadArea) + String.format("%01d", messageClear) + String.format("%01d", beep)
82+
+ String.format("%05d", timeToDisplay) + line1 + line2;
83+
}
84+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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+
14+
package org.openhab.binding.elkm1.internal.elk.message;
15+
16+
import org.eclipse.jdt.annotation.NonNullByDefault;
17+
import org.openhab.binding.elkm1.internal.elk.ElkCommand;
18+
import org.openhab.binding.elkm1.internal.elk.ElkMessage;
19+
20+
/**
21+
* System trouble status is sent by Elk upon trouble status change
22+
*
23+
* @author Matt Myers - Initial Contribution
24+
*/
25+
@NonNullByDefault
26+
public class SystemTroubleStatusReply extends ElkMessage {
27+
28+
public SystemTroubleStatusReply(String incomingData) {
29+
super(ElkCommand.SystemTroubleStatusReply);
30+
}
31+
32+
@Override
33+
protected String getData() {
34+
return "";
35+
}
36+
}

bundles/org.openhab.binding.elkm1/src/main/java/org/openhab/binding/elkm1/internal/handler/ElkM1AreaHandler.java

+26-22
Original file line numberDiff line numberDiff line change
@@ -55,42 +55,46 @@ public void initialize() {
5555
*/
5656
@Override
5757
public void handleCommand(ChannelUID channelUID, Command command) {
58-
if (ElkM1BindingConstants.CHANNEL_AREA_ARMED.equals(channelUID.getId())) {
59-
if (command instanceof StringType) {
60-
StringType str = (StringType) command;
61-
ElkAlarmArmedState armed = ElkAlarmArmedState.valueOf(str.toString());
62-
@SuppressWarnings("null")
63-
ElkM1BridgeHandler bridgeHandler = (ElkM1BridgeHandler) getBridge().getHandler();
64-
65-
String zoneNo = getThing().getProperties().get(ElkM1BindingConstants.PROPERTY_ZONE_NUM);
66-
if (zoneNo != null) {
67-
int zone = Integer.valueOf(zoneNo);
68-
if (bridgeHandler != null) {
69-
bridgeHandler.updateArmedState(zone, armed);
58+
try {
59+
if (ElkM1BindingConstants.CHANNEL_AREA_ARMED.equals(channelUID.getId())) {
60+
if (command instanceof StringType) {
61+
StringType str = (StringType) command;
62+
ElkAlarmArmedState armed = ElkAlarmArmedState.valueOf(str.toString());
63+
@SuppressWarnings("null")
64+
ElkM1BridgeHandler bridgeHandler = (ElkM1BridgeHandler) getBridge().getHandler();
65+
String zoneNo = getThing().getProperties().get(ElkM1BindingConstants.PROPERTY_ZONE_NUM);
66+
if (zoneNo != null) {
67+
int zone = Integer.valueOf(zoneNo);
68+
if (bridgeHandler != null) {
69+
bridgeHandler.updateArmedState(zone, armed);
70+
}
7071
}
7172
}
7273
}
73-
}
7474

75-
else if (ElkM1BindingConstants.CHANNEL_AREA_COMMAND.equals(channelUID.getId())) {
76-
if (command instanceof StringType) {
77-
StringType str = (StringType) command;
78-
// Execute the command
79-
try {
75+
else if (ElkM1BindingConstants.CHANNEL_AREA_COMMAND.equals(channelUID.getId())) {
76+
if (command instanceof StringType) {
77+
StringType str = (StringType) command;
78+
// Execute the command
79+
// try {
8080
Bridge bridge = getBridge();
8181
if (bridge != null) {
8282
ElkM1BridgeHandler bridgeHandler = (ElkM1BridgeHandler) bridge.getHandler();
8383
if (bridgeHandler != null) {
8484
bridgeHandler.sendELKCommand(str.toString());
8585
}
8686
}
87-
} catch (Exception e) {
87+
// } catch (Exception e) {
88+
// logger.error("Error handling command: ", e);
89+
// }
8890
}
8991
}
90-
}
9192

92-
if (command instanceof RefreshType) {
93-
getElkM1BridgeHandler().refreshArea();
93+
if (command instanceof RefreshType) {
94+
getElkM1BridgeHandler().refreshArea();
95+
}
96+
} catch (Exception e) {
97+
logger.error("Error handling command: ", e);
9498
}
9599
}
96100

bundles/org.openhab.binding.elkm1/src/main/java/org/openhab/binding/elkm1/internal/handler/ElkM1BridgeHandler.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.openhab.binding.elkm1.internal.elk.message.ArmingStatus;
4242
import org.openhab.binding.elkm1.internal.elk.message.ArmingStatusReply;
4343
import org.openhab.binding.elkm1.internal.elk.message.Disarm;
44+
import org.openhab.binding.elkm1.internal.elk.message.DisplayTextOnLedScreen;
4445
import org.openhab.binding.elkm1.internal.elk.message.EthernetModuleTest;
4546
import org.openhab.binding.elkm1.internal.elk.message.EthernetModuleTestReply;
4647
import org.openhab.binding.elkm1.internal.elk.message.OutputOn;
@@ -352,7 +353,7 @@ public void refreshArea() {
352353
}
353354

354355
/**
355-
* Called when an area is added to ask for the defintion and details of it.
356+
* Called when an area is added to ask for the definition and details of it.
356357
*
357358
* @param elkM1AreaHandler The handler for the area that is added.
358359
*/
@@ -377,7 +378,7 @@ public void onZoneAdded(ElkM1ZoneHandler elkM1ZoneHandler) {
377378
* @param area The area to alarm
378379
* @param armed The state to set it to
379380
*/
380-
public void updateArmedState(int area, ElkAlarmArmedState armed) {
381+
public void updateArmedState(int area, ElkAlarmArmedState armed) throws Exception {
381382
ElkAlarmConfig config = getConfigAs(ElkAlarmConfig.class);
382383
String pincode = String.format("%06d", config.userCode);
383384
switch (armed) {
@@ -405,12 +406,15 @@ public void updateArmedState(int area, ElkAlarmArmedState armed) {
405406
}
406407
}
407408

408-
public void sendELKCommand(String commandString) {
409+
public void sendELKCommand(String commandString) throws Exception {
409410
ElkCommand messageType = ElkCommand.fromValue(commandString.substring(0, 2));
410411
switch (messageType) {
411412
case ControlOutputOn:
412413
connection.sendCommand(new OutputOn(commandString));
413414
break;
415+
case DisplayTextOnLedScreen:
416+
connection.sendCommand(new DisplayTextOnLedScreen(commandString));
417+
break;
414418
case SpeakPhraseAtVoiceOutput:
415419
connection.sendCommand(new SpeakPhraseAtVoiceOutput(
416420
ElkVoicePhrases.fromValue(Integer.parseInt(commandString.substring(2)))));

0 commit comments

Comments
 (0)