Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

shack_open_close_monitor [2012/11/29 19:06]
82.212.50.234
shack_open_close_monitor [2017/01/05 12:14] (aktuell)
95.208.82.193
Zeile 1: Zeile 1:
 ====== shack open/close monitor ======= ====== shack open/close monitor =======
-{{tags> project infrastructure shackoperations process hardware software }}+{{tag> project infrastructure shackoperations process hardware software ​needs-rewrite}}
  
 das open/​close-monitoring basiert auf der annahme, dass die shack-tuere nur unverschlossen ist, das open/​close-monitoring basiert auf der annahme, dass die shack-tuere nur unverschlossen ist,
Zeile 7: Zeile 7:
 ===== abstract ===== ===== abstract =====
  
-der server erhaelt einen cron-job der alle 2 minuten ein cgi-script auf einem webserver aufruft, das wiederum eine flag-datei schreibt.+der server erhaelt einen cron-job der alle 2 minuten ein cgi-script auf einem webserver aufruft, das wiederum eine von zwei flag-dateien ​schreibt
 +welche flag-datei geschrieben wird, ist abhaengig davon, ob der status "​open"​ oder "​closed"​ uebermittelt wird.  
 +die jeweils nicht geschriebene flag-datei wird dabei geloescht.
 auf dem webserver wird jede minute geprueft, ob diese datei aelter als 3 minuten ist, in diesem falle wird sie geloescht. auf dem webserver wird jede minute geprueft, ob diese datei aelter als 3 minuten ist, in diesem falle wird sie geloescht.
  
-das cgi-script gibt bei aufruf ohne parameter ein pixel als gif zurueck, das abhaengig von der existenz der flagdatei ​gruen (vorhanden) ​oder rot (fehlt) ist.+das cgi-script gibt bei aufruf ohne parameter ein pixel als gif zurueck, das abhaengig von der existenz der flagdateien ​gruen (vorhanden,  offen),  
 +rot (vorhanden, closed) oder grau (fehlen) ist.
  
 dieses pixel wird vergroessert aus der passenden wiki-seite heraus aufgerufen dieses pixel wird vergroessert aus der passenden wiki-seite heraus aufgerufen
Zeile 32: Zeile 35:
  
 ===== details & implementierung ===== ===== details & implementierung =====
 +
 +----
 +**Dieser Teil ist obsolet und benötigt einen Neuschrieb**
 +----
  
 in der tuerzarge ist in die oeffnung fuer den schliessriegel ein reedkontakt mit expoxidharz eingeklebt. in der tuerzarge ist in die oeffnung fuer den schliessriegel ein reedkontakt mit expoxidharz eingeklebt.
Zeile 43: Zeile 50:
 das programm ''/​usr/​local/​app/​shackdoor/​shackdoor''​ setzt RTS und prueft daraufhin DSR. je nach stand des schalters ergibt sich das das programm ''/​usr/​local/​app/​shackdoor/​shackdoor''​ setzt RTS und prueft daraufhin DSR. je nach stand des schalters ergibt sich das
 eine oder andere ergebnis. da aufgrund der etwa 40-50 m leitungslaenge und des bei geoeffneter tuere hohen abschlusswiderstands eine oder andere ergebnis. da aufgrund der etwa 40-50 m leitungslaenge und des bei geoeffneter tuere hohen abschlusswiderstands
-die signalqualitaet schlecht ist, laesst sich die offene tuer nicht immer eindeutig erkennen. also findet die abfrage einfach ​ +die signalqualitaet schlecht ist, laesst sich die offene tuer nicht immer eindeutig erkennen ​(und seltsamer weise seit januar 2015  
-20 mal statt. das ging schneller, als an der verkabelung weitere schaltmittel anzubringen.+auch der geschlossene kontakt nicht mehr). also findet die abfrage einfach 20 mal statt. das ging schneller, als an  
 +der verkabelung weitere schaltmittel anzubringen.
  
 <file txt shackdoor.c>​ <file txt shackdoor.c>​
Zeile 155: Zeile 163:
 </​file>​ </​file>​
  
-der tuerstatus-vserver ​prueft ​alle 2 minuten ​per cronjob den zustand des tuerkontakts:​+die tuerstatus-kvm prueft ​jede minute ​per cronjob den zustand des tuerkontakts:​
  
 <file txt /​etc/​cron.d/​sopen-shack>​ <file txt /​etc/​cron.d/​sopen-shack>​
-0-59/* * * * nobody /​usr/​local/​app/​shackdoor/​sopen-client 2>&1 | logger+0-59/* * * * nobody /​usr/​local/​app/​shackdoor/​sopen-client 2>&1 | logger
 </​file>​ </​file>​
  
-sopen-client fragt den zustand der tuere ab und setzt bei geoeffneter tuere einen http-request an shackspace.de ab:+sopen-client fragt den zustand der tuere ab und setzt einen http-request an shackspace.de ab
 +der den zustand uebermittelt:
  
 <file txt /​usr/​local/​app/​shackdoor/​sopen-client>​ <file txt /​usr/​local/​app/​shackdoor/​sopen-client>​
 #!/bin/bash #!/bin/bash
 +
 +set -u 
 +
 +#old# closed loop (=closed door) is more reliable to detect.
 +#old# so, if there are $CHECKS checks in favour to the door
 +#old# being closed, we might assume that this is the case.
 +# as of 2015-01 things got fishy
 +# so we just look who got the most votes
 +#
 +
 +DEV=/​dev/​ttyUSB0
 +
 +if [ ! -e "​$DEV"​ ]; then 
 +        logger -t "​sopen-client"​ "'​$DEV'​ missing: $( ls -ld /dev )"
 +        exit 
 +fi
 +
 +CHECKS=20
 +QUOTA=$(( $CHECKS / 2 ))
  
 FLAG=0 FLAG=0
-for i in {1..20} ; do +for i in $( seq $CHECKS ); do 
         if [ x`/​usr/​local/​app/​shackdoor/​shackdoor /​dev/​ttyUSB0` = xDSR ] ; then         if [ x`/​usr/​local/​app/​shackdoor/​shackdoor /​dev/​ttyUSB0` = xDSR ] ; then
                 FLAG=$(( $FLAG + 1 ))                  FLAG=$(( $FLAG + 1 )) 
         fi         fi
 done done
 +echo FLAG=$FLAG
  
-if [ "​$FLAG" ​= 0 ] ; then +if [ "​$FLAG" ​-lt "​$QUOTA" ​] ; then 
-         echo -e -n "GET /​sopen/​************ HTTP/​1.0\r\nHost:​ shackspace.de\r\n\r\n"​ | nc shackspace.de 80+         echo -e -n "GET /sopen/​open/​************ HTTP/​1.0\r\nHost:​ shackspace.de\r\n\r\n"​ | nc shackspace.de 80 
 +else  
 +         echo -e -n "GET /​sopen/​closed/​************ HTTP/​1.0\r\nHost:​ shackspace.de\r\n\r\n"​ | nc shackspace.de 80
 fi fi
 </​file>​ </​file>​
-da die erkennung der dsr-leitung nicht in jedem falle funktioniert, wird sie mehrfach abgefragt. + 
-moegliche ursache koennte evtldie leitungslaenge sein+=== trouble === 
-      +die erkennung der dsr-leitung ​funktioniert ​nicht in jedem falle zuverlaessiginsbesondere der  
 +zustand "tuere offen",​ bei dem die Leiterschleife geoeffnet ist, ist verrauscht, weil hochohmig. 
 +das sieht dann so aus: 
 + 
 +{{http://​shackspace.de/​projects/​chris/​shack-status/​shackstatus-signal.gif}} 
 + 
 +die leitungslaenge macht das sicher nicht besser. daher wird der zustand ​mehrfach abgefragt 
 +und eine mehrheitsentscheidung getroffen
 + 
 +das usb-rs232-dingsy faellt manchmal logisch vom host und braucht dann einen powercycle 
 +(aus- und wieder einstecken)deshalb prueft sopen-client extra, ob /​dev/​ttyUSB0 da ist
 ==== auf shackspace.de ==== ==== auf shackspace.de ====
  
Zeile 187: Zeile 229:
 #​!/​usr/​bin/​perl -Tw #​!/​usr/​bin/​perl -Tw
 # Thu Nov 29 17:52:13 CET 2012, chris # Thu Nov 29 17:52:13 CET 2012, chris
 +# Wed Jan  7 11:35:36 CET 2015, chris
 +# - added three-state display
 +
 # - Doku hier: # - Doku hier:
 # - http://​shackspace.de/​wiki/​doku.php?​id=shack_open_close_monitor # - http://​shackspace.de/​wiki/​doku.php?​id=shack_open_close_monitor
Zeile 192: Zeile 237:
 use strict; use strict;
  
-my $uri = "/​sopen/​************";​+my $uri_c = "/​sopen/closed/**********";​ 
 +my $uri_o = "/​sopen/​open/​**********";​
 my $uri_text_de = "/​sopen/​text/​de";​ my $uri_text_de = "/​sopen/​text/​de";​
 my $uri_text_en = "/​sopen/​text/​en";​ my $uri_text_en = "/​sopen/​text/​en";​
Zeile 207: Zeile 253:
  
 # korrekte uri setzt flag file # korrekte uri setzt flag file
-$request_uri eq $uri and do {+$request_uri eq $uri_o and do {
  open F,">"​.$statfilename or die "​can'​t open '​$statfilename':​ $!";  open F,">"​.$statfilename or die "​can'​t open '​$statfilename':​ $!";
- print F time ,"​\n";​+ print F time ," ​OPEN\n";
  close F;  close F;
  -e $trackfilenameon or do {  -e $trackfilenameon or do {
Zeile 218: Zeile 264:
  -e $trackfilenameoff and do {  -e $trackfilenameoff and do {
  unlink $trackfilenameoff;​  unlink $trackfilenameoff;​
 + };
 +
 + print "​Content-Type:​ text/​plain\n\n1\n";​
 + exit;
 +};
 +# else if
 +$request_uri eq $uri_c and do {
 + open F,">"​.$statfilename or die "​can'​t open '​$statfilename':​ $!";
 + print F time ," CLOSED\n";​
 + close F;
 + -e $trackfilenameon and do {
 + unlink $trackfilenameon;​
 + };
 + -e $trackfilenameoff or do {
 + open F,">"​.$trackfilenameoff or die "​can'​t open '​$trackfilenameoff':​ $!";
 + print F time ,"​\n";​
 + close F;
  };  };
  
Zeile 226: Zeile 289:
 $request_uri eq $uri_text_de and do { $request_uri eq $uri_text_de and do {
  print "​Content-Type:​ text/​plain\n\n";​  print "​Content-Type:​ text/​plain\n\n";​
- -f $statfilename ​and do {+ -f $trackfilenameon ​and do {
  print "​offen\n";​  print "​offen\n";​
- } or do { + } or -f $trackfilenameoff and do {
  print "​geschlossen\n";​  print "​geschlossen\n";​
 + } or do { 
 + print "keine Daten\n";​
  };  };
  exit;  exit;
Zeile 236: Zeile 301:
 $request_uri eq $uri_text_en and do { $request_uri eq $uri_text_en and do {
  print "​Content-Type:​ text/​plain\n\n";​  print "​Content-Type:​ text/​plain\n\n";​
- -f $statfilename ​and do {+ -f $trackfilenameon ​and do {
  print "​open\n";​  print "​open\n";​
- } or do { + } or -f $trackfilenameoff and do {
  print "​closed\n";​  print "​closed\n";​
 + } or do { 
 + print "no data\n";​
  };  };
  exit;  exit;
Zeile 246: Zeile 313:
 $request_uri eq $uri_img_png and do { $request_uri eq $uri_img_png and do {
  print "​Content-Type:​ image/​png\n\n";​  print "​Content-Type:​ image/​png\n\n";​
- -f $statfilename ​and do {+ -f $trackfilenameon ​and do {
  # pixel gruen  # pixel gruen
  print ​  print ​
Zeile 259: Zeile 326:
  "​\0\0\0\7\164\111\115\105\7\333\13\27\7\64\73\1\135\24\55\0\0\0",​  "​\0\0\0\7\164\111\115\105\7\333\13\27\7\64\73\1\135\24\55\0\0\0",​
  "​\0\111\105\116\104\256\102\140\202";​  "​\0\111\105\116\104\256\102\140\202";​
- } or do { + } or -f $trackfilenameoff and do {
  # pixel rot  # pixel rot
  print  print
Zeile 272: Zeile 339:
  "​\115\105\7\333\13\27\7\65\17\71\362\321\331\0\0\0\0\111\105\116",​  "​\115\105\7\333\13\27\7\65\17\71\362\321\331\0\0\0\0\111\105\116",​
  "​\104\256\102\140\202";​  "​\104\256\102\140\202";​
 + } or do {
 + # pixel grey
 + print
 + "​\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122\0\0\0\1\0",​
 + "​\0\0\1\1\3\0\0\0\45\333\126\312\0\0\0\4\147\101\115\101\0\0\261",​
 + "​\217\13\374\141\5\0\0\0\3\120\114\124\105\177\177\177\220\312\33",​
 + "​\43\0\0\0\70\164\105\130\164\123\157\146\164\167\141\162\145\0\130",​
 + "​\126\40\126\145\162\163\151\157\156\40\63\56\61\60\141\40\40\122",​
 + "​\145\166\72\40\61\62\57\62\71\57\71\64\40\50\120\116\107\40\160\141",​
 + "​\164\143\150\40\61\56\62\51\335\25\56\111\0\0\0\12\111\104\101\124",​
 + "​\10\231\143\140\0\0\0\2\0\1\364\161\144\246\0\0\0\7\164\111\115\105",​
 + "​\7\337\1\7\13\12\35\32\267\176\341\0\0\0\0\111\105\116\104\256\102",​
 + "​\140\202";​
  };  };
  exit;  exit;
Zeile 278: Zeile 358:
 $request_uri eq $uri_imgtxt_png and do { $request_uri eq $uri_imgtxt_png and do {
  print "​Content-Type:​ image/​png\n\n";​  print "​Content-Type:​ image/​png\n\n";​
- -f $statfilename ​and do {+ -f $trackfilenameon ​and do {
  # image text gruen  # image text gruen
  print ​  print ​
Zeile 312: Zeile 392:
  ;  ;
  #perl -e '​$/​="";​$c=0;​for (split //,<>​) { printf "​\\%o",​ord($_);​ ++$c%14 or print "​\n"​}'​ ~chris/​open.png  #perl -e '​$/​="";​$c=0;​for (split //,<>​) { printf "​\\%o",​ord($_);​ ++$c%14 or print "​\n"​}'​ ~chris/​open.png
- } or do { + } or -f $trackfilenameoff and do {
  # image text rot  # image text rot
  print  print
Zeile 349: Zeile 429:
  "​\102\140\202",​  "​\102\140\202",​
  ;  ;
- # perl -e '​$/​="";​$c=0;​for (split //,<>​) { printf "​\\%o",​ord($_);​ ++$c%14 or print "​\",​\n\t\t\t\""​}' ​~chris/​closed.png+ } or do { 
 + # image text grey 
 + print 
 + "​\211\120\116\107\15\12\32\12\0\0\0\15\111\110",​ 
 + "​\104\122\0\0\0\72\0\0\0\25\10\3\0\0",​ 
 + "​\0\40\237\15\371\0\0\0\4\147\101\115\101\0",​ 
 + "​\0\261\217\13\374\141\5\0\0\0\146\120\114\124",​ 
 + "​\105\172\172\172\176\176\176\203\203\203\204\204\204\210",​ 
 + "​\210\210\215\215\215\223\223\223\227\227\227\230\230\230",​ 
 + "​\235\235\235\240\240\240\245\245\245\251\251\251\255\255",​ 
 + "​\255\260\260\260\266\266\266\271\271\271\274\274\274\303",​ 
 + "​\303\303\305\305\305\314\314\314\316\316\316\324\324\324",​ 
 + "​\327\327\327\331\331\331\337\337\337\340\340\340\344\344",​ 
 + "​\344\351\351\351\355\355\355\362\362\362\364\364\364\373",​ 
 + "​\373\373\377\377\377\250\34\47\121\0\0\0\70\164",​ 
 + "​\105\130\164\123\157\146\164\167\141\162\145\0\130\126",​ 
 + "​\40\126\145\162\163\151\157\156\40\63\56\61\60\141",​ 
 + "​\40\40\122\145\166\72\40\61\62\57\62\71\57\71",​ 
 + "​\64\40\50\120\116\107\40\160\141\164\143\150\40\61",​ 
 + "​\56\62\51\335\25\56\111\0\0\0\360\111\104\101",​ 
 + "​\124\70\215\355\121\313\162\302\60\14\124\36\206\72",​ 
 + "​\61\204\330\111\234\30\374\320\377\377\144\245\200\11",​ 
 + "​\320\366\322\351\364\304\36\74\132\215\326\273\262\1",​ 
 + "​\336\310\160\366\117\244\107\54\177\57\55\276\16\134",​ 
 + "​\106\23\103\107\105\241\3\272\346\332\54\207\20\65",​ 
 + "​\113\305\30\222\255\100\42\242\7\250\47\237\346\152",​ 
 + "​\223\46\55\7\224\0\66\235\224\345\202\260\244\256",​ 
 + "​\165\110\122\65\311\66\116\120\366\270\27\0\207\111",​ 
 + "​\66\161\313\162\161\144\210\75\354\120\21\73\73\356",​ 
 + "​\355\271\256\322\155\310\370\307\135\7\377\20\230\216",​ 
 + "​\250\241\105\301\143\221\173\12\353\333\256\107\117\121",​ 
 + "​\103\336\65\263\27\351\352\132\144\127\312\135\122\64",​ 
 + "​\201\247\142\275\356\300\256\167\366\44\65\353\256\255",​ 
 + "​\305\353\73\55\101\311\231\166\255\320\210\46\4\276",​ 
 + "​\254\357\152\142\273\46\276\112\65\71\232\200\347\374",​ 
 + "​\302\143\214\206\3\53\237\226\201\207\373\350\77\230",​ 
 + "​\315\303\26\370\107\174\363\221\157\374\33\76\1\352",​ 
 + "​\14\23\160\224\41\237\53\0\0\0\7\164\111\115",​ 
 + "​\105\7\337\1\7\13\67\50\46\354\362\174\0\0",​ 
 + "​\0\0\111\105\116\104\256\102\140\202",​ 
 +
 + # perl -e '​$/​="";​$c=0;​for (split //,<>​) { printf "​\\%o",​ord($_);​ ++$c%14 or print "​\",​\n\t\t\t\""​}' ​nodata.png
  };  };
  exit;  exit;
Zeile 356: Zeile 477:
 $request_uri eq $uri_imgtxt_gif and do { $request_uri eq $uri_imgtxt_gif and do {
  print "​Content-Type:​ image/​gif\n\n";​  print "​Content-Type:​ image/​gif\n\n";​
- -f $statfilename ​and do {+ -f $trackfilenameon ​and do {
  # image text gruen  # image text gruen
  print ​  print ​
Zeile 441: Zeile 562:
  ;  ;
  # perl -e '​$/​="";​$c=0;​for (split //,<>​) { printf "​\\%o",​ord($_);​ ++$c%14 or print "​\",​\n\t\t\t\""​}'​ ~chris/​open.gif  # perl -e '​$/​="";​$c=0;​for (split //,<>​) { printf "​\\%o",​ord($_);​ ++$c%14 or print "​\",​\n\t\t\t\""​}'​ ~chris/​open.gif
- } or do { + } or -f $trackfilenameoff and do {
  # image text rot  # image text rot
  print  print
Zeile 531: Zeile 652:
  ;  ;
  # perl -e '​$/​="";​$c=0;​for (split //,<>​) { printf "​\\%o",​ord($_);​ ++$c%14 or print "​\",​\n\t\t\t\""​}'​ ~chris/​closed.gif  # perl -e '​$/​="";​$c=0;​for (split //,<>​) { printf "​\\%o",​ord($_);​ ++$c%14 or print "​\",​\n\t\t\t\""​}'​ ~chris/​closed.gif
 + } or do {
 + # image text grey
 + print
 + "​\107\111\106\70\71\141\72\0\25\0\366\120\0\172",​
 + "​\172\172\173\173\173\176\176\176\177\177\177\200\200\200",​
 + "​\201\201\201\203\203\203\204\204\204\207\207\207\210\210",​
 + "​\210\213\213\213\215\215\215\216\216\216\223\223\223\226",​
 + "​\226\226\227\227\227\230\230\230\233\233\233\235\235\235",​
 + "​\237\237\237\240\240\240\243\243\243\245\245\245\247\247",​
 + "​\247\250\250\250\251\251\251\253\253\253\255\255\255\256",​
 + "​\256\256\260\260\260\263\263\263\265\265\265\266\266\266",​
 + "​\270\270\270\271\271\271\272\272\272\274\274\274\275\275",​
 + "​\275\276\276\276\303\303\303\304\304\304\305\305\305\306",​
 + "​\306\306\307\307\307\310\310\310\313\313\313\314\314\314",​
 + "​\315\315\315\316\316\316\320\320\320\321\321\321\324\324",​
 + "​\324\326\326\326\327\327\327\331\331\331\334\334\334\337",​
 + "​\337\337\340\340\340\341\341\341\342\342\342\343\343\343",​
 + "​\344\344\344\351\351\351\354\354\354\355\355\355\356\356",​
 + "​\356\357\357\357\361\361\361\362\362\362\363\363\363\364",​
 + "​\364\364\365\365\365\366\366\366\367\367\367\370\370\370",​
 + "​\371\371\371\373\373\373\374\374\374\375\375\375\376\376",​
 + "​\376\377\377\377\0\0\0\0\0\0\0\0\0\0",​
 + "​\0\0\0\0\0\0\0\0\0\0\0\0\0\0",​
 + "​\0\0\0\0\0\0\0\0\0\0\0\0\0\0",​
 + "​\0\0\0\0\0\0\0\0\0\0\0\0\0\0",​
 + "​\0\0\0\0\0\0\0\0\0\0\0\0\0\0",​
 + "​\0\0\0\0\0\0\0\0\0\0\0\0\0\0",​
 + "​\0\0\0\0\0\0\0\0\0\0\0\0\0\0",​
 + "​\0\0\0\0\0\0\0\0\0\0\0\0\0\0",​
 + "​\0\0\0\0\0\0\0\0\0\0\0\0\0\0",​
 + "​\0\0\0\0\0\0\0\0\0\0\0\0\0\0",​
 + "​\0\0\0\0\0\41\371\4\0\0\0\0\0\54",​
 + "​\0\0\0\0\72\0\25\0\0\7\376\200\0\202",​
 + "​\203\204\205\206\207\210\211\212\213\214\215\216\217\220",​
 + "​\221\222\223\224\225\226\212\71\65\227\233\211\231\212",​
 + "​\35\120\6\234\222\236\211\240\2\221\76\60\51\106",​
 + "​\104\40\203\2\47\104\120\71\24\206\6\56\104\106",​
 + "​\47\245\13\60\104\114\65\7\0\22\120\306\100\202",​
 + "​\11\63\100\114\66\303\207\76\114\47\22\56\120\22",​
 + "​\202\65\114\42\31\65\326\205\70\114\40\26\71\120",​
 + "​\232\0\31\63\22\26\106\63\0\6\44\120\17\13",​
 + "​\202\33\351\24\106\346\206\76\71\202\2\120\44\0",​
 + "​\32\100\311\60\250\7\277\101\17\6\12\72\20\314",​
 + "​\120\12\144\0\100\211\62\344\2\242\76\30\203\166",​
 + "​\1\260\0\145\236\40\126\204\62\100\111\60\250\124",​
 + "​\7\40\306\240\20\21\164\152\320\311\224\53\241\141",​
 + "​\24\244\121\40\101\0\2\14\22\112\170\315\35\76",​
 + "​\0\13\240\210\100\5\22\300\206\120\202\202\16\5",​
 + "​\120\364\142\306\24\330\264\131\350\146\213\20\16\42",​
 + "​\31\44\330\50\7\340\0\224\24\13\50\20\211\231",​
 + "​\220\4\210\4\136\123\64\270\147\4\221\252\214\61",​
 + "​\47\372\245\230\325\243\52\41\3\60\214\30\111\121",​
 + "​\52\3\63\34\56\332\12\42\141\4\10\204\163\314",​
 + "​\154\344\32\165\10\25\343\307\220\43\113\236\114\271",​
 + "​\262\345\313\230\55\5\2\0\73",​
 + ;
  };  };
  exit;  exit;
Zeile 536: Zeile 713:
 # else  # else 
 print "​Content-Type:​ image/​gif\n\n";​ print "​Content-Type:​ image/​gif\n\n";​
--f $statfilename ​and do {+-f $trackfilenameon ​and do {
  # pixel gruen  # pixel gruen
  print "​GIF87a\001\0\001\0\200\0\0\0\377\0\0\0\0,​\0\0\0\0\001\0\001\0\0\002\002D\001\0;";​  print "​GIF87a\001\0\001\0\200\0\0\0\377\0\0\0\0,​\0\0\0\0\001\0\001\0\0\002\002D\001\0;";​
 + exit;
 +} or -f $trackfilenameoff and do {
 + # pixel rot
 + print "​GIF87a\001\0\001\0\200\0\0\377\0\0\0\0\0,​\0\0\0\0\001\0\001\0\0\002\002D\001\0;";​
  exit;  exit;
 }; };
 # else # else
-# pixel rot +# pixel grau 
-print "​GIF87a\001\0\001\0\200\0\0\377\0\0\0\0\0,​\0\0\0\0\001\0\001\0\0\002\002D\001\0;";​+print "​GIF87a\001\0\001\0\200\0\0\177\177\177\0\0\0,​\0\0\0\0\001\0\001\0\0\002\002D\001\0;";​
 </​file>​ </​file>​
  
-dieser cronjob wirft ''/​var/​run/​sopen/​stat''​ weg, wenn die datei aelter als 3 minuten ist:+dieser cronjob wirft ''/​var/​run/​sopen/​stat'',​ ''/​var/​run/​sopen/​track-on''​ und ''/​var/​run/​sopen/​track-off''​ weg, wenn ''/​var/​run/​sopen/​stat'' ​aelter als 3 minuten ist:
 ''/​etc/​cron.d/​sopen'':​ ''/​etc/​cron.d/​sopen'':​
 <file txt /​etc/​cron.d/​sopen>​ <file txt /​etc/​cron.d/​sopen>​
-* * * * * www-data /​usr/​bin/​perl -e '$s = "/​var/​run/​sopen/​stat";​ [stat $s]->[9] + 180 < time and unlink $s'+     ​* * * www-data /​usr/​bin/​perl -e '$s = "/​var/​run/​sopen/​stat";​ [stat $s]->[9] + 180 < time and do { unlink $s, "/​var/​run/​sopen/​track-on",​ "/​var/​run/​sopen/​track-off"​ };'
 </​file>​ </​file>​
  
Zeile 601: Zeile 782:
  
 [0] als content-type wird "​text/​plain"​ uebermittelt [0] als content-type wird "​text/​plain"​ uebermittelt
 +
 +===== Kabelweg =====
 +
 +Die Leitung verlaeuft von der Zuhaltung der Eingangstuere am
 +Tuerrahmen nach oben, ueber den Tuerrahmen, an die Decke, durch die Wand
 +zum Lager, im Lager links, oben unter der Decke ans Fenster, dort nach
 +unten bis auf Hoehe des Fensterbankkanals. Hier ist ein db9-Stecker[0]
 +angeloetet, in den ein hellblaues Cisco-Console-Kabel eingesteckt ist,
 +dessen RJ45-Stecker in eine Netzwerkdose im Fensterbankkanal
 +eingesteckt ist. Im RZ kommt die Leitung auf einem Patchfeld wieder raus,
 +es folgen ein LAN-Kabel, ein weiteres hellblaues Cisco-Console-Kabel sowie ein 
 +USB/​RS232-Adapter,​ der schliesslich im linken Rack in den KVM-Host (Name?):
 +eingesteckt ist.
 +
 +Pix: 
 +  * http://​shackspace.de/?​s=shack_open_close_monitor
 +  * http://​shackspace.de/​projects/​chris/​shack-status
 +
 +===== Debugging =====
 +
 +[0] Der db9-Stecker waere der erste Pruefpunkt fuer die Messung des
 +Tuerkontakts:​
 +
 +Abziehen, Widerstand an den Leitungen messen
 +  * Tuer auf: Widerstand unendlich
 +  * Tuer zu: Widerstand nahe null
 +
 +Fuer die Funktion Richtung Server:
 +  * db9-Stecker wieder einstecken und (nur!) die beiden Leitungen kurzschliessen. Der Tuerstatus sollte innerhalb 3 Minuten reagieren. ​
 +
 +Auf dem KVM-Host (Name?):
 +  * ist der USB/​RS232-Adapter ueberhaupt am USB sichtbar?
 +  * ist das USB-Device dort vorhanden?
 +  * ist das USB-Device der KVM zugaenglich gemacht?
 +
 +Auf der KVM-Instanz "​tuerstatus":​
 +  * ist ''/​dev/​ttyUSB0''​ vorhanden
 +  * hat ''/​dev/​ttyUSB0''​ die Device-IDs "188, 0"
 +  * ist ''/​dev/​ttyUSB0''​ world-readable
 +  * ''​while sleep 1 ; do /​usr/​local/​app/​shackdoor/​shackdoor /​dev/​ttyUSB0;​ done''​ liefert bei geschlossener Tuere "​DSR",​ bei offener Tuere Leerzeilen
 +  * ausgelesene Werte der letzten 2 Wochen: ''​( zcat syslog.{14,​13,​12,​11,​10,​9,​8,​7,​6,​5,​4,​3,​2}.gz ; cat syslog{.1,} ) | awk '-F[ =]+' '$6 == <​nowiki>"​FLAG"</​nowiki>​ { print $1,$2,$3,$7 }' | less''​
  
 (idee und drehbuch: chris) (idee und drehbuch: chris)
Zeile 606: Zeile 828:
 ===== abgeleitete anwendungen ===== ===== abgeleitete anwendungen =====
  
-==== Shackspace ​offen? (1x1 pixel abfragen)====+==== shackspace Opening Statistics ==== 
 + 
 +<​code>​ 
 +                     ​apache --------------------------------------+ 
 +                       ​| ​                                         | 
 +                       | writes log                               | 
 +                       ​V ​                                         | 
 +              /​var/​www/​shackspace.de/​logs/​access.log* ​            | 
 +                                     ​| ​                           | 
 +                                     ​| ​                           | 
 +              /​etc/​cron.d/​sopen ​     | is read by                 | 
 +                       ​| ​            ​| ​                           | 
 +                       | calls 1/10m |                            | 
 +                       ​V ​            ​V ​                           | calls 
 +              /​usr/​local/​bin/​sopen-rrd ----+                      | 
 +                       ​| ​                  ​| ​                     | 
 +                       | writes data       | calls                | 
 +                       ​| ​                  ​| ​                     | 
 +                       ​+-->​ rrdtool <​------+ ​                     | 
 +                              |                                   | 
 +                              | writes rrd                        | 
 +                              V                                   | 
 +              /​var/​cache/​sopen/​sopen.rrd ​                         | 
 +                    |                                             | 
 +      +-------------+ ​                                            | 
 +      |                                                           | 
 +      |       /​var/​www/​shackspace.de/​htdocs/​sopen-show-42h.png <--+ 
 +      |             ​| ​                                            | 
 +      |    +--------+ ​                                            | 
 +      |    |                                                      | 
 +      |    |  /​var/​www/​shackspace.de/​htdocs/​sopen-show-23d.png <--+ 
 +      |    |        |                                             | 
 +      |    +--------+ ​                                            | 
 +      |    |                                                      | 
 +      |    |  /​var/​www/​shackspace.de/​htdocs/​sopen-show-42w.png <--+ 
 +      |    |        |                                               
 +      |    +--------+ ​                                              
 +      |             | calls                                         
 +      |             ​V ​                                              
 +      |       /​var/​www/​shackspace.de/​htdocs/​sopen-show 
 +      |             |  
 +      | is read by  | calls                                         
 +      |             ​V ​                                              
 +      +-------->​ rrdtool ​                                              
 +                    |  
 +                    | writes image data 
 +                    V                                               
 +               png / stdout / cgi 
 +</​code>​ 
 + 
 +==== Weekly, hourly and half-hourly breakdowns ==== 
 + 
 +<​code>​ 
 +                     ​apache 
 +                       | 
 +                       | writes log 
 +                       V 
 +              /​var/​www/​shackspace.de/​logs/​access.log* 
 +                                     | 
 +                                     | 
 +              /​etc/​cron.d/​sopen ​     | is read by 
 +                       ​| ​            | 
 +                       | calls 1/4h  | 
 +                       ​V ​            V 
 +              /​usr/​local/​bin/​sopen-list ---+   
 +                       ​| ​                  | 
 +                       | writes data       | calls 
 +                       ​V ​                  | 
 +              /​var/​cache/​sopen/​sopen.dat ​  | 
 +                       ​| ​                  | 
 +                       | is read by        | 
 +                       ​| ​                  | 
 +                       ​+-->​ gnuplot <​------+ 
 +                              |             
 +                              | writes images 
 +                              V             
 +              /​var/​www/​shackspace.de/​htdocs/​sopen.d/​bywday.png 
 +              /​var/​www/​shackspace.de/​htdocs/​sopen.d/​byhour.png 
 +              /​var/​www/​shackspace.de/​htdocs/​sopen.d/​byhalfhour.png 
 +</​code>​ 
 + 
 +==== shackspace ​offen? (1x1 pixel abfragen)====
 Autor: Felix Autor: Felix
  
shack_open_close_monitor.txt · Zuletzt geändert: 2017/01/05 12:14 von 95.208.82.193