class MyLogger: def __init__(self, mqtt=False, mqtt_conf="/conf/mqtt_conf.txt"): self.mqtt = mqtt if mqtt: config_loader = ConfigurationLoader(mqtt_conf) broker = config_loader.load_configuration( 'mqtt_broker')['mqtt_broker'] self.publisher = MQTTClient('logger', broker) self.publisher.DEBUG = True self.publisher.MSG_QUEUE_MAX = 0 self.rtc = RTC() self.colors = { "DEBUG": "\033[0m", "RESET": "\033[0m", "WARNING": "\033[35m", "ERROR": "\033[33m", "CRITICAL": "\033[31m", "INFO": "\033[32m" } def log(self, level, caller, *message): timestamp_tuple = self.rtc.datetime() timestamp = "{}/{}/{} {}:{}:{}".format( timestamp_tuple[2], timestamp_tuple[1], timestamp_tuple[0], timestamp_tuple[4], timestamp_tuple[5], timestamp_tuple[6]) if message: log = "{} [{}]: [{}] {}".format(timestamp, level, caller, message[0]) else: message = caller log = "{} [{}]: {}".format(timestamp, level, message) try: sys.stdout.write(self.colors[level]) print(log) sys.stdout.write(self.colors["RESET"]) if level != 'DEBUG' and level != 'INFO' and self.mqtt: self._send_over_mqtt("log" + level, log) except: print(log) def _send_over_mqtt(self, topic, log): try: self.publisher.ping() self.publisher.publish(topic, log, qos=1) except: try: self.publisher.connect() self.publisher.publish(topic, log, qos=1) except: None
class SwitchReader: def __init__(self, config_file='/config/switch.txt'): config_loader = ConfigurationLoader(config_file) configs = config_loader.load_configuration('mqtt_broker', 'mqtt_topic', 'mqtt_id', 'switch_pin', 'switch_update_period') self.config_file = config_file self.switch_update_period = int(configs['switch_update_period']) self.mqtt_client = MQTTClient(configs['mqtt_id'], configs['mqtt_broker']) self.mqtt_client.DEBUG = True self.mqtt_topic = configs['mqtt_topic'] self.switch_pin_num = int(configs['switch_pin']) self.switch_pin = Pin(self.switch_pin_num, Pin.IN) self.id = configs['mqtt_id'] self.mqtt_broker = configs['mqtt_broker'] self.logger = MyLogger(False) self.logger.log('DEBUG', self.id, 'Connecting to {}...'.format(self.mqtt_broker)) try: self.mqtt_client.connect() self.logger.log('INFO', self.id, 'Reconnected to {}'.format(self.mqtt_broker)) except: self.logger.log( 'ERROR', self.id, 'Connection failure to {}'.format(self.mqtt_broker)) self.last_switch_position = self.switch_pin.value() self.mqtt_messages_sent = 0 self.debounce_time = 0.5 self.timer = None self.init_timer() def init_timer(self): self.deinit_timer() self.timer = Timer(-1) self.timer.init(period=self.switch_update_period, mode=Timer.ONE_SHOT, callback=lambda t: self.loop()) def loop(self): self.read_switch() self.init_timer() def deinit_timer(self): if isinstance(self.timer, Timer): self.timer.deinit() self.timer = None def read_switch(self): switch_position = self.switch_pin.value() if switch_position != self.last_switch_position: self.last_switch_position = switch_position self.notify_hub() self.deinit_timer() sleep(self.debounce_time) def notify_hub(self): if not self._connected_to_broker(): try: self.mqtt_client.connect() self.logger.log('INFO', self.id, 'Reconnected to {}'.format(self.mqtt_broker)) except: self.logger.log( 'ERROR', self.id, 'Connection failure to {}'.format(self.mqtt_broker)) try: ''' if self.mqtt_messages_sent > 3: self.reset_mqtt_connection() ''' self.mqtt_client.publish(topic=self.mqtt_topic, msg='pressed', qos=1) self.logger.log('INFO', self.id, 'hub successfully notified') self.mqtt_messages_sent += 1 self.reset_mqtt_connection() except Exception as e: self.logger.log('ERROR', self.id, "Can't notify the hub; {}".format(e)) def reset_mqtt_connection(self): self.mqtt_client.disconnect() sleep(0.1) self.mqtt_client.connect() self.mqtt_messages_sent = 0 def _connected_to_broker(self): try: self.mqtt_client.ping() return True except: return False def edit_configuration(self, key, value): try: with open(self.config_file, 'rb') as file: configs = json.load(file) except Exception as e: self.logger.log('ERROR', self.__class__.__name__, "Can't open configuration file; {}".format(e)) return False configs[key] = value try: with open(self.config_file, 'wb') as file: json.dump(configs, file) except Exception as e: self.logger.log('ERROR', self.__class__.__name__, "Can't save configuration; {}".format(e)) return False return True