-
Notifications
You must be signed in to change notification settings - Fork 13
/
motionplus_examples.html
675 lines (635 loc) · 36.8 KB
/
motionplus_examples.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
<!DOCTYPE html>
<html lang="en-us">
<head>
<meta charset="UTF-8">
<link href="motionplus.png" rel="icon" type="image/png">
<title>MotionPlus</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="motionplus_stylesheet.css" media="screen">
<script>
function fnc_topnav() {
var x = document.getElementById("id_topnav");
if (x.className === "topnav") {
x.className += " responsive";
} else {
x.className = "topnav";
}
}
</script>
</head>
<body>
<div class="topnav" id="id_topnav">
<img class="logoimg" src="motionplus.gif">
<a class="topnav-d" href="https://motion-project.github.io/motion_support.html">Support</a>
<a class="topnav-d" href="https://motion-project.github.io/motion_news.html" >News</a>
<a class="topnav-d" href="https://motion-project.github.io/motion_guide.html" >Documentation</a>
<a class="topnav-d" href="https://motion-project.github.io/motion_download.html">Download</a>
<a class="topnav-d" href="https://motion-project.github.io/index.html">Home</a>
<a class="topnav-m" href="https://motion-project.github.io/index.html">Home</a>
<a class="topnav-m" href="https://motion-project.github.io/motion_download.html">Download</a>
<a class="topnav-m" href="https://motion-project.github.io/motion_guide.html" >Documentation</a>
<a class="topnav-m" href="https://motion-project.github.io/motion_news.html" >News</a>
<a class="topnav-m" href="https://motion-project.github.io/motion_support.html">Support</a>
<a href="javascript:void(0);" class="icon" onclick="fnc_topnav()">☰</a>
</div>
<section class="page-header">
<h1>
Examples
</h1>
</section>
<section class="main-content">
<h3><a name="Examples"></a> Examples</h3>
<ul>
The following provides some sample configuration options and examples for MotionPlus.
<li> <a href="#persistent_device"> Persistent v4l2 device name </a></li>
<li> <a href="#extpipe_commands"> Sample extpipe commands </a></li>
<li> <a href="#loopback_setup">Loopback device setup</a></li>
<li> <a href="#ffmpeg_input_device">FFmpeg as input device</a></li>
<li> <a href="#webcontrol_pages">Webcontrol pages</a></li>
<li> <a href="#database_setup">Database setup</a></li>
<li> <a href="#haar_setup">Haar setup</a></li>
<li> <a href="#hog_setup">HOG setup</a></li>
<li> <a href="#dnn_setup">DNN setup</a></li>
<li> <a href="#haar_train">Haar Model Training</a></li>
<li> <a href="#sound_sample">Sound Frequency Sample</a></li>
<li> <a href="#fail2ban">Fail2Ban example</a></li>
<li> <a href="#ptz">PTZ command examples</a></li>
<p></p>
<p></p>
</ul>
<p></p>
<p></p>
<h3><a name="persistent_device"></a> Persistent v4l2 device name </h3>
<ul>
Since the exact device number is set by the kernel upon boot, when there is more than one video device
it is possible that the particular cameras that were assigned to /dev/video0 and /dev/video1 may switch. In
order to set up Motion so that a particular camera is always assigned the same way, users can set up
a symbolic link using udev rules. To do this a unique attribute must be identified for each camera. The
camera attributes can be viewed by using the command
<code>udevadm info -a -p $(udevadm info -q path -n /dev/video0) </code> while the camera is attached. Usually
a serial number can be used. ("Usually" because some cameras have been observed to have the same serial
number for different cameras)
<p></p>
Once a unique attribute has been identified for each camera, edit or create the file
<code>/etc/udev/rules.d/99-local.rules</code>.
<p></p>
Assuming that the unique attribute for the camera was name and was
<code>ATTR{name}=="Philips SPC 900NC webcam"</code> you would add the following line to the
99-local.rules file:
<code> KERNEL=="video[0-9]*", ATTR{name}=="Philips\ SPC\ 900NC*", SYMLINK+="video-webcam0"</code>
<p></p>
Once the change has been made and saved, reboot the computer and there should now be a "sticky" device called
/dev/video-webcam0
<p></p>
</ul>
<h3><a name="extpipe_commands"></a>Sample extpipe commands</h3>
<ul>
The following are some sample extpipe commands
<p></p>
<code>
movie_extpipe mencoder -demuxer rawvideo -rawvideo w=%w:h=%h:i420 -ovc x264 -x264encopts bframes=4:frameref=1:subq=1:scenecut=-1:nob_adapt:threads=1:keyint=1000:8x8dct:vbv_bufsize=4000:crf=24:partitions=i8x8,i4x4:vbv_maxrate=800:no-chroma-me -vf denoise3d=16:12:48:4,pp=lb -of avi -o %f.avi - -fps %{fps}
</code>
<p></p>
<code>
movie_extpipe x264 - --input-res %wx%h --fps %{fps} --bitrate 2000 --preset ultrafast --quiet -o %f.mp4
</code>
<p></p>
<code>
movie_extpipe mencoder -demuxer rawvideo -rawvideo w=%w:h=%h:fps=%{fps} -ovc x264 -x264encopts preset=ultrafast -of lavf -o %f.mp4 - -fps %{fps}
</code>
<p></p>
<code>
movie_extpipe ffmpeg -y -f rawvideo -pix_fmt yuv420p -video_size %wx%h -framerate %{fps} -i pipe:0 -vcodec libx264 -preset ultrafast -f mp4 %f.mp4
</code>
<p></p>
</ul>
<h3><a name="loopback_setup"></a>Loopback device setup</h3>
<ul>
The video loopback device can be added installed via apt in many distributions. The package tested
with Motion is v4l2loopback-dkms. Once the package is installed, you just need to run
<code>sudo modprobe v4l2loopback</code>. This will add a new video device that you
can use for the loopback. It is believed that there are additional options associated with the
v4l2loopback that allows for adding more than one device. See the documentation of the v4l2loopback
project for additional details.
<p></p>
To activate the vloopback device in Motion set the 'video_pipe' option in the motion.conf file to the
device name associated with the one created by v4l2loopback.
<br />You can also view the special motion pictures where you see the changed pixels by setting the option
'video_pipe_motion' in motion.conf. When setting the video_pipe and/or video_pipe_motion options
specify the input device as e.g. /dev/video1.
<p></p>
De-activating should be done with this command
<p></p>
<code>sudo modprobe -r v4l2loopback</code>
<p></p>
</ul>
<h3><a name="ffmpeg_input_device"></a>Use ffmpeg as input device</h3>
<ul>
Sometimes the particular device is not function for MotionPlus but does work with FFmpeg. In
this situation the device can be setup to be used in MotionPlus using FFMpeg as an intermediate
application. The process would be to set up a loopback device and then have FFmpeg feed the
video into that device and then Motion can read from it. The following are some examples. First set up
the loopback device and set it to /dev/video0. Then start ffmpeg using options such as the following.
<code> ffmpeg -re -i mymovie.mp4 -f v4l2 /dev/video0 </code> Then in a separate terminal, start MotionPlus
with it set to use the <code>/dev/video0</code> device as input. This method can can also be used to
reformat the content to a different format. The following outputs the original movie into a gray pixel format.
<code> ffmpeg -re -i mymovie.mp4 -f v4l2 -pix_fmt gray /dev/video0 </code>
</ul>
<h3><a name="database_setup"></a>Database Setup</h3>
<ul>
If a database is specified in the MotionPlus configuration, upon start up, MotionPlus will check for a table in
the database called "motionplus" and if it is not found, it will create it. This MotionPlus specific table is
required so that movies can be displayed on the webcontrol page. It tracks the movies created by MotionPlus along
with the various metadata about the movies. The following is a brief overview of how to create a simple database
and specify it within the MotionPlus parameters so recordings can be downloaded from the webcontrol.
<ul>
<div>
<i><h4>sqlite3</h4></i>
This database type is by far the easiest to set up since it is file based. Simply provide the
parameters in the MotionPlus configuration parameters
<ul>
<small><small><code>
database_type sqlite3
<br>database_dbname /full/path/and/file/name.db
</code></small></small>
</ul>
While this is the easiest to set up, it has also been observed that it can at times be unstable. This
is especially true if the database file is included as part of a archive process while in use by MotionPlus.
</div>
<p></p>
<div>
<i><h4>mariadb</h4></i>
The following describes the process to set up a Mariadb database. If your machine already has a Mariadb database,
adjust as appropriate to the situation that exists on your computer. Those with more experience with MariaDb are
invited to provide suggestions and corrections to these steps.
<small><small><code>
<ul>
sudo apt install libmariadb-dev libmariadb3 mariadb-client mariadb-client-core mariadb-common mariadb-server
<br>sudo mariadb
<ul>
GRANT ALL ON *.* TO 'YourUserNameHere'@'localhost' IDENTIFIED BY 'YourPasswordHere' WITH GRANT OPTION;
<br>FLUSH PRIVILEGES;
<br>exit
</ul>
mariadb -u YourUserNameHere -p
<ul>
{enter YourPasswordHere}
<br>create database motionplus;
<br>use motionplus;
<br>quit;
</ul>
</code></small></small>
</ul>
Once the database is set up, check the status of Mariadb via systemctl.
<ul>
<small><small><code>
sudo systemctl status mariadb
</code></small></small>
</ul>
Specify the following in the MotionPlus configuration parameters.
<ul>
<small><small><code>
database_type mariadb
<br>database_dbname motionplus
<br>database_host localhost
<br>database_port 3306
<br>database_user YourUserNameHere
<br>database_password YourPasswordHere
</code></small></small>
</ul>
</div>
<p></p>
<div>
<i><h4>postgresql</h4></i>
The following describes the process to set up a PostgreSQL database.
If your machine already has a PostgreSQL database,
adjust as appropriate to the situation that exists on your computer.
Those with more experience with PostgreSQL are
invited to provide suggestions and corrections to these steps.
<small><small><code>
<ul>
sudo apt install postgresql postgresql-contrib
<br>sudo -u postgres psql
<ul>
CREATE ROLE 'your_username_here' LOGIN PASSWORD 'YourPasswordHere';
<br>CREATE DATABASE motionplus WITH OWNER = your_username_here;
<br>GRANT ALL PRIVILEGES ON DATABASE motionplus TO your_username_here;
<br>\quit
</ul>
</code></small></small>
</ul>
Once the database is set up, check the status via systemctl.
<ul>
<small><small><code>
sudo systemctl status postgresql
</code></small></small>
</ul>
Check the login information via the following command line. (note that the
username only seems to accept lowercase)
<ul>
<small><small><code>
psql -h localhost -d motionplus -U your_username_here -p 5432
</code></small></small>
Specify the following in the MotionPlus configuration parameters.
<ul>
<small><small><code>
database_type postgresql
<br>database_dbname motionplus
<br>database_host localhost
<br>database_port 5432
<br>database_user your_username_here
<br>database_password YourPasswordHere
</code></small></small>
</ul>
</div>
<p></p>
</ul>
</ul>
<h3><a name="webcontrol_pages"></a>Webcontrol pages</h3>
<ul>
<li><code>{IP}:{port0}/</code> Home html page with streams for all cameras</li>
The following JSON pages are available via the webcontrol.
<ul>
<li><code>{IP}:{port0}/0/config.json</code> JSON object with the configuration information for all cameras</li>
<li><code>{IP}:{port0}/0/status.json</code> JSON object with information about status of all cameras</li>
<li><code>{IP}:{port0}/0/movies.json</code> JSON object with information about all movies</li>
</ul>
The following mjpg streams are available via the webcontrol. (Update automatically). Specify {camid}
as 0 to obtain a consolidated mjpg stream of all cameras.
<ul>
<li><code>{IP}:{port0}/{camid}/mjpg</code> Primary stream for the camera updated as a mjpg</li>
<li><code>{IP}:{port0}/{camid}/mjpg/substream</code> Substream for the camera updated as a mjpg</li>
<li><code>{IP}:{port0}/{camid}/mjpg/motion</code> Stream of motion images for the camera as a mjpg</li>
<li><code>{IP}:{port0}/{camid}/mjpg/source</code> Source image stream of the camera as a mjpg</li>
<li><code>{IP}:{port0}/{camid}/mjpg/secondary</code> Image from secondary detection stream (if active) as a mjpg</li>
</ul>
The following mpegts streams are available via the webcontrol. (Update automatically) Specify {camid}
as 0 to obtain a consolidated mpegts stream of all cameras.
<ul>
<li><code>{IP}:{port0}/{camid}/mpegts</code> Primary stream for the camera updated as a mpeg transport stream</li>
<li><code>{IP}:{port0}/{camid}/mpegts/substream</code> Substream for the camera updated as a mpeg transport stream</li>
<li><code>{IP}:{port0}/{camid}/mpegts/motion</code> Stream of motion images for the camera as a mpeg transport stream</li>
<li><code>{IP}:{port0}/{camid}/mpegts/source</code> Source image stream of the camera as a mpeg transport stream</li>
<li><code>{IP}:{port0}/{camid}/mpegts/secondary</code> Image from secondary detection stream (if active) as a mpeg transport stream</li>
</ul>
The following static pages are available via the webcontrol. (Update manually) Specify {camid}
as 0 to obtain a consolidated image of all cameras.
<ul>
<li><code>{IP}:{port0}/{camid}/static</code> Primary image for the camera</li>
<li><code>{IP}:{port0}/{camid}/static/substream</code> Substream image for the camera</li>
<li><code>{IP}:{port0}/{camid}/static/motion</code> Motion image for the camera</li>
<li><code>{IP}:{port0}/{camid}/static/source</code> Source image of the camera</li>
<li><code>{IP}:{port0}/{camid}/static/secondary</code> Image from secondary detection stream (if active)</li>
</ul>
The following actions can be executed by sending post request.
<ul>
<li><code>eventstart</code>Start an event</li>
<li><code>eventend</code>End an event</li>
<li><code>snapshot</code>Invoke a snapshot</li>
<li><code>pause</code>Pause motion detection</li>
<li><code>unpause</code>Unpause motion detection</li>
<li><code>restart</code>Restart camera</li>
<li><code>stop</code>Stop camera</li>
<li><code>config_write</code>Write out the configuration to file. User account running Motionplus must have write access to directory</li>
<li><code>camera_add</code>Add a camera</li>
<li><code>camera_delete</code>Delete camera</li>
<li><code>config</code>Set configuration item</li>
<li><code>action_user</code>Execute the on_action_user command. Provide as needed the additional parameter of action_user</li>
<li><code>pan_left</code>Execute the ptz_pan_left command</li>
<li><code>pan_right</code>Execute the ptz_pan_left command</li>
<li><code>tilt_up</code>Execute the ptz_tilt_up</li>
<li><code>tilt_down</code>Execute the ptz_tilt_down</li>
<li><code>zoom_in</code>Execute ptz_zoom_in command</li>
<li><code>zoom_out</code>Execute the ptz_zoom_out command</li>
</ul>
Sample commands
<ul>
<li><code>curl -s -o -X POST {IP}:{port0} --data "camid={camid}" --data "command=eventstart" 1>/dev/null</code></li>
<li><code>curl -s -o -X POST {IP}:{port0} --data "camid={camid}" --data "command=config" --data "framerate=12" 1>/dev/null</code></li>
</ul>
</ul>
<h3><a name="haar_setup"></a>HAAR setup</h3>
<ul>
<li>Set the following Motionplus items within the secondardy_params</li>
<ul>
<li><code>frame_interval</code>Default: 5 | The number of images between each secondary detection</li>
<li><code>image_type</code>Default: full | Type of image to process through secondary detection</li>
<li><code>model_file</code>Default: None | Full path and file name for the haar model</li>
<li><code>rotate</code>Default: 0 | Degrees of rotation of the image when processing through secondary detection </li>
<li><code>threshold</code>Default: 1.10 | weights of detected values </li>
</ul>
<li>Set the following parameters to the OpenCV function <code>CascadeClassifier::detectMultScale</code> within the secondardy_params</li>
</u>
<li><code>scalefactor</code>Default: 1.10 | Scale factor to apply to the image</li>
<li><code>flags</code>Default: 0 | </li>
<li><code>maxsize</code>Default: 1024 | </li>
<li><code>minsize</code>Default: 8 | </li>
<li><code>minneighbors</code>Default: 8 | </li>
</ul>
</ul>
<h3><a name="hog_device"></a>HOG setup</h3>
<ul>
<li>Set the following items within the secondardy_params</li>
<ul>
<li><code>frame_interval</code>Default: 5 | The number of images between each secondary detection</li>
<li><code>image_type</code>Default: full | Type of image to process through secondary detection</li>
<li><code>model_file</code>Default: None | Full path and file name for the haar model</li>
<li><code>rotate</code>Default: 0 | Degrees of rotation of the image when processing through secondary detection </li>
<li><code>threshold</code>Default: 1.10 | Weights of detected values</li>
</ul>
<li>Set the following parameters to the OpenCV function <code>HOGDescriptor::detectMultScale</code> within the secondardy_params</li>
<ul>
<li><code>threshold_model</code>Default: 2.00 | </li>
<li><code>scalefactor</code>Default: 1.05 | </li>
<li><code>padding</code>Default: 8 | </li>
<li><code>winstride</code>Default: 8 | </li>
</ul>
</ul>
<h3><a name="dnn_setup"></a>DNN setup</h3>
<ul>
<li>Set the following items within the secondardy_params</li>
<ul>
<li><code>model_file</code>Default: None | Full path and file name for the haar model</li>
<li><code>frame_interval</code>Default: 5 | The number of images between each secondary detection</li>
<li><code>image_type</code>Default: full | Type of image to process through secondary detection</li>
<li><code>rotate</code>Default: 0 | Degrees of rotation of the image when processing through secondary detection </li>
<li><code>threshold</code>Default: 0.75 | Confidence threshold</li>
<li><code>scalefactor</code>Default: 1.05 | </li>
<li><code>backend</code>Default: 0(DNN_BACKEND_DEFAULT) | </li>
<li><code>target</code>Default: 0(DNN_TARGET_CPU) | </li>
<li><code>width</code>Default: none | Width for the model (not the source image)</li>
<li><code>height</code>Default: none | Height for the model (not the source image)</li>
<li><code>scale</code>Default: none | Scale used in the model</li>
<li><code>config</code>Default: none | </li>
<li><code>classes_file</code>Default: none | Full path and name for a file with the names of the classes </li>
<li><code>framework</code>Default: none | </li>
</ul>
</ul>
<h3><a name="haar_train"></a>Haar Model Training</h3>
<ul>
The OpenCV documentation is the definitive source for instructions on how to train
a Haar model. This brief introduction only provides a few scripts that may be
helpful in using MotionPlus to get positive and negative images to feed into the
training process.
<br>
<br>Start with creating positive images movie as input file.
<br>Run with picture_output_motion roi
<br>Remove any pictures that are not desired.
<br>Run the script to create the positive file list
<br>Run while in the directory with the positive images.
<small><code><ul>
opencv_createsamples -vec posfiles.vec -info poslist.txt -num 350 -h 96 -w 96
</ul></code></small>
Next get a sample file that does not have desired positives.
<br>Change to picture_output on and turn off motion roi
<br>Change threshold to tiny number and run to create negatives
<small><code><ul>
opencv_traincascade -data ./model -vec ./pos/posfiles.vec -bg neglist.txt -numPos 350 -numNeg 325
</ul></code></small>
The following are the simple scripts to create positive and negative list files for training
<small><small><code>
<ul>
!/bin/bash
<br>FILES=./pos/*.jpg
<br>for FULLNAME in $FILES
<br>do
<br>HW=$(identify -format '%w %h' $FULLNAME)
<br>printf "$FULLNAME 1 0 0 $HW \n" >>poslist.txt
<br>done
</ul>
<ul>
<br>!/bin/bash
<br>FILES=./neg/*.jpg
<br>for FULLNAME in $FILES
<br>do
<br> printf "$FULLNAME \n" >>neglist.txt
<br>done
</ul>
</code></small></small>
</ul>
<h3><a name="sound_sample"></a>Sound Frequency Sample</h3>
<ul>
Since sound frequency processing is new to MotionPlus, the following provides an illustrative sample of setting
up the sound and the associated alerts processing. This example will use ALSA. For PulseAudio, MotionPlus uses
the default audio recording device. Although MotionPlus has parameters for the PulseAudio server and device,
the set up is not straight forward and it is just recommended to change the PulseAudio default.
<br>
<br>Go to the command prompt and use <small><code>arecord -l</code></small> to get the
device name such as <small><code>hw:1,0</code></small>
<br>Specify log_level 8 in MotionPlus.conf
<br>Do not specify a log file so that it is console output.
<br>Specify snd_device and snd_show in the sound configuration file such as
<br><small><code>snd_device hw:1,0</code></small>
<br><small><code>snd_show on</code></small>
<br>Start MotionPlus and make a noise to test the output.
<br>Once MotionPlus responds to sounds, press the test button on the device to be monitored.
<br>Note that while the various devices being monitored may be the same, the detected frequency from
each may be slightly different. Care should be taken to not be too precise in the setting of the alert
range for MotionPlus. For example, the frequency may be reported as 3402.2456 and MotionPlus can be
set up to look for that precise number but devices age and the frequency may change. Also, note that the
frequency resolution of MotionPlus is limited by the sample rate and frames from the audio device.
The maximum resolution is determined by the following formula. Sample Rate / (frames * 2). So with the
default sample rate of 44100hz, and frames of 2048, the maximum resolution is appoximately 10.7666hz. This
means that the frequencies detected around the range reported above would be 3413.0122, 3402.2456
or 3391.4790 and no values between.
<br>Once the frequencies of all the devices have been logged, set up the alerts in the sound configuration
file as well as the on_sound_alert and turn off the showing of frequencies. (The frequencies in this sample
are random)
<small><code><ul>
<br>snd_alerts alert_id=01,volume_level=01,volume_count=10,freq_low=2976,freq_high=2977,alert_nm=smokedown1
<br>snd_alerts alert_id=02,volume_level=01,volume_count=10,freq_low=3400,freq_high=3450,alert_nm=smokelr
<br>snd_alerts alert_id=03,volume_level=01,volume_count=10,freq_low=3388,freq_high=3399,alert_nm=smokebr1
<br>snd_alerts alert_id=11,volume_level=01,volume_count=10,freq_low=3378,freq_high=3379,alert_nm=furnace
<br>snd_alerts alert_id=22,volume_level=01,volume_count=10,freq_low=3281,freq_high=3399,alert_nm=waterheater
<br>snd_alerts alert_id=22,volume_level=01,volume_count=10,freq_low=3270,freq_high=3279,alert_nm=kitchBath
<br>snd_show off
<br>on_sound_alert %{trig_nbr} %{trig_nm} %{trig_freq}
<br>
</ul></code></small>
Then you can set up a script to send email or text messages using the sendemail
application like below
<small><small><code>
<ul>
<br>#!/bin/bash
<br> ALRTNBR=$1
<br> ALRTNM=$2
<br> FREQ=$3
<br> ATCH=$4
<br> MYSTR=""
<br> MYSTR=$MYSTR" -f \"Friendly Name <[email protected]>\" "
<br> MYSTR=$MYSTR" -t \"[email protected]\" "
<br> MYSTR=$MYSTR" -u \"MotionPlus Notification\" "
<br> MYSTR=$MYSTR" -s \"smtp.gwhatever.com:587\" "
<br> MYSTR=$MYSTR" -xu \"[email protected]\" "
<br> MYSTR=$MYSTR" -xp \"SendingEmailPassword\" "
<br> BODY=""
<br> if [[ "$ALRTNBR" -ge 1 && "$ALRTNBR" -le 9 ]]; then
<br> BODY="So, hey. Sorry to bother you. But thought I'd just let"
<br> BODY=$BODY" you know that your house is burning down. The neighbors"
<br> BODY=$BODY" may get annoyed so you should think about doing something. "
<br> BODY=$BODY" The "$ALRTNM" alert numbered "$ALRTNBR" was triggered with "
<br> BODY=$BODY" frequency "$FREQ
<br> elif [[ "$ALRTNBR" -ge 10 && "$ALRTNBR" -le 19 ]]; then
<br> BODY="Hi. So I noticed that the natural gas leak alarm is going off."
<br> BODY=$BODY" Nothing too urgent or anything but when you get home, you"
<br> BODY=$BODY" may want to hold off making any sparks to avoid blowing yourself up."
<br> BODY=$BODY" The "$ALRTNM" alert numbered "$ALRTNBR" was triggered with "
<br> BODY=$BODY" frequency "$FREQ
<br> elif [[ "$ALRTNBR" -ge 20 && "$ALRTNBR" -le 29 ]]; then
<br> BODY="Ahoy! Your house is going to be next water park attraction in"
<br> BODY=$BODY" the neighborhood!!! The water is filling it up and the"
<br> BODY=$BODY" children will be splashing around in it soon."
<br> BODY=$BODY" The "$ALRTNM" alert numbered "$ALRTNBR" was triggered with "
<br> BODY=$BODY" frequency "$FREQ
<br> fi
<br> if [ "$BODY" != "" ]; then
<br> MYSTR=$MYSTR" -m \""$BODY"\" "
<br> if [ -f "$ATCH" ]; then
<br> MYSTR=$MYSTR" -m \""$ATCH"\" "
<br> fi
<br> sendemail $MYSTR
<br> fi
<br>exit 0
</ul>
</code></small></small>
</ul>
<h3><a name="fail2ban"></a>Fail2Ban Example</h3>
<ul>
The following are example files to use with the fail2ban application. This allows users to ban IPs that
may be attempting to get in. This example was created using Debian 11. Adjust as appropriate for other
distros and versions.
<br>
Install fail2ban and create the following files:
<br>File 1:
<small><small><code><ul>
<br> # Fail2Ban configuration file: /etc/fail2ban/filter.d/motionplus.conf
<br> # Author: Mr Dave
<br> #
<br> [INCLUDES]
<br> # Read common prefixes. If any customizations available -- read them from common.local
<br> before = common.conf
<br>
<br> [Definition]
<br> daemon = nsd
<br>
<br> # Option: failregex
<br> # Notes.:
<br> # regex to match the log in failures messages in the logfile. The
<br> # host must be matched by a group named "host". The tag "<HOST>" can
<br> # be used for standard IP/hostname matching and is only an alias for
<br> # (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
<br> # Sample: Jul 01 02:50:32 [EMG][STR][00:wc00] webu_failauth_check: Ignoring connection from: 192.168.1.10
<br> # Values: TEXT
<br>
<br> failregex = ^.*Ignoring connection from: <HOST>$
<br>
<br> ignoreregex =
<br>
<br> datepattern = {^LN-BEG}Epoch
<br> {^LN-BEG}
<br>
</ul></code></small></small>
<br>File2:
<small><small><code><ul>
<br> #Fail2Ban Jail Configuration File: /etc/fail2ban/jail.d/motionplus-jail.conf
<br> [motionplus]
<br> enabled = true
<br> filter = motionplus
<br> logpath = /var/log/motionplus/motionplus.log
<br> bantime = 23h
<br> banaction = iptables-allports[blocktype="DROP"]
<br> maxretry = 0
<br> port = 0:65535
</ul></code></small></small>
<br>Make sure to adjust the log file location indicated in the jail file as well as how long to ban the IP address.
</ul>
<h3><a name="ptz"></a>PTZ command examples</h3>
<ul>
The following are some example sources and scripts to send PTZ (Pan Tilt Zoom) commands to cameras.
<br><br>
<a href="https://github.com/667bdrm/sofiactl">sofiactl</a> is a Perl script that can control many imported inexpensive cameras.
<br> Adjust script location, timing, cameraip, user, etc as appropriate.
<small><small><code><ul>
<br> #!/bin/bash
<br> sofiactl.pl --user admin --host cameraip --port 34567 --command OPPTZControl --sd ZoomTile --s2 0.5
<br> sofiactl.pl --user admin --host cameraip --port 34567 --command OPPTZControl --sd ZoomWide --s2 0.5
<br> sofiactl.pl --user admin --host cameraip --port 34567 --command OPPTZControl --sd DirectionUp --s2 2.0
<br> sofiactl.pl --user admin --host cameraip --port 34567 --command OPPTZControl --sd DirectionDown --s2 2.0
<br> sofiactl.pl --user admin --host cameraip --port 34567 --command OPPTZControl --sd DirectionLeft --s2 2.0
<br> sofiactl.pl --user admin --host cameraip --port 34567 --command OPPTZControl --sd DirectionRight --s2 2.0
<br> exit
</ul></code></small></small>
<br>
<a href="https://github.com/Mr-Dave/camxmctl">camxmctl</a> is a c++ program with a sample HTML page that makes adjusting the parameters
easier. It reuses some of the code from Motionplus and is based upon the JSON files and commands in the
<a href="https://github.com/667bdrm/sofiactl">sofiactl</a> script.
<br> Adjust location, timing, cameraip, user, etc as appropriate.
<small><small><code><ul>
<br> #!/bin/bash
<br> tbd. Review sample page to see post commands.
<br> exit
</ul></code></small></small>
<br>
curl scripts. Example 1
<br> Adjust as appropriate.
<small><small><code><ul>
<br> #!/bin/bash
<br> curl -X PUT -H "Content-Type: application/x-www-form-urlencoded" -d 'Param1=1' http://admin@cameraip:80/PTZ/1/TurnDown
<br> sleep 2
<br> curl -X PUT -H "Content-Type: application/x-www-form-urlencoded" -d 'Param1=0' http://admin@cameraip:80/PTZ/1/TurnDown
<br> exit
<br> #!/bin/bash
<br> curl -X PUT -H "Content-Type: application/x-www-form-urlencoded" -d 'Param1=1' http://admin@cameraip:80/PTZ/1/TurnLeft
<br> sleep 2
<br> curl -X PUT -H "Content-Type: application/x-www-form-urlencoded" -d 'Param1=0' http://admin@cameraip:80/PTZ/1/TurnLeft
<br> exit
<br> #!/bin/bash
<br> curl -X PUT -H "Content-Type: application/x-www-form-urlencoded" -d 'Param1=1' http://admin@cameraip:80/PTZ/1/TurnRight
<br> sleep 2
<br> curl -X PUT -H "Content-Type: application/x-www-form-urlencoded" -d 'Param1=0' http://admin@cameraip:80/PTZ/1/TurnRight
<br> exit
<br> #!/bin/bash
<br> curl -X PUT -H "Content-Type: application/x-www-form-urlencoded" -d 'Param1=1' http://admin@cameraip:80/PTZ/1/TurnUp
<br> sleep 2
<br> curl -X PUT -H "Content-Type: application/x-www-form-urlencoded" -d 'Param1=0' http://admin@cameraip:80/PTZ/1/TurnUp
<br> exit
</ul></code></small></small>
<br>
curl scripts. Example 2
<br> Adjust as appropriate.
<small><small><code><ul>
<br> #!/bin/bash
<br> curl 'http://admin:admin@cameraip:80/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=left&-speed=45'
<br> sleep 1
<br> curl 'http://admin:admin@cameraip:80/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=stop&-speed=45'
<br> exit
<br> #!/bin/bash
<br> curl 'http://admin:admin@cameraip:80/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=right&-speed=45'
<br> sleep 1
<br> curl 'http://admin:admin@cameraip:80/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=stop&-speed=45'
<br> exit
<br> #!/bin/bash
<br> curl 'http://admin:admin@cameraip:80/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=down&-speed=45'
<br> sleep 1
<br> curl 'http://admin:admin@cameraip:80/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=stop&-speed=45'
<br> exit
<br> #!/bin/bash
<br> curl 'http://admin:admin@cameraip:80/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=up&-speed=45'
<br> sleep 1
<br> curl 'http://admin:admin@cameraip:80/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=stop&-speed=45'
<br> exit
<br> #!/bin/bash
<br> curl 'http://admin:admin@cameraip:80/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=zoomin&-speed=45'
<br> sleep 1
<br> curl 'http://admin:admin@cameraip:80/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=stop&-speed=45'
<br> exit
<br> #!/bin/bash
<br> curl 'http://admin:admin@cameraip:80/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=zoomout&-speed=45'
<br> sleep 1
<br> curl 'http://admin:admin@cameraip:80/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=stop&-speed=45'
<br> exit
</ul></code></small></small>
</ul>
</section>
</body>
</html>