Tag Archives: wireless thing

IoT monitor script

As promised here’s the code I’ve currently got watching for incoming messages from the slice of pi.  It’s a hacked up version of the script from Fernando Lourenco’s instructable

The code pulling from Weather Underground is gone and I’ve shuffled things around a bit for my purposes.  No judging what I’ve done to the python if you please, I’m fresh in from years of abusing perl to meet my needs but have shifted to python for pi related stuff since solstice.

https://rockhopper.vom.org.uk/~mark/wirelessthing/monitor_sql.py

#!/usr/bin/env python
# --------------------------------------------------
from time import time, sleep, gmtime, strftime
import logging
import logging.handlers
import serial
import os
import os.path
import datetime
import sys
import MySQLdb as mdb
# --------------------------------------------------
# create table things ( 
#    thistime timestamp, 
#    ID varchar(2), 
#    type varchar(10), 
#    value float );
# --------------------------------------------------
DEVICE = '/dev/ttyAMA0'
BAUD = 9600
ser = serial.Serial(DEVICE, BAUD)
TIMEOUT = 10
# --------------------------------------------------
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.INFO)
handler = logging.handlers.SysLogHandler(address = '/dev/log')
my_logger.addHandler(handler)

#my_logger.debug('this is debug')
#my_logger.critical('this is critical')
# --------------------------------------------------
def dumpResults( thingMsg ):
    print "Message : " + thingMsg
    readValue    = -100
    readID        = "99"
    readType    = "NONE"
    writeMe     = 0

    # Raw mesg logging
    thisTime = strftime("%Y-%m-%d %H:%M", gmtime())
    my_logger.info( "%s,%s\n" % ( thisTime, thingMsg ) )

    readID = thingMsg[1:3]
    if thingMsg[3:7] == "TEMP":
        writeMe = 1
        readType = "TEMP"
        readValue = thingMsg[7:]
    if thingMsg[3:7] == "BATT":
        writeMe = 1
        readType = "BATT"
        readValue = thingMsg[7:11]
        if readValue == "LOW":
            readValue = 0

    if writeMe:
        thisMsg = "%s,%s,%s,%s\n" % ( thisTime, readID, readType, readValue )
        with open( "logfile.txt", "a", 0 ) as thisFile:
            # Dump the information to file and setup the message
            thisTime = strftime("%Y-%m-%d %H:%M:%S", gmtime())
            thisFile.write( thisMsg )
            print( thisMsg )
        try:
            con = mdb.connect('192.168.0.250', 'monitor', 'password', 'houseLogging');
            with con:
                # SQL stuff
                cur = con.cursor()
                cur.execute( "insert into things values ( '%s', '%s', '%s', %s )" % ( thisTime, readID, readType, readValue ) ) 
                con.commit()

        except mdb.Error, e:
            print "Error %d: %s" % (e.args[0],e.args[1])
            my_logger.critical( 'Could not write to db - '+thisMsg )
            #sys.exit(1)    
    return( 1 )

def get_temp():
    global ser
    fim = time()+ TIMEOUT
    my_logger.debug('Attempting to get temp')
    while (time()<fim):
        n = ser.inWaiting()
        if n != 0:
            data = ser.read(n)
            nb_msg = len(data) / 12
            print "Number of message blocks " + str(nb_msg)
            for i in range (0, nb_msg):
                msg = data[i*12:(i+1)*12]
                print ">>" + msg
                dumpResults( msg )
        else:
            sleep(5)
    return {1}

# --------------------------------------------------
# main function
# This is where the program starts 
def main():
    while True:
        temperature = get_temp()


        #else:
        #    print ("temperature=ERROR-Timeout!")
            

if __name__=="__main__":
    main()
# --------------------------------------------------