142 lines
6.4 KiB
Python
Executable File
142 lines
6.4 KiB
Python
Executable File
#/usr/bin/env python
|
|
# -*- coding:utf-8 -*-
|
|
|
|
import sys
|
|
import dhtreader
|
|
import updateMysql
|
|
import ConfigParser
|
|
import time
|
|
from time import strftime
|
|
from threading import Timer,Thread,Event
|
|
import logging
|
|
from datetime import datetime
|
|
from datetime import timedelta
|
|
|
|
oldtemp = "NULL"
|
|
oldhumid = "NULL"
|
|
|
|
def exec_every_n_seconds(n,f,*args):
|
|
waitInterval = timedelta(seconds=n)
|
|
logging.debug('We should read the sensor every {0} seconds'.format(waitInterval))
|
|
duration=f(*args)
|
|
offset = waitInterval - duration
|
|
logging.debug('Running the loop again in {0} seconds (printed as datetime)'.format(offset))
|
|
offset2 = offset.total_seconds()
|
|
logging.debug('Running the loop again in {0} seconds (printed as float)'.format(offset2))
|
|
while 1:
|
|
logging.debug('We are in the loop now ...')
|
|
initTime=time.time()
|
|
logging.debug('Start time is {0}'.format(initTime))
|
|
#time.sleep(offset2)
|
|
logging.debug('We are about to run the sensor read again')
|
|
duration=f(*args)
|
|
offset2 = (60.0 - (time.time() - initTime))
|
|
time.sleep(60.0 - ((time.time() - initTime) % 60.0))
|
|
logging.debug('Duration of sequence was: {0}'.format(duration))
|
|
offset = waitInterval - duration
|
|
logging.debug('Running the loop again in {0} seconds (printed as dateime)'.format(offset))
|
|
#offset2 = offset.total_seconds()
|
|
logging.debug('Running the loop again in {0} seconds (printed as float)'.format(offset2))
|
|
|
|
def sensorRead(hwtype, pin, retries, timeout, maxtemp, mintemp, tempdiff, maxhumid, minhumid, humiddiff):
|
|
global oldtemp
|
|
global oldhumid
|
|
startTime=datetime.now()
|
|
logging.debug('This round of results started at {0}'.format(startTime))
|
|
for num in range(retries):
|
|
try:
|
|
t, h = dhtreader.read(dev_type, dhtpin)
|
|
except:
|
|
if ((num + 1) < retries):
|
|
logging.warning('Exception detected! We will retry. Loop number: %d', num)
|
|
time.sleep(timeout)
|
|
else:
|
|
logging.error('Exception detected - we are out of retries. Skipping the measurement in this cycle.')
|
|
else:
|
|
if t and h:
|
|
logging.debug('Temperature and humidity read as {0} and {1}'.format(t, h))
|
|
logging.debug('Temperature and Humidity differences allowed: {0} and {1}'.format(tempdiff, humiddiff))
|
|
if (oldtemp != "NULL") and ((t - oldtemp < tempdiff) or (oldtemp - t < tempdiff)) and ((h - oldhumid < humiddiff) or (oldhumid - h < humiddiff)):
|
|
logging.debug('Current temperature close enough to previous temperature and previous temperature is not NULL, it is: %s', oldtemp)
|
|
logging.debug('Current humidity close enough to previous humidity and previous humidity is not NULL, it is: %s', oldhumid)
|
|
if (t < maxtemp) and (t > mintemp) and (h < maxhumid) and (h > minhumid):
|
|
logging.debug('Temperature is less than {0} and greater than {1}, humidity is less than {2} and greater than {3}'.format(maxtemp,mintemp,maxhumid,minhumid))
|
|
updateMysql.main(t, h, host, db, username, password, logging, sql_retries, sql_timeout)
|
|
oldtemp=t
|
|
oldhumid=h
|
|
break
|
|
else:
|
|
logging.error('Temperature {0} or humidity {1} is outside of allowable values - error! Check your configuration.'.format(t, h))
|
|
else:
|
|
logging.warning('Failed to read from sensor, maybe try again?')
|
|
endTime=datetime.now()
|
|
logging.debug('This round of results ended at {0}'.format(endTime))
|
|
duration = endTime - startTime
|
|
logging.debug('This round of results took {0} to complete'.format(duration))
|
|
return duration
|
|
|
|
DHT11 = 11
|
|
DHT22 = 22
|
|
AM2302 = 22
|
|
|
|
config = ConfigParser.ConfigParser()
|
|
config.read('/etc/thMonitor.conf')
|
|
hwtype=config.get('hardware', 'DHT')
|
|
pin=config.get('hardware', 'PIN')
|
|
retries=int(config.get('software', 'retries'))
|
|
timeout=int(config.get('software', 'timeout'))
|
|
interval=int(config.get('software', 'interval'))
|
|
maxtemp=int(config.get('software', 'maxtemp'))
|
|
mintemp=int(config.get('software', 'mintemp'))
|
|
tempdiff=int(config.get('software', 'tempdiff'))
|
|
maxhumid=int(config.get('software', 'maxhumid'))
|
|
minhumid=int(config.get('software', 'minhumid'))
|
|
humiddiff=int(config.get('software', 'humiddiff'))
|
|
logfile=(config.get('software', 'logfile'))
|
|
loglevel=(config.get('software', 'loglevel'))
|
|
host=(config.get('database', 'host'))
|
|
db=(config.get('database', 'db'))
|
|
username=(config.get('database', 'username'))
|
|
password=(config.get('database', 'password'))
|
|
sql_retries=int((config.get('database', 'sql_retries')))
|
|
sql_timeout=(config.get('database', 'sql_timeout'))
|
|
|
|
|
|
if loglevel == "debug":
|
|
logging.basicConfig(filename = logfile, format='%(asctime)s %(levelname)s:%(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.DEBUG)
|
|
elif loglevel == "info":
|
|
logging.basicConfig(filename = logfile, format='%(asctime)s %(levelname)s:%(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.INFO)
|
|
elif loglevel == "warn":
|
|
logging.basicConfig(filename = logfile, format='%(asctime)s %(levelname)s:%(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.WARNING)
|
|
elif loglevel == "error":
|
|
logging.basicConfig(filename = logfile, format='%(asctime)s %(levelname)s:%(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.ERROR)
|
|
else:
|
|
logging.basicConfig(filename = logfile, format='%(asctime)s %(levelname)s:%(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.CRITICAL)
|
|
|
|
dhtreader.init()
|
|
|
|
dev_type = None
|
|
if hwtype == "11":
|
|
dev_type = DHT11
|
|
logging.info('Configured to use DHT11 device')
|
|
elif hwtype == "22":
|
|
dev_type = DHT22
|
|
logging.info('Configured to use DHT22 device')
|
|
elif hwtype == "2302":
|
|
dev_type = AM2302
|
|
logging.info('Configured to use AM2303 device')
|
|
else:
|
|
logging.warn('Invalid hardware type, only DHT11, DHT22 and AM 2302 are supported for now.!')
|
|
sys.exit(3)
|
|
|
|
dhtpin = int(pin)
|
|
if dhtpin <= 0:
|
|
logging.warn("Invalid GPIO pin#, correct your configuration file")
|
|
sys.exit(3)
|
|
|
|
logging.info("using pin #{0}".format(dhtpin))
|
|
logging.info('Multiple (infinte looped) run temperature and humidity reading. [version: 1.0, Jonathan Ervine, 2015-06-17]')
|
|
|
|
logging.debug("About to enter infinite loop")
|
|
exec_every_n_seconds(60,sensorRead,hwtype,pin,retries,timeout,maxtemp,mintemp,tempdiff,maxhumid,minhumid,humiddiff)
|