summaryrefslogtreecommitdiff
path: root/docs/docgen/html/guides/FAQ.html
blob: 7b458113c75c293769a5240b744b498a04ee25e1 (plain)
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
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998


<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>zmNinja FAQ &mdash; zmNinja  documentation</title>
  

  
  
  
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
  

  

  
        <link rel="index" title="Index"
              href="../genindex.html"/>
        <link rel="search" title="Search" href="../search.html"/>
    <link rel="top" title="zmNinja  documentation" href="../index.html"/>
        <link rel="next" title="Validating APIs" href="validating-api.html"/>
        <link rel="prev" title="Welcome to zmNinja’s documentation!" href="../index.html"/> 

  
  <script src="../_static/js/modernizr.min.js"></script>

</head>

<body class="wy-body-for-nav" role="document">

   
  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search">
          

          
            <a href="../index.html" class="icon icon-home"> zmNinja
          

          
            
            <img src="../_static/ninja.png" class="logo" />
          
          </a>

          
            
            
          

          
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

          
        </div>

        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          
            
            
              
            
            
              <ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">zmNinja FAQ</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#what-is-the-minimum-supported-version-of-zoneminder-android-and-ios">What is the minimum supported version of ZoneMinder, Android and iOS?</a></li>
<li class="toctree-l2"><a class="reference internal" href="#zmninja-help">zmNinja Help</a></li>
<li class="toctree-l2"><a class="reference internal" href="#asking-for-refunds">Asking for refunds</a></li>
<li class="toctree-l2"><a class="reference internal" href="#things-you-should-own-up-to">Things you should own up to</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#read-the-app-description">Read the app description</a></li>
<li class="toctree-l3"><a class="reference internal" href="#try-before-buy">Try before buy</a></li>
<li class="toctree-l3"><a class="reference internal" href="#zmninja-doesn-t-work-actually-even-zoneminder-web-console-doesn-t-work-you-should-fix-this">zmNinja doesn’t work. Actually, even ZoneMinder web console doesn’t work. You should fix this!</a></li>
<li class="toctree-l3"><a class="reference internal" href="#zmninja-doesn-t-work-zoneminder-works-but-i-have-no-idea-why-apis-don-t-work-you-should-fix-this">zmNinja doesn’t work. Zoneminder works, but I have no idea why APIs don’t work. You should fix this!</a></li>
<li class="toctree-l3"><a class="reference internal" href="#i-can-t-compile-zmninja-help-me">I can’t compile zmNinja, help me!</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#how-to-report-errors">How to report errors</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#if-zmninja-does-not-start-on-your-device">If zmNinja does not start on your device</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#profile-information-storage-related">Profile information storage related</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#zmninja-is-not-saving-my-information-it-keeps-asking-me-to-re-enter-all-my-data">zmNinja is not saving my information. It keeps asking me to re-enter all my data</a></li>
<li class="toctree-l3"><a class="reference internal" href="#i-updated-my-zmninja-app-and-all-my-server-settings-were-cleared-why">I updated my zmNinja app and all my server settings were cleared. Why?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#connection-authentication-issues">Connection/Authentication issues</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#general-tips">General tips</a></li>
<li class="toctree-l3"><a class="reference internal" href="#server-redirects">Server Redirects</a></li>
<li class="toctree-l3"><a class="reference internal" href="#self-signed-certs">Self signed certs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#ssl-settings">SSL settings</a></li>
<li class="toctree-l3"><a class="reference internal" href="#everything-works-when-i-use-lan-ip-but-i-get-not-authenticated-when-i-use-wan-ip">Everything works when I use LAN IP, but I get “not authenticated” when I use WAN IP</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#live-streaming-issues">Live streaming issues</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#summary-of-everything-works-but-i-can-t-see-live-feed">Summary of Everything works, but I can’t see live feed</a></li>
<li class="toctree-l3"><a class="reference internal" href="#general-note">General note</a></li>
<li class="toctree-l3"><a class="reference internal" href="#i-can-t-see-stream-and-i-can-t-see-streams-in-zoneminder-webconsole-either">I can’t see stream: And I can’t see streams in ZoneMinder webconsole either</a></li>
<li class="toctree-l3"><a class="reference internal" href="#i-can-t-see-streams-i-use-basic-auth">I can’t see streams: I use basic auth</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#skipping-auth-for-nph-zms-urls">Skipping auth for <code class="docutils literal"><span class="pre">nph-zms</span></code> URLs</a></li>
<li class="toctree-l4"><a class="reference internal" href="#authorization-with-a-reverseproxy">Authorization with a ReverseProxy</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#i-can-t-see-streams-multi-server-is-enabled">I can’t see streams: Multi-server is enabled</a></li>
<li class="toctree-l3"><a class="reference internal" href="#i-can-t-see-streams-you-have-cgi-bin-issues">I can’t see streams: you have cgi-bin issues</a></li>
<li class="toctree-l3"><a class="reference internal" href="#zmninja-montage-does-not-seem-smooth-feeds-seem-a-little-delayed-compared-to-zm-console">zmNinja montage does not seem smooth - feeds seem a little delayed compared to ZM console</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#event-images-streaming-related">Event images/streaming related</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id1">General note</a></li>
<li class="toctree-l3"><a class="reference internal" href="#event-stream-viewing-does-not-work">Event stream viewing does not work</a></li>
<li class="toctree-l3"><a class="reference internal" href="#video-not-playable">Video Not Playable</a></li>
<li class="toctree-l3"><a class="reference internal" href="#event-thumbnails-images-don-t-show">Event thumbnails/images don’t show</a></li>
<li class="toctree-l3"><a class="reference internal" href="#when-viewing-individual-frames-some-event-frames-show-but-some-don-t">When viewing individual frames, some event frames show, but some don’t</a></li>
<li class="toctree-l3"><a class="reference internal" href="#zmninja-montage-screen-shows-all-my-monitors-but-in-event-montage-i-only-see-5">zmNinja montage screen shows all my monitors, but in Event Montage, I only see 5?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#other-misc-issues">Other misc. issues</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#i-suddently-see-an-error-message-saying-i-need-to-enable-zm-auth-hash-logins-this-wasn-t-there-before">I suddently see an error message saying I need to enable ZM_AUTH_HASH_LOGINS. This wasn’t there before</a></li>
<li class="toctree-l3"><a class="reference internal" href="#zmninja-1-2-515-and-beyond-says-need-api-upgrade-for-the-24hr-review-feature-what-does-that-mean">zmNinja 1.2.515 and beyond says “Need API Upgrade” for the 24hr review feature. What does that mean?</a></li>
<li class="toctree-l3"><a class="reference internal" href="#i-upgraded-zoneminder-to-1-30-2-or-above-and-zmninja-stopped-working">I upgraded ZoneMinder to 1.30.2 or above and zmNinja stopped working!</a></li>
<li class="toctree-l3"><a class="reference internal" href="#i-am-running-zm-on-a-custom-port-zmninja-is-unable-to-reach-my-zoneminder-server-but-i-tried-on-a-regular-browser-firefox-opera-ie-and-it-i-can-reach-it">I am running ZM on a custom port. zmNinja is unable to reach my ZoneMinder server but I tried on a regular browser (Firefox/Opera/IE) and it I can reach it</a></li>
<li class="toctree-l3"><a class="reference internal" href="#the-montage-screen-is-causing-issues-with-my-zm-server-i-get-connection-timeout-issues-or-mysql-connection-problems">The Montage screen is causing issues with my ZM server - I get connection timeout issues or MySQL connection problems</a></li>
<li class="toctree-l3"><a class="reference internal" href="#the-app-works-great-except-it-doesn-t-work-on-one-android-phone-works-in-others">The app works great - except it doesn’t work on ONE Android phone - works in others!</a></li>
<li class="toctree-l3"><a class="reference internal" href="#apis-are-not-working-zm-console-works-fine">APIs are not working ! ZM console works fine.</a></li>
<li class="toctree-l3"><a class="reference internal" href="#i-m-using-mocord-record-and-i-don-t-see-events-without-alarms">I’m using mocord/record and I don’t see events without alarms</a></li>
<li class="toctree-l3"><a class="reference internal" href="#taking-snapshots-or-downloading-videos-don-t-work-in-android">Taking snapshots or downloading videos don’t work in Android</a></li>
<li class="toctree-l3"><a class="reference internal" href="#pan-tilt-zoom-doesn-t-work">Pan/Tilt/Zoom doesn’t work</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#what-is-this-event-server">What is this Event Server?</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#it-looks-like-you-allow-me-to-modify-the-frequency-of-push-notifications-very-cool-will-it-send-me-all-events-that-i-missed-if-i-make-the-frequency-of-a-monitor-event-push-to-say-600-seconds">It looks like you allow me to modify the frequency of push notifications. Very cool - will it send me all events that I missed if I make the frequency of a monitor event push to say, 600 seconds?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#is-zmninja-free">Is zmNinja free?</a></li>
<li class="toctree-l2"><a class="reference internal" href="#who-are-the-developers-behind-this">Who are the developers behind this?</a></li>
<li class="toctree-l2"><a class="reference internal" href="#the-code-needs-improvement">The code needs improvement</a></li>
<li class="toctree-l2"><a class="reference internal" href="#is-zmninja-an-official-zoneminder-product">Is zmNinja an official ZoneMinder product?</a></li>
<li class="toctree-l2"><a class="reference internal" href="#i-want-to-donate-money">I want to donate money</a></li>
<li class="toctree-l2"><a class="reference internal" href="#how-does-zmninja-use-my-personal-data">How does zmNinja use my personal data?</a></li>
<li class="toctree-l2"><a class="reference internal" href="#i-want-to-donate-time-expertise-code">I want to donate time/expertise/code</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="validating-api.html">Validating APIs</a></li>
<li class="toctree-l1"><a class="reference internal" href="desktop.html">Desktop port tips</a></li>
<li class="toctree-l1"><a class="reference internal" href="contributing-language.html">Contributing a new language</a></li>
<li class="toctree-l1"><a class="reference internal" href="source.html">Building from Source</a></li>
<li class="toctree-l1"><a class="reference external" href="http://pliablepixels.github.io/zmeventnotification/docgen/html/index.html">Event Notification Server</a></li>
</ul>

            
          
        </div>
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="../index.html">zmNinja</a>
        
      </nav>


      
      <div class="wy-nav-content">
        <div class="rst-content">
          















<div role="navigation" aria-label="breadcrumbs navigation">

  <ul class="wy-breadcrumbs">
    
      <li><a href="../index.html">Docs</a> &raquo;</li>
        
      <li>zmNinja FAQ</li>
    
    
      <li class="wy-breadcrumbs-aside">
        
            
            <a href="../_sources/guides/FAQ.rst.txt" rel="nofollow"> View page source</a>
          
        
      </li>
    
  </ul>

  
  <hr/>
</div>
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
  <div class="section" id="zmninja-faq">
<h1>zmNinja FAQ<a class="headerlink" href="#zmninja-faq" title="Permalink to this headline">¶</a></h1>
<div class="section" id="what-is-the-minimum-supported-version-of-zoneminder-android-and-ios">
<h2>What is the minimum supported version of ZoneMinder, Android and iOS?<a class="headerlink" href="#what-is-the-minimum-supported-version-of-zoneminder-android-and-ios" title="Permalink to this headline">¶</a></h2>
<p>You need a minimum of ZM 1.30.4 with APIs working. You may get it to run
in previous versions, but I don’t support them, so you are on your own.</p>
<p>Starting version 1.3.26 of zmNinja, only IOS 10+ and Android 5.0+
devices are supported.</p>
</div>
<div class="section" id="zmninja-help">
<h2>zmNinja Help<a class="headerlink" href="#zmninja-help" title="Permalink to this headline">¶</a></h2>
<p>I’ve just started uploading instructional videos for zmNinja. I’ll add
more over time. See them
<a class="reference external" href="https://github.com/pliablepixels/zmNinja/wiki/Help-Videos-for-zmNinja">here</a></p>
</div>
<div class="section" id="asking-for-refunds">
<h2>Asking for refunds<a class="headerlink" href="#asking-for-refunds" title="Permalink to this headline">¶</a></h2>
<p>For iOS: To get a refund, Apple wants you to contact them directly
using <a class="reference external" href="https://support.apple.com/en-us/HT204084">this</a> link. There used to be
a time when I could process a refund myself, but it seems Apple doesn’t provide
that interface anymore.</p>
<p>For Android: If you’re not happy with zmNinja and have bought the app,
please <a class="reference external" href="mailto:pliablepixels&#37;&#52;&#48;gmail&#46;com">send me an email</a> <strong>with your
order id</strong>.</p>
<p>Note that depending on how long ago you made the order, I may not be
able to refund. Its not my policy - The app/play stores disable the
refund option. For example, I could not refund an app a user purchased 2
years ago.</p>
<p>Also, please read <a class="reference external" href="#things-you-should-own-up-to">Things you should own up
to</a></p>
</div>
<div class="section" id="things-you-should-own-up-to">
<h2>Things you should own up to<a class="headerlink" href="#things-you-should-own-up-to" title="Permalink to this headline">¶</a></h2>
<div class="section" id="read-the-app-description">
<h3>Read the app description<a class="headerlink" href="#read-the-app-description" title="Permalink to this headline">¶</a></h3>
<p>Both the Apple and Android stores have a clearly visible note on the app
description that it requires a working API for ZoneMinder. If you are
not willing to ensure the API works, please save yourself and me time.
I’m sorry this is the first post, but I get emails from too many
entitled/rude folks about APIs not working. Not my problem. Read below.
Breathe.</p>
</div>
<div class="section" id="try-before-buy">
<h3>Try before buy<a class="headerlink" href="#try-before-buy" title="Permalink to this headline">¶</a></h3>
<p>Some users legitimately look around for an option to try before they buy
and they are not savvy enough to <a class="reference external" href="https://github.com/pliablepixels/zmNinja">download the
code</a> and compile (<a class="reference internal" href="source.html"><span class="doc">Building from Source</span></a>) for
themselves. Fair enough. In that case, <a class="reference external" href="https://github.com/pliablepixels/zmNinja/releases">download the Desktop
version</a> of
zmNinja. It’s free and is the same code as mobile. Make sure the desktop
version works before you buy the mobile version.</p>
<p>The reason I don’t have a “trial mobile version” is that I find the
process too complex using in-app-purchases and chose not to do it to
make life simpler for me. As a substitute, I do make the full code
available for free and offer a desktop binary version free too.</p>
</div>
<div class="section" id="zmninja-doesn-t-work-actually-even-zoneminder-web-console-doesn-t-work-you-should-fix-this">
<h3>zmNinja doesn’t work. Actually, even ZoneMinder web console doesn’t work. You should fix this!<a class="headerlink" href="#zmninja-doesn-t-work-actually-even-zoneminder-web-console-doesn-t-work-you-should-fix-this" title="Permalink to this headline">¶</a></h3>
<p>Yeah, look - I understand zmNinja won’t work if ZoneMinder web console
doesn’t work. That being said, I really don’t have time to help you
debug ZoneMinder issues. I only develop the app (zmNinja). If you can’t
set up ZoneMinder properly, please post your questions in the <a class="reference external" href="https://forums.zoneminder.com">ZM
forum</a>. You’ll find more qualified
people to help you. I don’t develop nor control ZoneMinder. It’s a
different set of folks. Now, I’ll help you, but only after you have
spent sufficient time trying your best and provide sufficient logs of
what you have done. Also remember, if you buy zmNinja, <strong>I’m happy to
refund it anytime - just send me an email.</strong></p>
<p>In short, I don’t have the time to support ZoneMinder install issues -
sorry about that</p>
</div>
<div class="section" id="zmninja-doesn-t-work-zoneminder-works-but-i-have-no-idea-why-apis-don-t-work-you-should-fix-this">
<h3>zmNinja doesn’t work. Zoneminder works, but I have no idea why APIs don’t work. You should fix this!<a class="headerlink" href="#zmninja-doesn-t-work-zoneminder-works-but-i-have-no-idea-why-apis-don-t-work-you-should-fix-this" title="Permalink to this headline">¶</a></h3>
<p><em>Sigh</em>. I don’t maintain ZoneMinder. I only develop the app. <em>You</em> need
to make sure ZoneMinder APIs work. ZoneMinder web console doesn’t use
APIs. Neither does zmView. zmNinja does. It says so in the description
of the app in the store. So feel free to fix your APIs, or ask me for a
refund. Just don’t whine to me, please, if your APIs are broken. I’m
<em>not</em> going to fix them for you, especially if you act like its not your
problem. <a class="reference external" href="https://medium.com/zmninja/no-soup-for-you-42ac0927952">I’m perfectly fine if you choose not to use my
app</a>, which
is why I refund, anytime.</p>
</div>
<div class="section" id="i-can-t-compile-zmninja-help-me">
<h3>I can’t compile zmNinja, help me!<a class="headerlink" href="#i-can-t-compile-zmninja-help-me" title="Permalink to this headline">¶</a></h3>
<p>I put out the source code, so people who know how to compile are able to
do it themselves. I also hope this will encourage folks to PR changes
(though this has rarely happened). The problem however, is that
dependencies/libraries keep changing. I just don’t have the time to help
debug. If it happens to me, I’ll fix it. If it doesn’t I have very
limited time to remotely debug your setup issues. I’d much appreciate if
you figured it out on your own. Feel free to create an issue after
you’ve tried enough, but I can’t guarantee I’ll spend a lot of time on
source code compile issues.</p>
</div>
</div>
<div class="section" id="how-to-report-errors">
<h2>How to report errors<a class="headerlink" href="#how-to-report-errors" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li>I don’t know why something is not working if you don’t provide
sufficient inputs. Start by creating a <a class="reference external" href="https://github.com/pliablepixels/zmNinja/issues">GitHub
issue</a> and please
fill in the template correctly. If you don’t want to post debug logs
in the issue, <a class="reference external" href="mailto:pliablepixels+zmNinja&#37;&#52;&#48;gmail&#46;com">email</a> them
to me and mention in the issue you’ve emailed them (you can email by
going to logs screen and tapping on the envelope button (mobile) or
you can download logs (cloud icon, desktop version)</li>
<li>If zmNinja was working, but it stopped after you upgraded ZoneMinder
be sure to mention which version was working and which was not. In
this case, please make sure you have validated the APIs work</li>
<li>Before you create an issue, please make sure you have read the
sections on <a class="reference external" href="#connectionauthentication-issues">connection
issues</a>
and <a class="reference external" href="#live-streaming-issues">streaming</a>
issues and Step 6 of <a class="reference internal" href="validating-api.html"><span class="doc">Validating APIs</span></a></li>
<li>Its often hard to infer a problem especially when its due to some
unique apache/nginx mungling you might have done but haven’t told me
about it. In such cases, try and give me remote access to your ZM for
a day. Configure a limited user with just one monitor. It will save
hours of frustration (mostly on my side). Thanks</li>
<li>I have released the desktop version free - download it
<a class="reference external" href="https://github.com/pliablepixels/zmNinja/releases">here</a>. Its
always easier to debug on the desktop version - give it a try. If you
hit Shift+Cmd/Ctrl+D it brings up a debug window - it helps debugging</li>
<li>Always tell me what your ZoneMinder &amp; zmNinja versions are</li>
<li>If your app suddenly stopped working:<ul>
<li>Send me DEBUG logs of the app</li>
<li>tell me what changed (got to be something. You updated the app,
you upgraded ZM)</li>
<li>What exactly is not working?</li>
</ul>
</li>
</ul>
<div class="section" id="if-zmninja-does-not-start-on-your-device">
<h3>If zmNinja does not start on your device<a class="headerlink" href="#if-zmninja-does-not-start-on-your-device" title="Permalink to this headline">¶</a></h3>
<p>There are some odd cases, where zmNinja does not start (or gets stuck in the splash screen) on specific devices.
It is very hard for me to know why it fails on certain devices, but I can try. Here is what you need to do:</p>
<p>You have to send me system logs of the device. To get system logs:</p>
<ul class="simple">
<li>You will have to install ADB (Android Debug Bridge). It comes along with the Android SDK but if you don’t have the SDK (most won’t) you can refer to <a class="reference external" href="https://www.xda-developers.com/install-adb-windows-macos-linux/">https://www.xda-developers.com/install-adb-windows-macos-linux/</a></li>
<li>Once ADB is installed, connect the phone to the browser (make sure you have allowed debugging on the phone menu - it should ask) and type in <code class="docutils literal"><span class="pre">adb</span> <span class="pre">logcat</span> <span class="pre">&gt;result.txt</span></code> and try to start the app. A lot of logs will be generated. Please <a class="reference external" href="mailto:pliablepixels&#37;&#52;&#48;gmail&#46;com">email them to me</a></li>
</ul>
</div>
</div>
<div class="section" id="profile-information-storage-related">
<h2>Profile information storage related<a class="headerlink" href="#profile-information-storage-related" title="Permalink to this headline">¶</a></h2>
<div class="section" id="zmninja-is-not-saving-my-information-it-keeps-asking-me-to-re-enter-all-my-data">
<h3>zmNinja is not saving my information. It keeps asking me to re-enter all my data<a class="headerlink" href="#zmninja-is-not-saving-my-information-it-keeps-asking-me-to-re-enter-all-my-data" title="Permalink to this headline">¶</a></h3>
<p>I’ve seen this happen in two cases: * You are running out of space.
Clean up some space and try again * On specific Android devices,
typically running Android OS less than 6.0, some (2-3) users have
reported this issue. I still don’t have a good answer. Please update to
the latest app version and send me debug logs, please</p>
</div>
<div class="section" id="i-updated-my-zmninja-app-and-all-my-server-settings-were-cleared-why">
<h3>I updated my zmNinja app and all my server settings were cleared. Why?<a class="headerlink" href="#i-updated-my-zmninja-app-and-all-my-server-settings-were-cleared-why" title="Permalink to this headline">¶</a></h3>
<p>Sorry. I’ve made several releases where due to programming errors,
settings got wiped out. However, starting v1.3.021 for Android and
v1.3.025 for Android, I’ve introduced the facility to sync with the
cloud (Google Drive/iCloud). This is the settings option. It is enabled
by default. This means if you uninstall the app and install again, the
settings should get restored. Note that both in iOS and Android, backup
schedule is managed by the OS. You can force a backup going to settings
and forcing a backup, or wait till the OS backups (typically a few
hours/phone plugged in/not being used)</p>
<p>Do also note that 1.3.027 and beyond use a new WebView called WKWebView
(because iOS deprecated the old webview). If you disabled iCloud you
will have to re-enter your settings again (only once). This may not
affect Android, but I don’t know for sure.</p>
</div>
</div>
<div class="section" id="connection-authentication-issues">
<h2>Connection/Authentication issues<a class="headerlink" href="#connection-authentication-issues" title="Permalink to this headline">¶</a></h2>
<div class="section" id="general-tips">
<h3>General tips<a class="headerlink" href="#general-tips" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li>Disable server redirects like 302 and then try if using the mobile
app</li>
<li>To make sure there are no connection issues, launch your <strong>phone
browser</strong> and try to reach ZoneMinder. If that doesn’t work, neither
with zmNinja. Many users try to access ZoneMinder from a desktop
browser and/or on the same server it is running and forget the phone
is a different device!</li>
<li>Some phones need the SSL certificate installed in the device</li>
<li>Specific SSL settings can cause issues with Android or iOS</li>
<li>Don’t use funky/special characters in passwords - try changing it to
a complex password without funky characters and try</li>
<li>Use the wizard - I’ve seen many examples of typos when the user
thinks they don’t have a typo</li>
<li>If you are using basic authentication, make sure your credentials are
correct. A good way to test is to first disable basic auth and enable
it after you are sure things work without basic auth.</li>
<li>Please note zmNinja does NOT support Digest authentication. So please
don’t put in digest auth info when zmNinja asks for basic
authentication</li>
<li>Look at your ZM logs and zmNinja logs - they help isolate the problem</li>
</ul>
</div>
<div class="section" id="server-redirects">
<h3>Server Redirects<a class="headerlink" href="#server-redirects" title="Permalink to this headline">¶</a></h3>
<p>If the Wizard fails to connect in the mobile app but works in the
desktop app, it may be that your server is sending redirects.
Unfortunately, the current mobile HTTP stack doesn’t handle cookies with
redirects well. Till this bug is fixed by the plugin author Wizard won’t
work. Note that if you are running ZM 1.32 or above, you can directly
enter your settings without using the wizard and it will work because it
will try and use the new ZM 1.32 <code class="docutils literal"><span class="pre">login.json</span></code> API first.</p>
</div>
<div class="section" id="self-signed-certs">
<h3>Self signed certs<a class="headerlink" href="#self-signed-certs" title="Permalink to this headline">¶</a></h3>
<p>A lot of people use self-signed certs. I’d strongly recommend you use
<a class="reference external" href="https://letsencrypt.org">LetsEncrypt</a> if you can. It’s free. That
being said zmNinja does support self signed certs. Make sure “Enable
Strict SSL” is off in Developer settings. You will need to restart the
app.</p>
</div>
<div class="section" id="ssl-settings">
<h3>SSL settings<a class="headerlink" href="#ssl-settings" title="Permalink to this headline">¶</a></h3>
<p>If you are getting <code class="docutils literal"><span class="pre">SSL</span> <span class="pre">protocol/handshake</span> <span class="pre">errors</span></code> in your logs, you
very likely have specific ssl settings enabled server side that your
device network stack does not support. Note that just because it works
with the device browser does not mean it will work with zmNinja as
zmNinja does not use the browser HTTP implementation in mobile devices.</p>
<p>One use reported that a setting of <code class="docutils literal"><span class="pre">ssl_ecdh_curve</span> <span class="pre">secp384r1</span></code> in his
nginx config was resulting in zmNinja Android not being able to connect
to the server. Changing it to
<code class="docutils literal"><span class="pre">ssl_ecdh_curve</span> <span class="pre">secp521r1:secp384r1:prime256v1;</span></code> worked for him.</p>
<p>I’d strongly recommend you remove all special ssl settings except the
certificate and key file locations, make it work and then add the
settings back one by one and see what works/does not work.</p>
</div>
<div class="section" id="everything-works-when-i-use-lan-ip-but-i-get-not-authenticated-when-i-use-wan-ip">
<h3>Everything works when I use LAN IP, but I get “not authenticated” when I use WAN IP<a class="headerlink" href="#everything-works-when-i-use-lan-ip-but-i-get-not-authenticated-when-i-use-wan-ip" title="Permalink to this headline">¶</a></h3>
<p>This is likely happening if you use self signed SSL certs. If you are
using self signed certificated, you should make sure the “common name”
matches the hostname (or public IP) of the server you are installing ZM
in. If not, zmNinja’s SSL handshake will fail.</p>
<p>If you have used ‘make-ssl-cert’ or a similar tool that automatically
generates the cert for you, its very likely you have certificate that
uses the ‘unix hostname’ of your server. That will not work.</p>
<p>Assuming you are usin apache and have SSL enabled, here is how to
regenerate the certs (ubuntu specific, may need to tweak it for your
distro)</p>
<p>This will create a self-signed certificate/key pair and store it in
/etc/apache2/ssl (you may have to create that directory, or store it
elsewhere)</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">openssl</span> <span class="n">req</span> <span class="o">-</span><span class="n">x509</span> <span class="o">-</span><span class="n">nodes</span> <span class="o">-</span><span class="n">days</span> <span class="mi">365</span> <span class="o">-</span><span class="n">newkey</span> <span class="n">rsa</span><span class="p">:</span><span class="mi">2048</span> <span class="o">-</span><span class="n">keyout</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">apache2</span><span class="o">/</span><span class="n">ssl</span><span class="o">/</span><span class="n">zoneminder</span><span class="o">.</span><span class="n">key</span> <span class="o">-</span><span class="n">out</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">apache2</span><span class="o">/</span><span class="n">ssl</span><span class="o">/</span><span class="n">zoneminder</span><span class="o">.</span><span class="n">crt</span>
</pre></div>
</div>
<p>Next up, edit your apache ssl config (example
/etc/apache2/sites-available/default-ssl.conf) And add/modify the
following lines:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">SSLCertificateFile</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">apache2</span><span class="o">/</span><span class="n">ssl</span><span class="o">/</span><span class="n">zoneminder</span><span class="o">.</span><span class="n">crt</span>
<span class="n">SSLCertificateKeyFile</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">apache2</span><span class="o">/</span><span class="n">ssl</span><span class="o">/</span><span class="n">zoneminder</span><span class="o">.</span><span class="n">key</span>
</pre></div>
</div>
<p>restart apache</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">service</span> <span class="n">apache2</span> <span class="n">restart</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="live-streaming-issues">
<h2>Live streaming issues<a class="headerlink" href="#live-streaming-issues" title="Permalink to this headline">¶</a></h2>
<div class="section" id="summary-of-everything-works-but-i-can-t-see-live-feed">
<h3>Summary of Everything works, but I can’t see live feed<a class="headerlink" href="#summary-of-everything-works-but-i-can-t-see-live-feed" title="Permalink to this headline">¶</a></h3>
<p><em>Please</em> be diligent in reviewing this list. You’d be surprised how many
times I’ve had users tell me ‘they have checked this list’ only to find
out later they skimmed details.</p>
<ul class="simple">
<li>Please enable <code class="docutils literal"><span class="pre">AUTH_HASH_LOGINS</span></code> as well as set <code class="docutils literal"><span class="pre">AUTH_RELAY</span></code> to
“hashed”</li>
<li>You think your APIs are working, but they are really not. If you open
a browser and type in <code class="docutils literal"><span class="pre">https://yourserver/zm/api/monitors.json</span></code> and
you see some text on top followed by monitor data, your APIs are
<em>not</em> working. You need to search the forums and figure out how to
get rid of that text.</li>
<li>Your ZoneMinder live view from the web console doesn’t work either.
If this is the case, fix ZoneMinder first. Before you say “web
console works fine”, make sure you are running it from a different
computer from where ZM is running.</li>
<li>The phone/computer running zmNinja does not have access to your ZM
server. For example, many people test the web console on their LAN
but test zmninja on a WAN connection</li>
<li>Always try with the <a class="reference external" href="https://github.com/pliablepixels/zmNinja/releases">free desktop
version</a> first.
Enable debug view by hitting Ctrl/Cmd+Shift+D and you can see debug
logs in the console view. I can’t emphasize enough how useful this
is.</li>
<li>Your <code class="docutils literal"><span class="pre">cgi-bin</span></code> setting in zmNinja is incorrect. Please run the
wizard. There are times when the wizard can fail. In those cases,
open up ZM web console, go to view the monitor and do an “Inspect
Source” in the browser. That will show you the cgi-bin link that you
can use in zmNinja.</li>
</ul>
<p>For example:</p>
<p>In the above case my zmNinja cgi-bin setting is
<code class="docutils literal"><span class="pre">https://myserver:myport/zm/cgi-bin</span></code></p>
<ul class="simple">
<li>You are using Basic Authentication. See
<a class="reference external" href="#i-can-t-see-streams-i-use-basic-auth">here</a></li>
<li>You have ‘multi-server’ configuration enabled and you have done it
wrong. Go to ZM Web Console-&gt;Options-&gt;Servers - if you see any
entries there and you don’t know what multi-server is, or you don’t
use it, please disable multi-server</li>
<li>When trying to view live images, look at your <em>webserver</em> error logs
- example Apache’s <code class="docutils literal"><span class="pre">error.log</span></code> - see any image/jpg errors? That
means you are missing libraries</li>
<li>You have set up a multi-server install of ZM without knowing you did
See <a class="reference external" href="#i-can-t-see-streams-multi-server-is-enabled">here</a></li>
<li>Look at zmNinja, ZoneMinder and web server error logs at the time of
error - one of them should give more clues. Please send me <em>all</em> the
logs if you ask for help</li>
<li>Read the set of notes below</li>
</ul>
</div>
<div class="section" id="general-note">
<h3>General note<a class="headerlink" href="#general-note" title="Permalink to this headline">¶</a></h3>
<p>To debug streaming notes, always try with the free desktop version
first. When trying to stream simultaneously look at the debug logs of
zmNinja (<code class="docutils literal"><span class="pre">Ctrl/Cmd+Alt+D</span></code> in desktop build, console and/or network
tab) and your webserver error logs.</p>
</div>
<div class="section" id="i-can-t-see-stream-and-i-can-t-see-streams-in-zoneminder-webconsole-either">
<h3>I can’t see stream: And I can’t see streams in ZoneMinder webconsole either<a class="headerlink" href="#i-can-t-see-stream-and-i-can-t-see-streams-in-zoneminder-webconsole-either" title="Permalink to this headline">¶</a></h3>
<p>Check if streaming works in the web interface. If it does not work,
zmNinja won’t work either. Fix ZM first</p>
</div>
<div class="section" id="i-can-t-see-streams-i-use-basic-auth">
<h3>I can’t see streams: I use basic auth<a class="headerlink" href="#i-can-t-see-streams-i-use-basic-auth" title="Permalink to this headline">¶</a></h3>
<p>Starting Chrome v59, the browser changed basic credential behavior. The
issue report is
<a class="reference external" href="https://bugs.chromium.org/p/chromium/issues/detail?id=435547#c33">here</a>.
Here is the core issue: zmNinja constructs URLs as
<code class="docutils literal"><span class="pre">http://user:password&#64;server</span></code> when you have basic auth (and starting
v1.3 uses the <code class="docutils literal"><span class="pre">Authorization</span></code> header). However, since images are
rendered using <code class="docutils literal"><span class="pre">&lt;img</span> <span class="pre">src&gt;</span></code> there is no option but to put in a
<code class="docutils literal"><span class="pre">user:password</span></code> in the URL. Chrome allows this format for direct
requests (such as API calls) but will strip out the <code class="docutils literal"><span class="pre">user:password</span></code>
part for <em>embedded</em> requests (like <code class="docutils literal"><span class="pre">&lt;img</span> <span class="pre">src=&quot;&quot;&gt;</span></code> tags inside a page).
So what happens is your APIs work, but you won’t see images. There is a
reason why Chrome does this - its bad to pass on a user :password in a
URL as its clear text (even if you are on HTTPS, as its in the URL). As
I said earlier, The <em>right</em> way to do this is to replace the
<code class="docutils literal"><span class="pre">user:pass</span></code> with an <code class="docutils literal"><span class="pre">Authorization</span></code> header but there is no way to do
that with images that are rendered with <code class="docutils literal"><span class="pre">&lt;img</span> <span class="pre">src&gt;</span></code> (There are several
plugins that attempt to do this, but don’t work with streaming MJPEG
images). Bottom line, this is a problem for apps like zmNinja and it
affects you.</p>
<p>How this affects you: * If you are using HTTP Basic Authentication</p>
<p>Then your images won’t show.</p>
<p>Possible Workarounds: * Configure your web server to skip basic
authentication for <code class="docutils literal"><span class="pre">nph-zms</span></code> URLs * If you are using a ReverseProxy,
you can insert the authorization header inside the apache proxy *
Disable HTTP Basic auth for now * Downgrade Chrome</p>
<div class="section" id="skipping-auth-for-nph-zms-urls">
<h4>Skipping auth for <code class="docutils literal"><span class="pre">nph-zms</span></code> URLs<a class="headerlink" href="#skipping-auth-for-nph-zms-urls" title="Permalink to this headline">¶</a></h4>
<p>Here is what I’ve used that works with basic-auth. This requires a basic
auth portal login and once logged in allows skipping of image URLs (the
idea comes from <a class="reference external" href="https://github.com/adamoutler">Adam Outler</a> - he
uses a different approach using reverse proxies, which I link to later)</p>
<div class="code apache highlight-default"><div class="highlight"><pre><span></span>  <span class="c1"># this configuration assumes your server portal is server:port/zm</span>
  <span class="c1"># and cgi-path is /zm/cgi-bin. Please change it to your specific environment</span>
  <span class="c1"># Also requires Apache 2.4 or above</span>

<span class="o">&lt;</span><span class="n">Location</span> <span class="o">/&gt;</span>
      <span class="n">SetEnvIf</span> <span class="n">Request_URI</span> <span class="o">^/</span><span class="n">zm</span><span class="o">/</span><span class="n">cgi</span><span class="o">-</span><span class="nb">bin</span><span class="o">/</span> <span class="n">noauth</span><span class="o">=</span><span class="mi">1</span>
      <span class="n">SetEnvIf</span> <span class="n">Request_URI</span> <span class="o">^/</span><span class="n">zm</span><span class="o">/</span><span class="n">index</span><span class="o">.</span><span class="n">php</span> <span class="n">noauth</span><span class="o">=</span><span class="mi">1</span>
      <span class="n">AuthType</span> <span class="n">Basic</span>
      <span class="n">AuthName</span> <span class="s2">&quot;Auth Required&quot;</span>
      <span class="n">AuthUserFile</span> <span class="s2">&quot;/etc/apache2/.htpasswd&quot;</span>
      <span class="o">&lt;</span><span class="n">RequireAny</span><span class="o">&gt;</span>
          <span class="n">Require</span> <span class="n">valid</span><span class="o">-</span><span class="n">user</span>
          <span class="n">Require</span> <span class="n">env</span> <span class="n">noauth</span>
      <span class="o">&lt;/</span><span class="n">RequireAny</span><span class="o">&gt;</span>
<span class="o">&lt;/</span><span class="n">Location</span><span class="o">&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="authorization-with-a-reverseproxy">
<h4>Authorization with a ReverseProxy<a class="headerlink" href="#authorization-with-a-reverseproxy" title="Permalink to this headline">¶</a></h4>
<div class="section" id="simple-starter">
<h5>Simple starter<a class="headerlink" href="#simple-starter" title="Permalink to this headline">¶</a></h5>
<p><strong>STEP 1</strong>: Enable “Append basic auth tokens in images” option in
zmNinja-&gt;Developer Settings and save. What this does is that image URLs
will append a “basicauth” token parameter with your basic authentication
credentials. This token can then be parsed by Apache and inserted as a
valid Authorization header. Don’t enable this option if you are not
using HTTPS because the request-URI will be transmitted without
encryption and it will contain your basic auth credentials, encoded in
base64, which is trivial to decode.</p>
<p><strong>STEP 2 (Apache)</strong>: Use mod_rewrite and mod_header to convert the
token into an authorization in your Apache config. Add this to the
relevant section (<code class="docutils literal"><span class="pre">VirtualHost</span></code> or others)</p>
<div class="code apache highlight-default"><div class="highlight"><pre><span></span>RewriteEngine on
RewriteCond %{QUERY_STRING} (?:^|&amp;)basicauth=([^&amp;]+)
RewriteRule (.*) - [E=QS_TOKEN:%1]
RequestHeader set Authorization &quot;Basic %{QS_TOKEN}e&quot; env=QS_TOKEN
</pre></div>
</div>
<p><strong>STEP 2 (Nginx)</strong>: Thanks to user [&#64;ysammy](<a class="reference external" href="https://github.com/ysammy">https://github.com/ysammy</a>)</p>
<div class="code nginx highlight-default"><div class="highlight"><pre><span></span><span class="n">location</span> <span class="o">/</span><span class="n">zm</span><span class="o">/</span><span class="n">cgi</span><span class="o">-</span><span class="nb">bin</span><span class="o">/</span><span class="n">nph</span><span class="o">-</span><span class="n">zms</span> <span class="p">{</span>
   <span class="n">proxy_pass</span> <span class="n">http</span><span class="p">:</span><span class="o">//&lt;</span><span class="n">IP</span><span class="o">&gt;</span><span class="p">:</span><span class="o">&lt;</span><span class="n">PORT</span><span class="o">&gt;/</span><span class="n">zm</span><span class="o">/</span><span class="n">cgi</span><span class="o">-</span><span class="nb">bin</span><span class="o">/</span><span class="n">nph</span><span class="o">-</span><span class="n">zms</span><span class="p">;</span>
   <span class="n">proxy_set_header</span> <span class="n">Authorization</span> <span class="s2">&quot;Basic $arg_basicauth&quot;</span><span class="p">;</span>
 <span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="a-more-complete-and-more-secure-option">
<h5>A more complete and more secure option<a class="headerlink" href="#a-more-complete-and-more-secure-option" title="Permalink to this headline">¶</a></h5>
<p>User <a class="reference external" href="https://github.com/adamoutler">Adam Outler</a> has contributed the
following process: see
<a class="reference external" href="https://github.com/pliablepixels/zmNinja/wiki/Apache-Proxy-Authorization-with-HTTPS,-Basic-Auth,-and-ProxyPass">HERE</a>.
Adam also has this to say about why proxies should be recommended for
HTTPS enabled ZoneMinder instances:</p>
<blockquote>
<div>A proxy server should be on the list of recommendations for
Zoneminder. HTTPS requires processing to encrypt and decrypt. This
takes processor cycles away from Zoneminder’s recording. Since HTTPS
is now basically a requirement, there should be a page dedicated to
proxy, https, auth, and their nuances. I just picked up 2-4K cameras
and processing suddenly became an issue :).</div></blockquote>
</div>
</div>
</div>
<div class="section" id="i-can-t-see-streams-multi-server-is-enabled">
<h3>I can’t see streams: Multi-server is enabled<a class="headerlink" href="#i-can-t-see-streams-multi-server-is-enabled" title="Permalink to this headline">¶</a></h3>
<p>The chances are very high that you have enabled ZoneMinder’s
<a class="reference external" href="http://zoneminder.readthedocs.io/en/stable/installationguide/multiserver.html">Multi-Server</a>
option and you entered something like <code class="docutils literal"><span class="pre">localhost</span></code> in server settings.
<strong>DON’T. You can’t enter localhost</strong>. If you are not using multi-server,
remove any server settings. If you are using multi-server, you need to
put in a valid server IP or hostname, not <code class="docutils literal"><span class="pre">localhost</span></code>. BTW, if you did
put in <code class="docutils literal"><span class="pre">localhost</span></code> you will note that your ZM web console also won’t
work if you try to launch your browser on a different machine from where
ZM is running.</p>
</div>
<div class="section" id="i-can-t-see-streams-you-have-cgi-bin-issues">
<h3>I can’t see streams: you have cgi-bin issues<a class="headerlink" href="#i-can-t-see-streams-you-have-cgi-bin-issues" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li>Try to use the wizard. If it fails,</li>
<li>Go to zmNinja settings and fix your cgi-bin path. the automatic path
that is filled in won’t work. Here is a hint, go to
zoneminder-&gt;options-&gt;paths and check the value of the cgi-bin path -
your zmNinja path will be “base path of your server” + cgi-bin path.</li>
</ul>
</div>
<div class="section" id="zmninja-montage-does-not-seem-smooth-feeds-seem-a-little-delayed-compared-to-zm-console">
<h3>zmNinja montage does not seem smooth - feeds seem a little delayed compared to ZM console<a class="headerlink" href="#zmninja-montage-does-not-seem-smooth-feeds-seem-a-little-delayed-compared-to-zm-console" title="Permalink to this headline">¶</a></h3>
<p>zmNinja does not use <code class="docutils literal"><span class="pre">nph-zms</span></code> to display live feeds in montage. This
is because Chrome only allows a maximum of 6 connections per (sub)domain
which means you can’t have more than 6 active TCP connections to a
single domain at the same time. This also means that you can’t display
more than 6 monitors together. To avoid this, I use the zoneminder
“snapshot” feature that displays a still from the monitor and then
refresh it every X seconds (by default X=2 unless you switch to low
bandwidth mode. You can change X in developer settings)</p>
<p>That being said, starting v1.3.0 of zmNinja onwards, I now support
multi-port (available in ZM 1.32 onwards) that lets you stream as many
monitors as you need. Read
<a class="reference external" href="https://medium.com/zmninja/multi-port-storage-areas-and-more-d5836a336c93">this</a>
post for more details.</p>
</div>
</div>
<div class="section" id="event-images-streaming-related">
<h2>Event images/streaming related<a class="headerlink" href="#event-images-streaming-related" title="Permalink to this headline">¶</a></h2>
<div class="section" id="id1">
<h3>General note<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h3>
<p>To debug streaming notes, always try with the free desktop version
first. When trying to stream simultaneously look at the debug logs of
zmNinja (<code class="docutils literal"><span class="pre">Ctrl/Cmd+Alt+D</span></code> in desktop build, console and/or network
tab) and your webserver error logs.</p>
<p>Also, Starting ZM 1.32 and beyond, please enable <code class="docutils literal"><span class="pre">AUTH_HASH_LOGINS</span></code> as
well as set <code class="docutils literal"><span class="pre">AUTH_RELAY</span></code> to “hashed”</p>
</div>
<div class="section" id="event-stream-viewing-does-not-work">
<h3>Event stream viewing does not work<a class="headerlink" href="#event-stream-viewing-does-not-work" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li>Look at apache error logs - it often gives you hints</li>
</ul>
</div>
<div class="section" id="video-not-playable">
<h3>Video Not Playable<a class="headerlink" href="#video-not-playable" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li>Mobile devices have more restrictions to video playback than
destkops. Make sure you first check if the video is playable in
Chrome using the same phone you are using zmNinja on</li>
<li>There could be other reasons due to which the video is not playable:</li>
<li>There is an encoding issue in the video generated</li>
<li>The video resolution is too big (see <a class="reference external" href="https://forums.zoneminder.com/viewtopic.php?f=33&amp;p=108788#p108774">this
thread</a>)</li>
<li>In general, to get to the root of what is going on, you’ll need
device logs using ADB (see
<a class="reference external" href="https://forums.zoneminder.com/viewtopic.php?f=33&amp;p=108788#p108753">this</a>)</li>
</ul>
</div>
<div class="section" id="event-thumbnails-images-don-t-show">
<h3>Event thumbnails/images don’t show<a class="headerlink" href="#event-thumbnails-images-don-t-show" title="Permalink to this headline">¶</a></h3>
<p>Starting zmNinja 1.3.26 and beyond, if you are using OPT_AUTH you need
to enable AUTH_HASH_LOGINS or you won’t be able to see image snapshots
and thumbnails. Only applicable for mobiles.</p>
</div>
<div class="section" id="when-viewing-individual-frames-some-event-frames-show-but-some-don-t">
<h3>When viewing individual frames, some event frames show, but some don’t<a class="headerlink" href="#when-viewing-individual-frames-some-event-frames-show-but-some-don-t" title="Permalink to this headline">¶</a></h3>
<p>This can happen if you are using Video Storage (Passthru or X264 Encode)
and have disabled frame (JPEG) storage completely. What happens is
ZoneMinder uses <code class="docutils literal"><span class="pre">ffmpeg</span></code> to extract frames from timestamps and
sometimes it is unable to extract a frame for a specific timestamp,
resulting in this issue. If you see HTTP 404 messages for some frames,
but the video plays fine, then this is why.</p>
</div>
<div class="section" id="zmninja-montage-screen-shows-all-my-monitors-but-in-event-montage-i-only-see-5">
<h3>zmNinja montage screen shows all my monitors, but in Event Montage, I only see 5?<a class="headerlink" href="#zmninja-montage-screen-shows-all-my-monitors-but-in-event-montage-i-only-see-5" title="Permalink to this headline">¶</a></h3>
<p>You are likely using Chrome (Android or desktop version). Chrome allows
a total of 6 simultaneous connections to a domain/sub-domain. ZoneMinder
uses a long running TCP stream for each monitor display (keeps sending
jpeg images). This means you can only display 6 streams at a time in
Chrome. I work around this problem by <em>not</em> asking for live streams in
montages - I ask for ‘snapshots’ and keep refreshing snapshots every 2
seconds. This makes montage display non-realtime, but scales to as many
monitors you have. In Event Montage however, I am using zms to display
long running streams - trying to do snapshots in event montage is a lot
of work and I need to keep track of when the event ends, move to next
image etc. I limit this to 5 because I need 1 for control messages.</p>
</div>
</div>
<div class="section" id="other-misc-issues">
<h2>Other misc. issues<a class="headerlink" href="#other-misc-issues" title="Permalink to this headline">¶</a></h2>
<div class="section" id="i-suddently-see-an-error-message-saying-i-need-to-enable-zm-auth-hash-logins-this-wasn-t-there-before">
<h3>I suddently see an error message saying I need to enable ZM_AUTH_HASH_LOGINS. This wasn’t there before<a class="headerlink" href="#i-suddently-see-an-error-message-saying-i-need-to-enable-zm-auth-hash-logins-this-wasn-t-there-before" title="Permalink to this headline">¶</a></h3>
<p>Yes. Starting 1.3.027 onwards, due to a new UI web rendering engine that
enforces CORS, I’ve had to change my strategy on how network calls are
made. Briefly, on mobile devices, I now use a native HTTP stack and not
the browser HTTP stack. However, images are rendered using the browser
HTTP stack which causes this message. In short, you need to enable it,
and restart ZM.</p>
</div>
<div class="section" id="zmninja-1-2-515-and-beyond-says-need-api-upgrade-for-the-24hr-review-feature-what-does-that-mean">
<h3>zmNinja 1.2.515 and beyond says “Need API Upgrade” for the 24hr review feature. What does that mean?<a class="headerlink" href="#zmninja-1-2-515-and-beyond-says-need-api-upgrade-for-the-24hr-review-feature-what-does-that-mean" title="Permalink to this headline">¶</a></h3>
<p>You need to update an API file in Zoneminder server. ZoneMinder folks
haven’t yet (as of Apr 2018) made a release with that API change. To do
it manually,simply replace your <code class="docutils literal"><span class="pre">EventsController.php</span></code> (typically in
<code class="docutils literal"><span class="pre">/usr/share/zoneminder/www/api/app/Controller</span></code>) with <a class="reference external" href="https://raw.githubusercontent.com/ZoneMinder/zoneminder/85b7baa13178a838fe9fae94405c99fe7d2c669c/web/api/app/Controller/EventsController.php">this
one</a>.</p>
</div>
<div class="section" id="i-upgraded-zoneminder-to-1-30-2-or-above-and-zmninja-stopped-working">
<h3>I upgraded ZoneMinder to 1.30.2 or above and zmNinja stopped working!<a class="headerlink" href="#i-upgraded-zoneminder-to-1-30-2-or-above-and-zmninja-stopped-working" title="Permalink to this headline">¶</a></h3>
<p>ZoneMinder changed API packaging with ZM 1.30.2 and above. You will have
to read your distro notes on how to <strong>properly</strong> update. Read
<a class="reference external" href="https://forums.zoneminder.com/viewtopic.php?f=36&amp;t=26002&amp;start=30&amp;hilit=api+broken">this</a>
thread. Before you think zmNinja is the problem, make sure your APIs
are working (see <a class="reference internal" href="validating-api.html"><span class="doc">Validating APIs</span></a>)</p>
<p>Summary of reasons why zmNinja might have stopped working: - You did not
check if your APIs are working after the upgrade - You did not upgrade
properly (just updating the ZM package without following distro
instructions with ZM is not sufficient) - You are missing some key
CakePHP modules, likely <code class="docutils literal"><span class="pre">php5-apc</span></code> which would have been installed if
you read all the package instructions. You can install it manually - You
might need to restart your system after upgrading (properly)</p>
</div>
<div class="section" id="i-am-running-zm-on-a-custom-port-zmninja-is-unable-to-reach-my-zoneminder-server-but-i-tried-on-a-regular-browser-firefox-opera-ie-and-it-i-can-reach-it">
<h3>I am running ZM on a custom port. zmNinja is unable to reach my ZoneMinder server but I tried on a regular browser (Firefox/Opera/IE) and it I can reach it<a class="headerlink" href="#i-am-running-zm-on-a-custom-port-zmninja-is-unable-to-reach-my-zoneminder-server-but-i-tried-on-a-regular-browser-firefox-opera-ie-and-it-i-can-reach-it" title="Permalink to this headline">¶</a></h3>
<p>zmNinja on Android and Desktops uses an embedded chrome browser. Chrome
marks certain ports as “unsafe” and won’t allow connections to go out.
The list of ports to avoid are
<a class="reference external" href="http://tech-stuff.org/which-ports-are-considered-unsafe-in-browsers/">here</a></p>
</div>
<div class="section" id="the-montage-screen-is-causing-issues-with-my-zm-server-i-get-connection-timeout-issues-or-mysql-connection-problems">
<h3>The Montage screen is causing issues with my ZM server - I get connection timeout issues or MySQL connection problems<a class="headerlink" href="#the-montage-screen-is-causing-issues-with-my-zm-server-i-get-connection-timeout-issues-or-mysql-connection-problems" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li>zmNinja uses a different approach to display montage than ZoneMinder.
In zmNinja montage screen, I display a snapshot of each monitor and
refresh it every few seconds. This results in many short TCP
connections constantly being opened and closed. The reason I have to
do this is Chrome only allows 6 connections to a domain, which means
if I don’t keep terminating TCP connections, I won’t be able to show
more than 6 monitors. Each time I open a new TCP connection for a
snapshot, the ZM backend invokes mySQL to authenticate the request.
You will need to increase mySQL <code class="docutils literal"><span class="pre">max_connections</span></code> in <code class="docutils literal"><span class="pre">my.cnf</span></code> if
you are facing time_wait/timeout issues.</li>
</ul>
</div>
<div class="section" id="the-app-works-great-except-it-doesn-t-work-on-one-android-phone-works-in-others">
<h3>The app works great - except it doesn’t work on ONE Android phone - works in others!<a class="headerlink" href="#the-app-works-great-except-it-doesn-t-work-on-one-android-phone-works-in-others" title="Permalink to this headline">¶</a></h3>
<p>zmNinja uses an embedded chrome browser in its app. If you have safe
browsing enabled, it may affect zmNinja. However, if you are facing this
problem, its likely you can’t access ZM from a mobile web browser
either. The problem that might be occurring is that zmNinja is trying to
reach your ZM server and your settings prohibit it from reaching ZM, so
it fails. See
<a class="reference external" href="https://forums.zoneminder.com/viewtopic.php?f=33&amp;t=25946">this</a>
discussion</p>
</div>
<div class="section" id="apis-are-not-working-zm-console-works-fine">
<h3>APIs are not working ! ZM console works fine.<a class="headerlink" href="#apis-are-not-working-zm-console-works-fine" title="Permalink to this headline">¶</a></h3>
<p><a class="reference internal" href="validating-api.html"><span class="doc">Validating APIs</span></a></p>
</div>
<div class="section" id="i-m-using-mocord-record-and-i-don-t-see-events-without-alarms">
<h3>I’m using mocord/record and I don’t see events without alarms<a class="headerlink" href="#i-m-using-mocord-record-and-i-don-t-see-events-without-alarms" title="Permalink to this headline">¶</a></h3>
<p>Tap on the “…” menu option and toggle “Show all events”. By default,
it shows events with at least one alarm frame</p>
</div>
<div class="section" id="taking-snapshots-or-downloading-videos-don-t-work-in-android">
<h3>Taking snapshots or downloading videos don’t work in Android<a class="headerlink" href="#taking-snapshots-or-downloading-videos-don-t-work-in-android" title="Permalink to this headline">¶</a></h3>
<p>If you are unable to download/save, look at your logs. If you see
something like
<code class="docutils literal"><span class="pre">&quot;exception&quot;:&quot;java.security.cert.CertPathValidatorException:</span> <span class="pre">Trust</span> <span class="pre">anchor</span> <span class="pre">for</span> <span class="pre">certification</span> <span class="pre">path</span> <span class="pre">not</span> <span class="pre">found.&quot;</span></code>
, chances are you are using self-signed certs. You need to install the
certificate on your phone. Installing is as easy as emailing yourself
the “.crt” file and tapping on it from your device to install it. In
general, both Apple and Google have been incrementally tightening rules
for self signed certificates - they generally discourage usage of such
certs and over time both Chrome (Android) and WkWebView (iOS) have added
new restrictions/checks which affects usage.</p>
</div>
<div class="section" id="pan-tilt-zoom-doesn-t-work">
<h3>Pan/Tilt/Zoom doesn’t work<a class="headerlink" href="#pan-tilt-zoom-doesn-t-work" title="Permalink to this headline">¶</a></h3>
<p>Tilt/Zoom/Presets support has not been added. But for this to work, PTZ
needs to work in ZM first. Once it works in ZM, try it in ZMNinja. Also
note that you may need to disable CSRF in your Options in ZoneMinder -
it seems to cause all sorts of issues.</p>
</div>
</div>
<div class="section" id="what-is-this-event-server">
<h2>What is this Event Server?<a class="headerlink" href="#what-is-this-event-server" title="Permalink to this headline">¶</a></h2>
<p>The Event Server is a contribution I made to ZoneMinder that adds a
daemon to the existing list. It listens for new events using shared
memory (aka very efficient) and then sends notifications of events to
listeners (you can write your own app that listen as well as use
zmNinja). This is a chapter on its own, and I have a dedicated
page/project for this
<a class="reference external" href="https://github.com/pliablepixels/zmeventserver">here</a>. I’d encourage
you to install and use it - its very nice.</p>
<div class="section" id="it-looks-like-you-allow-me-to-modify-the-frequency-of-push-notifications-very-cool-will-it-send-me-all-events-that-i-missed-if-i-make-the-frequency-of-a-monitor-event-push-to-say-600-seconds">
<h3>It looks like you allow me to modify the frequency of push notifications. Very cool - will it send me all events that I missed if I make the frequency of a monitor event push to say, 600 seconds?<a class="headerlink" href="#it-looks-like-you-allow-me-to-modify-the-frequency-of-push-notifications-very-cool-will-it-send-me-all-events-that-i-missed-if-i-make-the-frequency-of-a-monitor-event-push-to-say-600-seconds" title="Permalink to this headline">¶</a></h3>
<p>Nope. It only sends the latest events. What it does is before sending
push notifications, it checks if the last time a push was sent for this
monitor is &lt; the time you specified. If it is, it does not send. That’s
all.</p>
</div>
</div>
<div class="section" id="is-zmninja-free">
<h2>Is zmNinja free?<a class="headerlink" href="#is-zmninja-free" title="Permalink to this headline">¶</a></h2>
<p>The source code is free, grab it, compile it, use it. The desktop ports
are free as of today. I may charge for it some day. The mobile ports are
in Appstore/Playstore for a fee.</p>
</div>
<div class="section" id="who-are-the-developers-behind-this">
<h2>Who are the developers behind this?<a class="headerlink" href="#who-are-the-developers-behind-this" title="Permalink to this headline">¶</a></h2>
<p>Me.</p>
</div>
<div class="section" id="the-code-needs-improvement">
<h2>The code needs improvement<a class="headerlink" href="#the-code-needs-improvement" title="Permalink to this headline">¶</a></h2>
<p>You are being nice. I know the code is terrible. I’m not a coder by
profession. This was my first project to learn how to write a mobile
app. So the app evolved from no knowledge to some knowledge. It
comprises of terrible to passable to reasonable code. There is a reason
why my <a class="reference external" href="https://github.com/pliablepixels">profile</a> says what it says.
But hey, if you can improve it, please PR!</p>
</div>
<div class="section" id="is-zmninja-an-official-zoneminder-product">
<h2>Is zmNinja an official ZoneMinder product?<a class="headerlink" href="#is-zmninja-an-official-zoneminder-product" title="Permalink to this headline">¶</a></h2>
<p>No. But the ZM developers are amazing people who have been very helpful.</p>
</div>
<div class="section" id="i-want-to-donate-money">
<h2>I want to donate money<a class="headerlink" href="#i-want-to-donate-money" title="Permalink to this headline">¶</a></h2>
<p>You could either <a class="reference external" href="https://www.bountysource.com/teams/zoneminder">donate to to
Zoneminder</a> or <a class="reference external" href="https://salt.bountysource.com/teams/zmninja">donate
to zmNinja</a>. Donations
to ZoneMinder don’t contribute to zmNinja, but the ZoneMinder devs will
benefit from it, which is fine too.</p>
</div>
<div class="section" id="how-does-zmninja-use-my-personal-data">
<h2>How does zmNinja use my personal data?<a class="headerlink" href="#how-does-zmninja-use-my-personal-data" title="Permalink to this headline">¶</a></h2>
<p>Please read
<a class="reference external" href="https://medium.com/zmninja/zmninja-privacy-and-your-data-5489a5974baf">this</a></p>
</div>
<div class="section" id="i-want-to-donate-time-expertise-code">
<h2>I want to donate time/expertise/code<a class="headerlink" href="#i-want-to-donate-time-expertise-code" title="Permalink to this headline">¶</a></h2>
<p>Great. Make sure you read the
<a class="reference external" href="https://github.com/pliablepixels/zmNinja/blob/master/LICENSE">license</a>
, read the <a class="reference external" href="https://github.com/pliablepixels/zmNinja/blob/master/CONTRIBUTING.md">contributing
guidelines</a>
and if it works for you, happy to see what you’d like to do.</p>
</div>
</div>


           </div>
           <div class="articleComments">
            
           </div>
          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="validating-api.html" class="btn btn-neutral float-right" title="Validating APIs" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="../index.html" class="btn btn-neutral" title="Welcome to zmNinja’s documentation!" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; Copyright 2019, Pliable Pixels.

    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. 

</footer>

        </div>
      </div>

    </section>

  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'../',
            VERSION:'',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true,
            SOURCELINK_SUFFIX: '.txt'
        };
    </script>
      <script type="text/javascript" src="../_static/jquery.js"></script>
      <script type="text/javascript" src="../_static/underscore.js"></script>
      <script type="text/javascript" src="../_static/doctools.js"></script>

  

  
  
    <script type="text/javascript" src="../_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      });
  </script>
   

</body>
</html>