Difference between revisions of "Sump Pump Monitor"

From NAS-Central Buffalo - The Linkstation Wiki
Jump to: navigation, search
m
m
Line 3: Line 3:
 
{|align=right width="300"
 
{|align=right width="300"
 
|-
 
|-
||[[Image:sumpgraph.gif|300px|thumb|left|alt text]]
+
||[[Image:sumpgraph.gif|300px|thumb|left|Graph of weeks sump pump output]]
 
|-
 
|-
||[[Image:logmic.jpg|300px|thumb|left|alt text]]
+
||[[Image:logmic.jpg|300px|thumb|left|X Box Microphone]]
 
|}
 
|}
 
==Install a Serial Port Interface==
 
==Install a Serial Port Interface==
Line 23: Line 23:
  
 
The meat of the scripting is done by an simple but excellent script I found by Thomer Gill written in ruby that I modified just a bit and his tutorial on sound detection using sox http://thomer.com/howtos/detect_sound.html
 
The meat of the scripting is done by an simple but excellent script I found by Thomer Gill written in ruby that I modified just a bit and his tutorial on sound detection using sox http://thomer.com/howtos/detect_sound.html
 +
 +
I just ran a network feed down to the "computer" and strapped the microphone near the check valve on the exit pipe.  Every time the pump goes off the noise of the check valve triggers an event
  
 
==Sound Detect==
 
==Sound Detect==

Revision as of 00:45, 13 September 2014


File:Sumpgraph.gif
Graph of weeks sump pump output
X Box Microphone

Install a Serial Port Interface

Any Debian based device will do


Need to install

  • Ruby
  • ttytter
  • alsa-utils
  • sox
  • gnuplot


Admittedly this is just a collection of shell scripts. I use a USB microphone from an XBOX that can be found used at almost any thrift store for a few dollars, or at GameStop for a bit more.

The meat of the scripting is done by an simple but excellent script I found by Thomer Gill written in ruby that I modified just a bit and his tutorial on sound detection using sox http://thomer.com/howtos/detect_sound.html

I just ran a network feed down to the "computer" and strapped the microphone near the check valve on the exit pipe. Every time the pump goes off the noise of the check valve triggers an event

Sound Detect

#!/usr/bin/ruby -w
#
# Copyright (C) 2014 Uday K. Paul
#
# Aug  28, 2014: Modified for use with sump pump
#
# Derived from original version Copyright (C) 2009 Thomer M. Gil [http://thomer.com/]
#
# Oct  22, 2009: Initial version
# 
# This program is free software. You may distribute it under the terms of
# the GNU General Public License as published by the Free Software
# Foundation, version 2.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# This program detects the presence of sound and appends a datestamp to a logfile
#

require 'getoptlong'

# You need to replace MICROPHONE with the name of your microphone, as reported
# by /proc/asound/cards
MICROPHONE = 'Logitech'
HWDEVICE = `cat /proc/asound/cards | grep '#{MICROPHONE}' | awk '{print $1}'`.to_i
SAMPLE_DURATION = 3 # seconds
FORMAT = 'S16_LE'   # this is the format that my USB microphone generates
THRESHOLD = 0.15

if !File.exists?('/usr/bin/arecord')
  warn "/usr/bin/arecord not found; install package alsa-utils"
  exit 1
end

if !File.exists?('/usr/bin/sox')
  warn "/usr/bin/sox not found; install package sox"
  exit 1
end

if !File.exists?('/proc/asound/cards')
  warn "/proc/asound/cards not found"
  exit 1
end

$options = {}
opts = GetoptLong.new(*[
  [ "--verbose", "-v", GetoptLong::NO_ARGUMENT ],
])
opts.each { |opt, arg| $options[opt] = arg }

time1=0

loop do
  out = `/usr/bin/arecord -D plughw:#{HWDEVICE},0 -d #{SAMPLE_DURATION} -f #{FORMAT} 2>/dev/null | /usr/bin/sox -t .wav - -n stat 2>&1`
  out.match(/Maximum amplitude:\s+(.*)/m)
  amplitude = $1.to_f
  puts amplitude if $options['--verbose']  
  if amplitude > THRESHOLD
    time2=time1
    time1 = Time.new
    diff = time1-time2
    if diff.to_f > 8.0
    open('/root/myfile.out', 'a') { |f|
    f.puts time1.inspect 
    
      } 
    puts diff 
    else
    end    
else
  end
end


waterd-hourly

#!/bin/bash

highlimit=30

result=`ps aux | grep -i "sound-detect" | grep -v "grep" | wc -l`
read lines words chars filename <<< $(wc /root/myfile.out)

paste <(date +%D%t%k )  <(wc -l /root/myfile.out ) | awk '{ print $1" "$2" " $3}' >> /root/hourly.log

if [[ $lines -gt $highlimit ]]
 then
ttytter  -status="Pumped in last hour $lines"

elif [[ $lines -eq 0 ]]
 then
ttytter  -status="No Pumping in the last Hour"

else
echo "pump good"
echo $lines "pumped"
fi


 rm /root/myfile.out


if [ $result -ge 1 ]
   then
        echo "script is running"
   else
        /usr/local/bin/sound-detect &
fi

waterd-minute

#!/bin/bash
result=`ps aux | grep -i "sound-detect" | grep -v "grep" | wc -l`


if [ $result -ge 1 ]
   then
        echo "script is running"
   else
        /usr/local/bin/sound-detect &
fi

waterd-daily

#!/bin/bash



times=`grep $(date --date="-1 day" +"%D%t") /root/hourly.log | awk '{total=total + $3}END{print total}'`

ttytter -status="Pumped $times times yesterday"

gnuplot /usr/local/bin/plotgraph && mpack -s Sumppump  out.pdf  EMAI@ADDRESS && rm out.pdf


plotgraph

#!/usr/bin/gnuplot
reset
# set terminal png size 2048,1536 linewidth 9  enhanced font ',30'
# set output "graph.png"

set terminal pdf font ',8'
set output 'out.pdf'

set xdata time
set timefmt "%m/%d/%Y %H"
set format x "%m/%d"
set xlabel "Date"

set ylabel "Cycles in Hour"

set title "Sump Pump" font ',20'

set key reverse Left outside

set style data lines 


 plot "< tail -168 /root/hourly.log" using 1:3 smooth unique title ""
#plot "/root/hourly.log" using 1:3 smooth unique title ""


/etc/crontab

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
00 *    * * *   root    /usr/local/bin/waterd-hourly >/dev/null 2>&1
*  *    * * *   root    /usr/local/bin/waterd-minute >/dev/null 2>&1
00 8    * * *   root    /usr/local/bin/waterd-daily >/dev/null 2>&1
#