-
Notifications
You must be signed in to change notification settings - Fork 2
/
mqtt_report_data.py
133 lines (106 loc) · 3.4 KB
/
mqtt_report_data.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (c) 2021 MarsLink <[email protected]>
# This shows an example of an MQTT client that upload xiaomi temperature/humidity/battery into MarsLink cloud platform.
import sys
import getopt
import time
#import context # Ensures paho is in PYTHONPATH
import paho.mqtt.client as mqtt
import xiaomi_ble_device as xm_ble
from xiaomi_ble_device import Measure
final_mid = 0
#Take for xiaomi LYWSD03MMC for example
ble_device_mac = "A4:C1:38:6C:EF:9B"
def on_connect(mqttc, userdata, flags, rc):
if userdata == True:
print("rc: " + str(rc))
def on_message(mqttc, userdata, msg):
global final_mid
if msg.retain == 0:
pass
# sys.exit()
else:
if userdata == True:
print("Clearing topic " + msg.topic)
(rc, final_mid) = mqttc.publish(msg.topic, None, 1, True)
def on_publish(mqttc, userdata, mid):
global final_mid
if mid == final_mid:
pass
# sys.exit()
def on_log(mqttc, userdata, level, string):
print(string)
def print_usage():
print(
"mqtt_report_data.py [-d] [-h hostname] [-i clientid] [-k keepalive] [-p port] [-u username [-P password]] [-v]")
#get xiaomi themal data from ble device
p = xm_ble.connect(ble_device_mac)
def get_temp_data():
p.withDelegate(Measure("mijia"))
p.waitForNotifications(2000)
def main(argv):
debug = True
host = ""
client_id = None
keepalive = 60
port = 1883
password = ""
topic = None
username = ""
verbose = False
try:
opts, args = getopt.getopt(argv, "dh:i:k:p:P:t:u:v",
["debug", "id", "keepalive", "port", "password", "topic", "username", "verbose"])
except getopt.GetoptError:
print_usage()
sys.exit(2)
for opt, arg in opts:
if opt in ("-d", "--debug"):
debug = True
elif opt in ("-h", "--host"):
host = arg
elif opt in ("-i", "--id"):
client_id = arg
elif opt in ("-k", "--keepalive"):
keepalive = int(arg)
elif opt in ("-p", "--port"):
port = int(arg)
elif opt in ("-P", "--password"):
password = arg
elif opt in ("-t", "--topic"):
topic = arg
print(topic)
elif opt in ("-u", "--username"):
username = arg
elif opt in ("-v", "--verbose"):
verbose = True
if topic == None:
print("You must provide a topic to clear.\n")
print_usage()
sys.exit(2)
mqttc = mqtt.Client(client_id)
mqttc._userdata = verbose
mqttc.on_message = on_message
mqttc.on_publish = on_publish
mqttc.on_connect = on_connect
if debug:
mqttc.on_log = on_log
if username:
mqttc.username_pw_set(username, password)
#Connect to MQTT server or broker.
mqttc.connect(host, port, keepalive)
# time.sleep(5)
mqttc.subscribe(topic)
mqttc.loop_start()
for x in range (0, 100):
get_temp_data()
res = xm_ble.getresult()
msgs = '{"deviceId": "LYWSD03MMC","properties": {"temperature":"' + str(res[0]) + '","humidity":"' + str(res[1]) + '","battery":"' + str(res[3]) + '"}}'
print(msgs)
infot = mqttc.publish("/report-property", str(msgs))
infot.wait_for_publish()
time.sleep(2)
mqttc.disconnect()
if __name__ == "__main__":
main(sys.argv[1:])