+#!/usr/bin/python
+
+from pprint import pprint
+from os import system;
+
+import pycurl
+from urllib import urlencode
+from StringIO import StringIO
+
+import MySQLdb
+import ConfigParser
+
+import uuid
+
+def print_log(str):
+ global logging,debug
+ if debug>0:
+ print str
+ if logging == "on":
+ system("logger -t weathermon \""+str+"\"")
+
+def submit_narodmon():
+
+ global debug
+
+ param = { 'ID':devid }
+
+ c = database.cursor()
+ c.execute(
+ '''
+select nm_id,avg(value) from meteo.ext_sensors e,meteo.sensor_values v
+where
+e.sensor_id=v.sensor_id and e.param_id=v.parameter_id
+and v.timestamp>DATE_SUB(CURRENT_TIMESTAMP(),INTERVAL 15 MINUTE)
+and e.nm_id is not null
+group by e.sensor_id,e.param_id,e.nm_id,e.owm_id
+ '''
+ )
+
+ queue=c.fetchall()
+
+ if debug>1:
+ pprint(queue)
+
+ for (sensor,value) in queue:
+ param[sensor] = value
+
+ if debug>1:
+ pprint (param)
+
+ url = "http://narodmon.ru/post.php"
+
+ try:
+
+ response_buffer = StringIO()
+ curl = pycurl.Curl()
+
+ curl.setopt(curl.URL, url)
+ curl.setopt(curl.WRITEFUNCTION, response_buffer.write)
+ curl.setopt(curl.POST, 1)
+ curl.setopt(curl.POSTFIELDS, urlencode(param))
+
+ curl.perform()
+ curl.close()
+
+ response_value = response_buffer.getvalue()
+
+ print_log('Narodmon 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 submit_owm():
+
+ global debug
+
+ url = "http://openweathermap.org/data/post"
+ params = {'name':owm_station, 'lat':owm_lat, 'long':owm_lon}
+
+ c = database.cursor()
+ c.execute(
+ '''
+ select owm_id,value from
+ (
+ SELECT sensor_id,parameter_id,avg(timestamp) timestamp,round(avg(value),1) value FROM meteo.sensor_values
+ where
+ timestamp>=date_sub(current_timestamp(), INTERVAL 15 MINUTE)
+ group by sensor_id,parameter_id
+ ) v,meteo.ext_sensors e
+ where v.sensor_id=e.sensor_id and v.parameter_id=e.param_id
+ and owm_id is not null
+ '''
+ )
+
+ queue=c.fetchall()
+
+ if debug>1:
+ pprint(queue)
+
+ for (sensor,value) in queue:
+ params[sensor]=value
+ if debug>1:
+ pprint (params)
+
+ try:
+
+ response_buffer = StringIO()
+ curl = pycurl.Curl()
+
+ curl.setopt(curl.URL, url)
+ curl.setopt(curl.USERPWD, '%s:%s' % (owmuser, owmpasswd))
+ 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('Openweathermap 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 main():
+ submit_narodmon()
+ submit_owm()
+
+def init():
+
+ global logging,debug;
+ global devid;
+ global dbhost,dbuser,dbpasswd;
+ global owmuser,owmpasswd,owm_temp,owm_pres,owm_humi,owm_lat,owm_lon,owm_station;
+
+ try:
+
+ cfg = ConfigParser.RawConfigParser(allow_no_value=True)
+ cfg.readfp(open('/etc/weathermon.conf'))
+
+ try:
+ logging = cfg.get("logging","enabled")
+ except:
+ logging = None
+ try:
+ debug = int(cfg.get("logging","debug"))
+ except:
+ debug = 0
+
+ dbhost = cfg.get("mysql","host")
+ dbuser = cfg.get("mysql","user")
+ dbpasswd = cfg.get("mysql","passwd")
+ try:
+ narmon = cfg.get("narodmon","enable")
+ except:
+ narmon = 'off'
+ try:
+ devid = cfg.get("narodmon","devid")
+ except:
+ devid = "{:0>12X}".format(getnode())
+ try:
+ owmuser = cfg.get("openweathermap","user")
+ owmpasswd = cfg.get("openweathermap",'passwd')
+ except:
+ owmuser = None
+ if owmuser:
+ try:
+ owm_station=cfg.get("openweathermap","station")
+ owm_lat=cfg.get("openweathermap","lat")
+ owm_lon=cfg.get("openweathermap","lon")
+ except:
+ None
+
+ global database
+ database = MySQLdb.connect(host=dbhost,user=dbuser,passwd=dbpasswd,use_unicode=True,connect_timeout=10)
+ database.set_character_set('utf8')
+ c = database.cursor()
+ c.execute('SET NAMES utf8;')
+ print_log("Database connected...")
+ connected = True
+
+ except:
+
+ print_log("Cannot intialize system")
+ exit()
+
+if __name__ == "__main__":
+ import sys
+ reload(sys)
+ sys.setdefaultencoding('utf-8')
+ init()
+ main()