#!/usr/bin/env python3 from typing import Optional from argparse import ArgumentParser, ArgumentError from home.config import config from home.mqtt import MqttNode, get_mqtt_modules, import_mqtt_module, MqttModule mqtt: Optional[MqttNode] = None def add_module(module: str) -> MqttModule: module = import_mqtt_module(module) if not hasattr(module, 'MODULE_NAME'): raise RuntimeError(f'MODULE_NAME not found in module {m}') cl = getattr(module, getattr(module, 'MODULE_NAME')) instance = cl() mqtt.add_module(instance) return instance if __name__ == '__main__': parser = ArgumentParser() parser.add_argument('--node-id', type=str, required=True) parser.add_argument('--modules', type=str, choices=get_mqtt_modules(), nargs='*', help='mqtt modules to include') parser.add_argument('--switch-relay', choices=[0, 1], type=int, help='send relay state') parser.add_argument('--switch-relay-secret', type=str, help='secret password to switch relay') config.load('mqtt_util', parser=parser) arg = parser.parse_args() if (arg.switch_relay is not None or arg.switch_relay_secret is not None) and 'relay' not in arg.modules: raise ArgumentError(None, '--relay is only allowed when \'relay\' module included in --modules') if (arg.switch_relay is not None and arg.switch_relay_secret is None) or (arg.switch_relay is None and arg.switch_relay_secret is not None): raise ArgumentError(None, 'both --switch-relay and --switch-relay-secret are required') mqtt = MqttNode(node_id=arg.node_id) # must-have modules add_module('ota') add_module('diagnostics') if arg.modules: for m in arg.modules: module_instance = add_module(m) if m == 'relay' and arg.switch_relay is not None: module_instance.switchpower(mqtt, arg.switch_relay == 1, arg.switch_relay_secret) mqtt.configure_tls() try: mqtt.connect_and_loop() except KeyboardInterrupt: mqtt.disconnect()