import os import time import threading from dsmr_parser import telegram_specifications from dsmr_parser.clients import SerialReader, SERIAL_SETTINGS_V2_2, SERIAL_SETTINGS_V4, SERIAL_SETTINGS_V5 from app_settings import Settings from device_dsmr import Device_DSMR from serial import SerialException import logging logger = logging.getLogger(__name__) def main(): logfmt = "%(asctime)s [%(levelname)-5.5s] [%(name)s] %(message)s" logging.basicConfig(level=logging.INFO, format=logfmt, filename="dsmr2mqtt.log") # set up logging to console consolelog = logging.StreamHandler() consolelog.setLevel(logging.INFO) # set a format which is simpler for console use formatter = logging.Formatter(logfmt) consolelog.setFormatter(formatter) logging.getLogger("").addHandler(consolelog) cfg = Settings() protocol_version: str = str(cfg.dsmr_protocol) if 'V2' in protocol_version: serial_setup = SERIAL_SETTINGS_V2_2 spec = telegram_specifications.V2_2 elif 'V3' in protocol_version: serial_setup = SERIAL_SETTINGS_V4 spec = telegram_specifications.V3 elif 'V4' in protocol_version: serial_setup = SERIAL_SETTINGS_V4 spec = telegram_specifications.V4 else: serial_setup = SERIAL_SETTINGS_V5 spec = telegram_specifications.V5 device = Device_DSMR("dsmr", name="Digitale Slimme Meter") serial_reader = SerialReader(cfg.dsmr_port, serial_setup, spec) def handle_next_telegram(): telegram = next(serial_reader.read_as_object()) device.update(telegram) logger.info(f"New telegram at {telegram.P1_MESSAGE_TIMESTAMP.value}") def startTimer(): threading.Timer(cfg.dsmr_update_interval, startTimer).start() handle_next_telegram() startTimer() # for telegram in serial_reader.read_as_object(): # device.update(telegram) if __name__ == "__main__": main()