Добавлен ретранслятор MQTT-MYSQL
[weathermon.git] / weathermon-mqtt
1 #!/usr/bin/python
2
3 import paho.mqtt.client as paho
4 import sys
5 from ConfigParser import ConfigParser
6 import MySQLdb
7 from pprint import pprint
8
9 def on_message(mosq, obj, msg):
10   topic=msg.topic
11   payload=msg.payload
12   try:
13     c = database.cursor()
14     c.execute('CALL meteo.submit_mqtt(%s,%s,NULL)', (topic,payload))
15     database.commit()
16     print topic,payload
17   except:
18     print "Failed to submit data"  
19
20 def Topics():
21
22   c = database.cursor()
23   c.execute(
24     '''
25     select topic from mqtt_topics
26     '''
27   )
28
29   topics=c.fetchall()
30   return topics
31   
32   
33 def Init():
34
35   global client,database
36
37   conffile = sys.argv[1]
38
39   config = ConfigParser()
40   config.add_section('mqtt')
41   # set defaults for anonymous auth
42   config.set('mqtt', 'username', '')
43   config.set('mqtt', 'password', '')
44   config.set('mqtt', 'port', '1883')
45   config.read(conffile)
46
47   mqtt_server = config.get('mqtt', 'server')
48   mqtt_port = config.getint('mqtt', 'port')
49   mqtt_username = config.get('mqtt', 'username')
50   mqtt_password = config.get('mqtt', 'password')
51
52   mysql_server = config.get('mysql', 'server')
53   mysql_username = config.get('mysql','username')
54   mysql_password = config.get('mysql','password')
55   mysql_db = config.get('mysql','db')  
56   
57   client = paho.Client('weather')
58   client.username_pw_set(mqtt_username, mqtt_password)
59   client.on_message=on_message
60   client.connect(mqtt_server, port=mqtt_port)
61
62   database = MySQLdb.connect(host=mysql_server,user=mysql_username,passwd=mysql_password,db=mysql_db,use_unicode=True,connect_timeout=10)
63   database.set_character_set('utf8')
64   c = database.cursor()
65   c.execute('SET NAMES utf8;')
66
67   topics=[]
68   for topic in Topics():
69     topics.append((topic[0].encode('UTF-8'),1))
70   
71   client.subscribe(topics)
72
73 Init()
74
75 try:
76   while True:
77     try:
78       client.loop()
79     except:
80       break
81 finally:
82   exit()