rpi-temp-humid-monitor/python_code/temp-humid-read-loop.py
2020-09-03 09:40:05 +08:00

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)