-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathxiaomi_mqtt_gateway
executable file
·94 lines (65 loc) · 2.85 KB
/
xiaomi_mqtt_gateway
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
#!/usr/bin/env python3
# coding: utf-8
import logging, sys
from logging import _nameToLevel
import argparse
import paho.mqtt.client as mqtt
from xiaomi_mqtt.connector import XiaomiConnector
from xiaomi_mqtt.mqtt import MqttBridge
from xiaomi_mqtt.homie import HomieMqttExporter
parser = argparse.ArgumentParser(description='Xiaomi-to-MQTT gateway')
parser.add_argument('--mqtt-host', default="localhost", help='MQTT broker hostname')
parser.add_argument('--mqtt-port', type=int, default=1883, help='MQTT broker port')
parser.add_argument('--mqtt-user', help='MQTT user name', default=None)
parser.add_argument('--mqtt-password', help='MQTT password', default=None)
parser.add_argument('--log-level', help='console log level (DEBUG, INFO, WARN, ERROR)', default="INFO")
parser.add_argument('--auto-rediscovery', default=True, type=bool, help="refresh HOMIE3 metadata on each device's value change")
args = parser.parse_args()
MQTT_PORT = 1883
MQTT_USER = 'test'
MQTT_PASSWORD = 'test'
PATH_FMT = "xiaomi/{model}/{sid}/{prop}" # short_id or sid ?
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=_nameToLevel[args.log_level])
logging.info("Starting Xiaomi MQTT gateway app...")
def prepare_mqtt():
userstr = "anonymous" if args.mqtt_user is None else args.mqtt_user
logging.info("Creating MQTT connection {}@{}:{}".format(userstr, args.mqtt_host, args.mqtt_port))
client = mqtt.Client()
if args.mqtt_user is not None:
client.username_pw_set(
args.mqtt_user,
args.mqtt_password,
)
client.connect(args.mqtt_host, args.mqtt_port, 60)
return client
mqtt_client = prepare_mqtt()
homie_exporter = HomieMqttExporter(mqtt_client)
def push_data(client, model, sid, cmd, data):
for key, value in data.items():
path = PATH_FMT.format(model=model,
sid=sid,
cmd=cmd,
prop=key)
client.publish(path, payload=value, qos=0)
def on_metadata(connector, sid, payload):
logging.info("METADATA CHANGED: sid {}: {}".format(sid, payload))
homie_exporter.export_devices(connector.get_devices().values())
def on_data(connector, cmd, sid, payload):
# if cmd == "iam":
# connector.send_get_id_list(payload['sid'])
if cmd == "report":
device = connector.get_devices()[sid]
logging.info("REPORT: sid {}".format(sid))
if args.auto_rediscovery:
homie_exporter.export_device(device)
homie_exporter.export_device_data(device)
if __name__ == "__main__":
mqtt_client.loop_start()
connector = XiaomiConnector(data_callback=on_data, metadata_callback=on_metadata)
try:
while True:
connector.check_incoming()
except KeyboardInterrupt:
logging.info('gateway stopped')
mqtt_client.loop_stop()
sys.exit(0)