Переделана обработка сообщений MQTT в связи с переходом на прошивку Sonoff-Tasmota...
[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 import json
9 from dateutil.parser import parser
10 tparser=parser()
11
12 def on_message(mosq, obj, msg):
13   topic=msg.topic
14   payload=json.loads(msg.payload)
15   timestamp=tparser.parse(payload['Time'])
16   for sensor_type in payload:
17     if sensor_type != 'Time':
18       sensor_data=payload[sensor_type]
19       for param in sensor_data:
20         try:
21           value=sensor_data[param]
22           c = database.cursor()
23           c.execute('CALL meteo.submit_mqtt(%s,%s,%s,%s,NULL)', (topic,sensor_type,param,value))
24           database.commit()
25           print topic,sensor_type,param,value
26         except:
27           print "Failed to submit data"  
28
29 def Topics():
30
31   c = database.cursor()
32   c.execute(
33     '''
34     select topic from mqtt_topics
35     '''
36   )
37
38   topics=c.fetchall()
39   return topics
40   
41   
42 def Init():
43
44   global client,database
45
46   conffile = sys.argv[1]
47
48   config = ConfigParser()
49   config.add_section('mqtt')
50   # set defaults for anonymous auth
51   config.set('mqtt', 'username', '')
52   config.set('mqtt', 'password', '')
53   config.set('mqtt', 'port', '1883')
54   config.read(conffile)
55
56   mqtt_server = config.get('mqtt', 'server')
57   mqtt_port = config.getint('mqtt', 'port')
58   mqtt_username = config.get('mqtt', 'username')
59   mqtt_password = config.get('mqtt', 'password')
60
61   mysql_server = config.get('mysql', 'server')
62   mysql_username = config.get('mysql','username')
63   mysql_password = config.get('mysql','password')
64   mysql_db = config.get('mysql','db')  
65   
66   client = paho.Client('weather')
67   client.username_pw_set(mqtt_username, mqtt_password)
68   client.on_message=on_message
69   client.connect(mqtt_server, port=mqtt_port)
70
71   database = MySQLdb.connect(host=mysql_server,user=mysql_username,passwd=mysql_password,db=mysql_db,use_unicode=True,connect_timeout=10)
72   database.set_character_set('utf8')
73   c = database.cursor()
74   c.execute('SET NAMES utf8;')
75
76   topics=[]
77   for topic in Topics():
78     topics.append((topic[0].encode('UTF-8'),1))
79   
80   client.subscribe(topics)
81
82 Init()
83
84 try:
85   while True:
86     try:
87       client.loop()
88     except:
89       break
90 finally:
91   exit()