Forked from https://bitbucket.org/AlekseevAV/noolite-mtrf-to-mqtt/
[mqtt-noolite.git] / nmd / main.py
1 import signal
2 import asyncio
3 import logging
4 import argparse
5
6 from nmd import MqttDriver
7
8 logger = logging.getLogger(__name__)
9
10
11 def get_args():
12     parser = argparse.ArgumentParser(prog='noolite_mtrf_mqtt', description='NooLite MTRF to MQTT')
13     parser.add_argument('--mtrf-serial-port', '-msp', required=True, type=str, help='MTRF-32-USB port name')
14     parser.add_argument('--mqtt-scheme', '-ms', default='mqtt', type=str, help='MQTT scheme')
15     parser.add_argument('--mqtt-host', '-mh', default='127.0.0.1', type=str, help='MQTT host')
16     parser.add_argument('--mqtt-port', '-mp', type=str, help='MQTT port')
17     parser.add_argument('--mqtt-user', '-mu', type=str, help='MQTT user')
18     parser.add_argument('--mqtt-password', '-mpass', type=str, help='MQTT password')
19     parser.add_argument('--mqtt-topic', '-mt', type=str, default='noolite', help='MQTT topic root')
20     parser.add_argument('--commands-delay', '-cd', type=float, default=0.1,
21                         help='Delay between sending commands to MTRF')
22     parser.add_argument('--logging-level', '-ll', default='INFO', type=str, help='Logging level')
23     return parser.parse_args()
24
25
26 def ask_exit():
27     for task in asyncio.Task.all_tasks():
28         task.cancel()
29
30
31 def run():
32     args = get_args()
33     logging.basicConfig(level=args.logging_level)
34
35     loop = asyncio.get_event_loop()
36     for sig in (signal.SIGINT, signal.SIGTERM):
37         loop.add_signal_handler(sig, ask_exit)
38
39     for can_be_empty_arg in ['mqtt_port', 'mqtt_user', 'mqtt_password']:
40         if getattr(args, can_be_empty_arg, None) == '__EMPTY__':
41             setattr(args, can_be_empty_arg, '')
42
43     mqtt_uri = '{scheme}://{user}{password}@{host}{port}'.format(
44         scheme=args.mqtt_scheme,
45         user=args.mqtt_user or '',
46         password=':{}'.format(args.mqtt_password) if args.mqtt_password else '',
47         host=args.mqtt_host,
48         port=':{}'.format(args.mqtt_port) if args.mqtt_port else '',
49     )
50
51     md = MqttDriver(mtrf_tty_name=args.mtrf_serial_port, loop=loop, mqtt_uri=mqtt_uri, mqtt_topic=args.mqtt_topic,
52                     commands_delay=args.commands_delay)
53
54     try:
55         loop.run_until_complete(md.run())
56     except asyncio.CancelledError as e:
57         logger.debug(e)
58     finally:
59         loop.close()
60
61
62 if __name__ == '__main__':
63     run()