Parralel integration
[mirrors/Programs.git] / c / goertzel / sleepmon.sh
... / ...
CommitLineData
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
15out=/tmp/sleeplog-"$(date +%F_%T)".txt
16graphout="${out%%.*}.png"
17
18killall speaker-test &>/dev/null
19speaker-test -t sine &>/dev/null &
20
21touch "$out"
22bash ./sleepstats.sh "$out" &>/dev/null &
23
24tresh=10
25lastdate="$(date +%s)"
26laststate=0
27history='';
28historymax=120;
29historylen='10 30 60 90 120'
30screen=false
31graph=false
32
33export LC_ALL=C
34
35#trap 'kill -9 $(jobs -p);' SIGINT
36
37while getopts "sg" OPT; do
38 test "$OPT" == 's' && screen=true;
39 test "$OPT" == 'g' && graph=true;
40done
41
42echo "Writing log to: $out";
43$graph && echo "Writing graph to: $graphout"
44echo
45arecord | ./goertzel -n i -q -l c -t $tresh -d 4 | while read line; do
46 date="$(date +%s)"
47 time="$(echo "$line" | cut -f 1)"
48 level="$(echo "$line" | cut -f 2)"
49 test "$level" -gt "$tresh" && state=false || state=true
50 $state && statenum=1 || statenum=0;
51 $state && statename='MOTION!' || statename='Nothing';
52
53 printf "%.2f\t %s %s %d" "$time" "$date" "$(date '+%F %T')" "$statenum"
54
55 #History
56 after=$(( $date - $lastdate))
57 test $historymax -gt 0 && {
58 history=$(echo -n "$(yes | tr '\ny' $laststate | head -c $after)$history" | head -c $historymax)
59 for len in $historylen; do
60 on="$(echo -n ${history::$len} | tr -d 0 | wc -c)"
61 on="$(echo "scale=2; $on/$len" | bc)"
62 printf " %.2f" "$on"
63 done
64 }
65
66 #Debug
67 printf " (%s %3d After %4d secs)\n" "$statename" "$level" "$after";
68
69 #Fun with values
70 $state && {
71 $screen && xset dpms force off || true;
72 } || {
73 $screen && xset dpms force on;
74 }
75 $graph && ./sleepplot.sh "$out" "$graphout" &>/dev/null &
76
77 #Prepare invariants for next round
78 lastdate="$date";
79 laststate="$statenum";
80done | tee "$out"
81kill $(jobs -p); sleep 0.2
82echo
83echo "Your log: $out"
84$graph && {
85 ./sleepplot.sh "$out" "$graphout" &>/dev/null
86 echo "Your graph: $graphout"
87}
This page took 0.115452 seconds and 4 git commands to generate.