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