]> git.basschouten.com Git - openhab-addons.git/blob
f8562dd1ecb9b1e490962241087607c12471a778
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 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.ipcamera.internal;
14
15 import static org.openhab.binding.ipcamera.internal.IpCameraBindingConstants.*;
16
17 import java.util.ArrayList;
18
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.eclipse.jdt.annotation.Nullable;
21 import org.openhab.binding.ipcamera.internal.handler.IpCameraHandler;
22 import org.openhab.core.library.types.OnOffType;
23 import org.openhab.core.library.types.PercentType;
24 import org.openhab.core.library.types.StringType;
25 import org.openhab.core.thing.ChannelUID;
26 import org.openhab.core.thing.binding.ThingHandler;
27 import org.openhab.core.types.Command;
28 import org.openhab.core.types.RefreshType;
29
30 import io.netty.channel.ChannelDuplexHandler;
31 import io.netty.channel.ChannelHandlerContext;
32 import io.netty.util.ReferenceCountUtil;
33
34 /**
35  * The {@link InstarHandler} is responsible for handling commands, which are
36  * sent to one of the channels.
37  *
38  * @author Matthew Skinner - Initial contribution
39  */
40
41 @NonNullByDefault
42 public class InstarHandler extends ChannelDuplexHandler {
43     private IpCameraHandler ipCameraHandler;
44     private String requestUrl = "Empty";
45
46     public InstarHandler(ThingHandler thingHandler) {
47         ipCameraHandler = (IpCameraHandler) thingHandler;
48     }
49
50     public void setURL(String url) {
51         requestUrl = url;
52     }
53
54     // This handles the incoming http replies back from the camera.
55     @Override
56     public void channelRead(@Nullable ChannelHandlerContext ctx, @Nullable Object msg) throws Exception {
57         if (msg == null || ctx == null) {
58             return;
59         }
60         try {
61             String value1 = "";
62             String content = msg.toString();
63             ipCameraHandler.logger.trace("HTTP Result back from camera is \t:{}:", content);
64             switch (requestUrl) {
65                 case "/param.cgi?cmd=getinfrared":
66                     if (content.contains("var infraredstat=\"auto")) {
67                         ipCameraHandler.setChannelState(CHANNEL_AUTO_LED, OnOffType.ON);
68                     } else {
69                         ipCameraHandler.setChannelState(CHANNEL_AUTO_LED, OnOffType.OFF);
70                     }
71                     break;
72                 case "/param.cgi?cmd=getoverlayattr&-region=1":// Text Overlays
73                     if (content.contains("var show_1=\"0\"")) {
74                         ipCameraHandler.setChannelState(CHANNEL_TEXT_OVERLAY, StringType.EMPTY);
75                     } else {
76                         value1 = Helper.searchString(content, "var name_1=\"");
77                         if (!value1.isEmpty()) {
78                             ipCameraHandler.setChannelState(CHANNEL_TEXT_OVERLAY, StringType.valueOf(value1));
79                         }
80                     }
81                     break;
82                 case "/cgi-bin/hi3510/param.cgi?cmd=getmdattr":// Motion Alarm
83                     // Motion Alarm
84                     if (content.contains("var m1_enable=\"1\"")) {
85                         ipCameraHandler.setChannelState(CHANNEL_ENABLE_MOTION_ALARM, OnOffType.ON);
86                     } else {
87                         ipCameraHandler.setChannelState(CHANNEL_ENABLE_MOTION_ALARM, OnOffType.OFF);
88                     }
89                     break;
90                 case "/cgi-bin/hi3510/param.cgi?cmd=getaudioalarmattr":// Audio Alarm
91                     if (content.contains("var aa_enable=\"1\"")) {
92                         ipCameraHandler.setChannelState(CHANNEL_ENABLE_AUDIO_ALARM, OnOffType.ON);
93                         value1 = Helper.searchString(content, "var aa_value=\"");
94                         if (!value1.isEmpty()) {
95                             ipCameraHandler.setChannelState(CHANNEL_THRESHOLD_AUDIO_ALARM, PercentType.valueOf(value1));
96                         }
97                     } else {
98                         ipCameraHandler.setChannelState(CHANNEL_ENABLE_AUDIO_ALARM, OnOffType.OFF);
99                     }
100                     break;
101                 case "param.cgi?cmd=getpirattr":// PIR Alarm
102                     if (content.contains("var pir_enable=\"1\"")) {
103                         ipCameraHandler.setChannelState(CHANNEL_ENABLE_PIR_ALARM, OnOffType.ON);
104                     } else {
105                         ipCameraHandler.setChannelState(CHANNEL_ENABLE_PIR_ALARM, OnOffType.OFF);
106                     }
107                     // Reset the Alarm, need to find better place to put this.
108                     ipCameraHandler.noMotionDetected(CHANNEL_PIR_ALARM);
109                     break;
110                 case "/param.cgi?cmd=getioattr":// External Alarm Input
111                     if (content.contains("var io_enable=\"1\"")) {
112                         ipCameraHandler.setChannelState(CHANNEL_ENABLE_EXTERNAL_ALARM_INPUT, OnOffType.ON);
113                     } else {
114                         ipCameraHandler.setChannelState(CHANNEL_ENABLE_EXTERNAL_ALARM_INPUT, OnOffType.OFF);
115                     }
116                     break;
117             }
118         } finally {
119             ReferenceCountUtil.release(msg);
120         }
121     }
122
123     // This handles the commands that come from the Openhab event bus.
124     public void handleCommand(ChannelUID channelUID, Command command) {
125         if (command instanceof RefreshType) {
126             switch (channelUID.getId()) {
127                 case CHANNEL_MOTION_ALARM:
128                     if (ipCameraHandler.cameraConfig.getServerPort() > 0) {
129                         ipCameraHandler.logger.info("Setting up the Alarm Server settings in the camera now");
130                         ipCameraHandler.sendHttpGET(
131                                 "/param.cgi?cmd=setmdalarm&-aname=server2&-switch=on&-interval=1&cmd=setalarmserverattr&-as_index=3&-as_server="
132                                         + ipCameraHandler.hostIp + "&-as_port="
133                                         + ipCameraHandler.cameraConfig.getServerPort()
134                                         + "&-as_path=/instar&-as_queryattr1=&-as_queryval1=&-as_queryattr2=&-as_queryval2=&-as_queryattr3=&-as_queryval3=&-as_activequery=1&-as_auth=0&-as_query1=0&-as_query2=0&-as_query3=0");
135                         return;
136                     }
137             }
138             return;
139         } // end of "REFRESH"
140         switch (channelUID.getId()) {
141             case CHANNEL_THRESHOLD_AUDIO_ALARM:
142                 int value = Math.round(Float.valueOf(command.toString()));
143                 if (value == 0) {
144                     ipCameraHandler.sendHttpGET("/cgi-bin/hi3510/param.cgi?cmd=setaudioalarmattr&-aa_enable=0");
145                 } else {
146                     ipCameraHandler.sendHttpGET("/cgi-bin/hi3510/param.cgi?cmd=setaudioalarmattr&-aa_enable=1");
147                     ipCameraHandler
148                             .sendHttpGET("/cgi-bin/hi3510/param.cgi?cmd=setaudioalarmattr&-aa_enable=1&-aa_value="
149                                     + command.toString());
150                 }
151                 return;
152             case CHANNEL_ENABLE_AUDIO_ALARM:
153                 if (OnOffType.ON.equals(command)) {
154                     ipCameraHandler.sendHttpGET("/cgi-bin/hi3510/param.cgi?cmd=setaudioalarmattr&-aa_enable=1");
155                 } else {
156                     ipCameraHandler.sendHttpGET("/cgi-bin/hi3510/param.cgi?cmd=setaudioalarmattr&-aa_enable=0");
157                 }
158                 return;
159             case CHANNEL_ENABLE_MOTION_ALARM:
160                 if (OnOffType.ON.equals(command)) {
161                     ipCameraHandler.sendHttpGET(
162                             "/cgi-bin/hi3510/param.cgi?cmd=setmdattr&-enable=1&-name=1&cmd=setmdattr&-enable=1&-name=2&cmd=setmdattr&-enable=1&-name=3&cmd=setmdattr&-enable=1&-name=4");
163                 } else {
164                     ipCameraHandler.sendHttpGET(
165                             "/cgi-bin/hi3510/param.cgi?cmd=setmdattr&-enable=0&-name=1&cmd=setmdattr&-enable=0&-name=2&cmd=setmdattr&-enable=0&-name=3&cmd=setmdattr&-enable=0&-name=4");
166                 }
167                 return;
168             case CHANNEL_TEXT_OVERLAY:
169                 String text = Helper.encodeSpecialChars(command.toString());
170                 if (text.isEmpty()) {
171                     ipCameraHandler.sendHttpGET("/param.cgi?cmd=setoverlayattr&-region=1&-show=0");
172                 } else {
173                     ipCameraHandler.sendHttpGET("/param.cgi?cmd=setoverlayattr&-region=1&-show=1&-name=" + text);
174                 }
175                 return;
176             case CHANNEL_AUTO_LED:
177                 if (OnOffType.ON.equals(command)) {
178                     ipCameraHandler.sendHttpGET("/param.cgi?cmd=setinfrared&-infraredstat=auto");
179                 } else {
180                     ipCameraHandler.sendHttpGET("/param.cgi?cmd=setinfrared&-infraredstat=close");
181                 }
182                 return;
183             case CHANNEL_ENABLE_PIR_ALARM:
184                 if (OnOffType.ON.equals(command)) {
185                     ipCameraHandler.sendHttpGET("/param.cgi?cmd=setpirattr&-pir_enable=1");
186                 } else {
187                     ipCameraHandler.sendHttpGET("/param.cgi?cmd=setpirattr&-pir_enable=0");
188                 }
189                 return;
190             case CHANNEL_ENABLE_EXTERNAL_ALARM_INPUT:
191                 if (OnOffType.ON.equals(command)) {
192                     ipCameraHandler.sendHttpGET("/param.cgi?cmd=setioattr&-io_enable=1");
193                 } else {
194                     ipCameraHandler.sendHttpGET("/param.cgi?cmd=setioattr&-io_enable=0");
195                 }
196                 return;
197         }
198     }
199
200     void alarmTriggered(String alarm) {
201         ipCameraHandler.logger.debug("Alarm has been triggered:{}", alarm);
202         switch (alarm) {
203             case "/instar?&active=1":// The motion area boxes 1-4
204             case "/instar?&active=2":
205             case "/instar?&active=3":
206             case "/instar?&active=4":
207                 ipCameraHandler.motionDetected(CHANNEL_MOTION_ALARM);
208                 break;
209             case "/instar?&active=5":// PIR
210                 ipCameraHandler.motionDetected(CHANNEL_PIR_ALARM);
211                 break;
212             case "/instar?&active=6":// Audio Alarm
213                 ipCameraHandler.audioDetected();
214                 break;
215             case "/instar?&active=7":// Motion Area 1
216             case "/instar?&active=8":// Motion Area 2
217             case "/instar?&active=9":// Motion Area 3
218             case "/instar?&active=10":// Motion Area 4
219                 ipCameraHandler.motionDetected(CHANNEL_MOTION_ALARM);
220                 break;
221         }
222     }
223
224     // If a camera does not need to poll a request as often as snapshots, it can be
225     // added here. Binding steps through the list.
226     public ArrayList<String> getLowPriorityRequests() {
227         ArrayList<String> lowPriorityRequests = new ArrayList<String>(2);
228         lowPriorityRequests.add("/cgi-bin/hi3510/param.cgi?cmd=getaudioalarmattr");
229         lowPriorityRequests.add("/cgi-bin/hi3510/param.cgi?cmd=getmdattr");
230         lowPriorityRequests.add("/param.cgi?cmd=getinfrared");
231         lowPriorityRequests.add("/param.cgi?cmd=getoverlayattr&-region=1");
232         lowPriorityRequests.add("/param.cgi?cmd=getpirattr");
233         lowPriorityRequests.add("/param.cgi?cmd=getioattr"); // ext alarm input on/off
234         // lowPriorityRequests.add("/param.cgi?cmd=getserverinfo");
235         return lowPriorityRequests;
236     }
237 }