· 8 years ago · Mar 12, 2018, 10:12 PM
1#!/usr/bin/env python3
2
3import paho.mqtt.client as mqtt
4import sqlite3
5import json
6import secrets
7
8#print(dir(mqtt))
9
10class MainGUI:
11 """
12 to add later
13 """
14 def __init__(self):
15
16 # create and configure logger
17 mqtt.logging.basicConfig(filename = 'iot_gui.log',
18 filemode = 'w',
19 level = mqtt.logging.DEBUG,
20 datefmt = '%d-%m-%Y %H:%M:%S',
21 format = '%(asctime)s %(levelname)8s: %(message)s')
22
23 self.logger = mqtt.logging.getLogger(__name__)
24 self.logger.info('------------------------------------------------')
25
26 def fake_data(self):
27 """ Generate a dictionary with fake data """
28
29 chars = mqtt.string.ascii_letters + mqtt.string.digits
30
31 fake_id = '{}_{}'.format('esp8266', ''.join(secrets.choice(chars) for i in range(8)))
32 fake_mac = ''
33 fake_ip = '.'.join(map(str, (mqtt.random.randint(0, 255) for i in range(4))))
34 fake_hw = '{} {}'.format(mqtt.platform.system(), mqtt.platform.release())
35 fake_sw = '{} {}'.format('Python', mqtt.platform.python_version())
36 fake_temp = '{0:.1f} °C'.format(mqtt.random.uniform(-10, 40))
37
38 fake_data = {'Client ID' : fake_id,
39 'IP Adress' : fake_ip,
40 'Hardware' : fake_hw,
41 'Software' : fake_sw,
42 'Temperature' : fake_temp}
43 #print(fake_data)
44 return fake_temp
45
46
47 def check_internet(self, host='8.8.8.8', port=53):
48 """
49 Host: 8.8.8.8 (google-public-dns-a.google.com)
50 OpenPort: 53/tcp
51 Service: domain (DNS/TCP)
52 """
53 try:
54 mqtt.socket.setdefaulttimeout(1)
55 mqtt.socket.socket(mqtt.socket.AF_INET, mqtt.socket.SOCK_STREAM).connect((host, port))
56 return True
57 except Exception as ex:
58 pass
59 return False
60
61 def mqtt_on_connect(self, client, userdata, flags, rc):
62 self.logger.debug('MQTT on_connect callback triggered')
63 if rc == 0:
64 client.connected_flag = True
65 self.logger.debug('return code ' + str(rc))
66 self.logger.info('Connected successfully to MQTT Broker')
67 # ask for data
68 client.subscribe('/board/info/', qos=2)
69 self.logger.info('Subscribing to /board/info/')
70
71 else:
72 client.connected_flag = False
73 self.logger.info('Connection failed with return code ' + str(rc))
74
75
76 def mqtt_on_disconnect(self, client, userdata, rc):
77 self.logger.debug('MQTT on_disconnect callback triggered')
78
79 def mqtt_on_publish(self, client, userdata, mid):
80 self.logger.debug('MQTT on_publish callback triggered')
81
82 def mqtt_on_subscribe(self, client, userdata, mid, granted_qos):
83 self.logger.debug('MQTT on_subscribe callback triggered')
84 self.logger.info('Subscribed successfully')
85
86 def mqtt_on_message(self, client, userdata, message):
87 self.logger.debug('MQTT on_message callback triggered')
88 self.logger.info(message.topic)
89 self.logger.info(message.payload)
90 if message.payload == b'aprins':
91 self.logger.info('Ai aprins becul')
92 elif message.payload == b'costel':
93 self.logger.info('Costel')
94
95 def mqtt_on_log(self, client, userdata, level, buf):
96 self.logger.debug('MQTT on_log callback triggered')
97 self.logger.info(str(buf))
98
99 def mqtt_start(self):
100 """ Start the MQTT Broker """
101
102 mqtt.Client.connected_flag = False
103
104 # create client
105 client = mqtt.Client(client_id='domotica', clean_session=True, protocol=mqtt.MQTTv311)
106 # bind callbacks
107 client.on_connect = self.mqtt_on_connect
108 #client.on_disconect = self.mqtt_on_disconnect
109 client.on_publish = self.mqtt_on_publish
110 client.on_subscribe = self.mqtt_on_subscribe
111 client.on_message = self.mqtt_on_message
112 #client.on_log = self.mqtt_on_log
113
114
115 if self.check_internet():
116 try:
117 self.logger.info('Connected successfully to Internet')
118 client.connect('iot.eclipse.org', port=1883, keepalive=60)
119 client.loop_start()
120 while True:
121 mqtt.time.sleep(10)
122 else:
123 client.loop_stop()
124 client.disconnect()
125 except mqtt.socket.error:
126 mqtt.socket.sys.exit()
127
128 else:
129 self.logger.error('Internet is down')
130
131 def save_to_db(self):
132 with sqlite3.connect('iot_gui.db') as db:
133 cursor = db.cursor()
134
135 cursor.execute('''
136 CREATE TABLE IF NOT EXISTS home(
137 ID INTEGER PRIMARY KEY,
138 SENSOR VARCHAR(20) NOT NULL);
139 ''')
140
141 cursor.execute('''
142 INSERT INTO home(SENSOR)
143 VALUES('16.4');
144 ''')
145
146 db.commit()
147
148 cursor.execute("SELECT * FROM home")
149 print(cursor.fetchall())
150
151
152
153
154def main():
155 board = MainGUI()
156 #print(board.fake_data())
157 board.save_to_db()
158 board.mqtt_start()
159
160
161
162
163if __name__ == '__main__':
164 main()