9f0edd27093870633a3a2fbe53e8fdb7cb5e8924
[mirrors/Programs.git] / c / goertzel / sleepmon.sh
1 #!/bin/bash
2 # Simple sleep monitor (Harvie 2012)
3 #
4 # You probably have soundcard with one output and input
5 # Take PIR motion sensor from security system
6 # Use PIR to switch connection between left channels of output and input (tips of 3.5mm jacks)
7 # Connect grounds of these two together (maybe you will not need it - depending on your soundcard)
8 # Power up PIR
9 # Launch this script
10 # Use alsamixer and some GUI recorder (like audacity) to tune volume to some usable level
11 # Place PIR facing to your bed and go sleep
12 # Wake up
13 # Enjoy your data
14
15 out=/tmp/sleeplog-"$(date +%F_%T)".txt
16 graphout="${out%%.*}.png"
17
18 killall speaker-test &>/dev/null
19 speaker-test -t sine &>/dev/null &
20 pid_test=$!
21
22 tresh=10
23 lastdate="$(date +%s)"
24 laststate=0
25 history='';
26 historymax=120;
27 historylen='10 30 60 90 120'
28 screen=false
29 graph=false
30
31 while getopts "sg" OPT; do
32 test "$OPT" == 's' && screen=true;
33 test "$OPT" == 'g' && graph=true;
34 done
35
36 echo "Writing log to: $out";
37 $graph && echo "Writing graph to: $graphout"
38 echo
39 arecord | ./goertzel -n i -q -l c -t $tresh -d 4 | while read line; do
40 date="$(date +%s)"
41 time="$(echo "$line" | cut -f 1)"
42 level="$(echo "$line" | cut -f 2)"
43 test "$level" -gt "$tresh" && state=false || state=true
44 $state && statenum=1 || statenum=0;
45 $state && statename='MOTION!' || statename='Nothing';
46
47 echo -ne "$time\t$date $(date '+%F %T') $statenum"
48
49 #History
50 after=$(( $date - $lastdate))
51 test $historymax -gt 0 && {
52 history=$(echo -n "$(yes | tr '\ny' $laststate | head -c $after)$history" | head -c $historymax)
53 for len in $historylen; do
54 on="$(echo -n ${history::$len} | tr -d 0 | wc -c)"
55 on="$(echo "scale=2; $on/$len" | bc)"
56 LC_ALL=C printf " %.2f" "$on"
57 done
58 }
59
60 #Debug
61 echo -e "\t($statename $level After $after secs)";
62
63 #Fun with values
64 $state && {
65 $screen && xset dpms force off || true;
66 } || {
67 $screen && xset dpms force on;
68 }
69 $graph && ./sleepplot.sh "$out" "$graphout" &>/dev/null &
70
71 #Prepare invariants for next round
72 lastdate="$date";
73 laststate="$statenum";
74 done | tee "$out"
75 kill $pid_test; sleep 0.2
76 echo
77 echo "Your log: $out"
78 $graph && {
79 ./sleepplot.sh "$out" "$graphout" &>/dev/null
80 echo "Your graph: $graphout"
81 }
This page took 0.341353 seconds and 3 git commands to generate.