#!/usr/bin/python import serial from os import system from pprint import pprint from termios import tcflush, TCIOFLUSH from time import sleep from uuid import getnode import sys,traceback import pycurl from urllib import urlencode from StringIO import StringIO path = None baud = None timeout = None import ConfigParser import thread from threading import Timer def open_port(path): global proc print "Opening path "+path ser = serial.Serial(path,1200); ser.open(); ser.close(); ser = serial.Serial(path,baud,timeout=timeout) if ser.portstr: tcflush(ser,TCIOFLUSH); return ser def read_port(ser): try: timeout_timer = Timer(timeout, thread.interrupt_main) timeout_timer.start() line = ser.readline() return line.strip() except KeyboardInterrupt: return "<>" finally: timeout_timer.cancel() def read_loop(ser,callback): global proc while True: try: line=read_port(ser) if line=="<>": print "Reopening port..." ser.close() ser=open_port(path) if line: callback(line) except KeyboardInterrupt: break finally: None def print_log(str): global logging print str if logging == "on": system("logger -t weathermon \""+str+"\"") def submit_data(stype,sid,param,value): global url,username,password params = {'stype':stype, 'sid':sid, 'param':param, 'value':value} pprint (params) try: response_buffer = StringIO() curl = pycurl.Curl() curl.setopt(curl.URL, url) if username: curl.setopt(curl.USERPWD, '%s:%s' % (username, password)) curl.setopt(curl.WRITEFUNCTION, response_buffer.write) curl.setopt(curl.POST, 1) curl.setopt(curl.POSTFIELDS, urlencode(params)) curl.perform() curl.close() response_value = response_buffer.getvalue() print_log('Server response: '+response_value) return True except: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_tb(exc_traceback, limit=1, file=sys.stdout) traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout) return False def process_str(str): print_log("Received: "+str) try: msg_type, msg_body = str.split(':') except: return try: if msg_type == 'STATUS': print_log('Status: '+msg_body) elif msg_type == 'ERROR': print_log('Error: '+ msg_body) elif msg_type == 'SENSOR': sens = msg_body.split(',') sensor = {} sensor_type = None sensor_id = None for rec in sens: key,value = rec.split('=') value=value.strip() if len(value)>0: if key == 'TYPE': sensor_type = value elif key == 'ID': sensor_id = value else: sensor[key] = value if sensor_type: if not sensor_id: sensor_id=devid; for key in sensor: if sensor[key]: print_log('Type = '+sensor_type+', ID = '+sensor_id+', Param = '+key+', Value = '+sensor[key]) submit_data(sensor_type,sensor_id,key,sensor[key]) else: print_log('Error: got empty parameter value for '+sensor_type+'.'+sensor_id+'.'+key) except: print_log('Exception processing...') exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_tb(exc_traceback, limit=1, file=sys.stdout) traceback.print_exception(exc_type, exc_value, exc_traceback, limit=5, file=sys.stdout) def weather_mon(): global path ser = open_port(path) read_loop(ser,process_str) def main(): weather_mon() try: cfg = ConfigParser.RawConfigParser(allow_no_value=True) cfg.readfp(open('/etc/weathermon.conf')) url = cfg.get("web","url") path = cfg.get("serial","port"); try: username = cfg.get("web","user"); password = cfg.get("web","password"); except: username = None password = None try: logging = cfg.get("logging","enabled") except: logging = None try: timeout = int(cfg.get("serial","timeout")) except: timeout = 120 try: baud = int(cfg.get("serial","baud")) except: baud = 57600 try: devid = cfg.get("web","devid") except: devid = "{:0>12X}".format(getnode()) except: print_log("Cannot intialize system") exit() if __name__ == "__main__": import sys reload(sys) sys.setdefaultencoding('utf-8') main()