import static org.openhab.binding.ipcamera.internal.IpCameraBindingConstants.*;
import java.util.List;
+import java.util.regex.Pattern;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
public class DahuaHandler extends ChannelDuplexHandler {
private IpCameraHandler ipCameraHandler;
private int nvrChannel;
+ private Pattern boundaryPattern;
public DahuaHandler(IpCameraHandler handler, int nvrChannel) {
ipCameraHandler = handler;
this.nvrChannel = nvrChannel;
+ boundaryPattern = Pattern.compile("^-- ?myboundary$", Pattern.MULTILINE);
}
private void processEvent(String content) {
- int startIndex = content.indexOf("Code=", 12) + 5;// skip --myboundary and Code=
+ int startIndex = content.indexOf("Code=") + 5;// skip Code=
int endIndex = content.indexOf(";", startIndex + 1);
if (startIndex == -1 || endIndex == -1) {
ipCameraHandler.logger.debug("Code= not found in Dahua event. Content was:{}", content);
}
}
+ private void processSettings(String content) {
+ // determine if the motion detection is turned on or off.
+ if (content.contains("table.MotionDetect[0].Enable=true")) {
+ ipCameraHandler.setChannelState(CHANNEL_ENABLE_MOTION_ALARM, OnOffType.ON);
+ } else if (content.contains("table.MotionDetect[" + nvrChannel + "].Enable=false")) {
+ ipCameraHandler.setChannelState(CHANNEL_ENABLE_MOTION_ALARM, OnOffType.OFF);
+ }
+
+ // determine if the audio alarm is turned on or off.
+ if (content.contains("table.AudioDetect[0].MutationDetect=true")) {
+ ipCameraHandler.setChannelState(CHANNEL_ENABLE_AUDIO_ALARM, OnOffType.ON);
+ } else if (content.contains("table.AudioDetect[0].MutationDetect=false")) {
+ ipCameraHandler.setChannelState(CHANNEL_ENABLE_AUDIO_ALARM, OnOffType.OFF);
+ }
+
+ // Handle AudioMutationThreshold alarm
+ if (content.contains("table.AudioDetect[0].MutationThreold=")) {
+ String value = ipCameraHandler.returnValueFromString(content, "table.AudioDetect[0].MutationThreold=");
+ ipCameraHandler.setChannelState(CHANNEL_THRESHOLD_AUDIO_ALARM, PercentType.valueOf(value));
+ }
+
+ // CrossLineDetection alarm on/off
+ if (content.contains("table.VideoAnalyseRule[0][1].Enable=true")) {
+ ipCameraHandler.setChannelState(CHANNEL_ENABLE_LINE_CROSSING_ALARM, OnOffType.ON);
+ } else if (content.contains("table.VideoAnalyseRule[0][1].Enable=false")) {
+ ipCameraHandler.setChannelState(CHANNEL_ENABLE_LINE_CROSSING_ALARM, OnOffType.OFF);
+ }
+ // Privacy Mode on/off
+ if (content.contains("table.LeLensMask[0].Enable=true")) {
+ ipCameraHandler.setChannelState(CHANNEL_ENABLE_PRIVACY_MODE, OnOffType.ON);
+ } else if (content.contains("table.LeLensMask[0].Enable=false")) {
+ ipCameraHandler.setChannelState(CHANNEL_ENABLE_PRIVACY_MODE, OnOffType.OFF);
+ }
+ }
+
// This handles the incoming http replies back from the camera.
@Override
public void channelRead(@Nullable ChannelHandlerContext ctx, @Nullable Object msg) throws Exception {
}
try {
String content = msg.toString();
- if (content.startsWith("--myboundary") || content.startsWith("-- myboundary")) {
- processEvent(content);
- return;
- }
ipCameraHandler.logger.trace("HTTP Result back from camera is \t:{}:", content);
- // determine if the motion detection is turned on or off.
- if (content.contains("table.MotionDetect[0].Enable=true")) {
- ipCameraHandler.setChannelState(CHANNEL_ENABLE_MOTION_ALARM, OnOffType.ON);
- } else if (content.contains("table.MotionDetect[" + nvrChannel + "].Enable=false")) {
- ipCameraHandler.setChannelState(CHANNEL_ENABLE_MOTION_ALARM, OnOffType.OFF);
- }
-
- // determine if the audio alarm is turned on or off.
- if (content.contains("table.AudioDetect[0].MutationDetect=true")) {
- ipCameraHandler.setChannelState(CHANNEL_ENABLE_AUDIO_ALARM, OnOffType.ON);
- } else if (content.contains("table.AudioDetect[0].MutationDetect=false")) {
- ipCameraHandler.setChannelState(CHANNEL_ENABLE_AUDIO_ALARM, OnOffType.OFF);
- }
-
- // Handle AudioMutationThreshold alarm
- if (content.contains("table.AudioDetect[0].MutationThreold=")) {
- String value = ipCameraHandler.returnValueFromString(content, "table.AudioDetect[0].MutationThreold=");
- ipCameraHandler.setChannelState(CHANNEL_THRESHOLD_AUDIO_ALARM, PercentType.valueOf(value));
- }
-
- // CrossLineDetection alarm on/off
- if (content.contains("table.VideoAnalyseRule[0][1].Enable=true")) {
- ipCameraHandler.setChannelState(CHANNEL_ENABLE_LINE_CROSSING_ALARM, OnOffType.ON);
- } else if (content.contains("table.VideoAnalyseRule[0][1].Enable=false")) {
- ipCameraHandler.setChannelState(CHANNEL_ENABLE_LINE_CROSSING_ALARM, OnOffType.OFF);
- }
- // Privacy Mode on/off
- if (content.contains("table.LeLensMask[0].Enable=true")) {
- ipCameraHandler.setChannelState(CHANNEL_ENABLE_PRIVACY_MODE, OnOffType.ON);
- } else if (content.contains("table.LeLensMask[0].Enable=false")) {
- ipCameraHandler.setChannelState(CHANNEL_ENABLE_PRIVACY_MODE, OnOffType.OFF);
+ String[] events = boundaryPattern.split(content);
+ if (events.length > 1) {
+ for (int i = 1; i < events.length; i++) {
+ processEvent(events[i]);
+ }
+ } else {
+ processSettings(content);
}
} finally {
ReferenceCountUtil.release(msg);