from queue import SimpleQueue import time import threading import configparser import atexit import logging import logging.handlers import tibberclient import victronclient import controller import mqtthandler queue = SimpleQueue() queue_handler = logging.handlers.QueueHandler(queue) listener = logging.handlers.QueueListener( queue, logging.StreamHandler(), ) logger = logging.getLogger('main') logger.addHandler(queue_handler) formatter = logging.Formatter('[%(asctime)s] %(message)s') queue_handler.setFormatter(formatter) logging.basicConfig(level=logging.INFO) logger.info("Chargeman v0.2 starting") config = configparser.ConfigParser() config.read('config.ini') if not 'tibber' in config: raise Exception("Missing section tibber in config") if not 'key' in config['tibber']: raise Exception("Missing tibber key in config") victronconn = victronclient.client() tibber = tibberclient.client(config['tibber']['key']) cm = controller.chargeman_controller(victronconn,tibber) mqtt = mqtthandler.handler(cm) if 'battery_total' in config: try: cm.set_battery_total_net_delivery(float(config['battery_total']['net_delivery'])) except Exception: logger.error("Unable to load net_delivery {}".format(config['battery_total']['net_delivery'])) exit() try: cm.set_battery_total_net_usage(float(config['battery_total']['net_usage'])) except Exception: logger.error("Unable to load net_usage {}".format(config['battery_total']['net_usage'])) exit() if 'status' in config: logger.info("Chargemode loaded: {}".format(int(config['status']['chargemode']))) cm.set_chargemode(controller.Chargemode(int(config['status']['chargemode']))) if 'chargevalue' in config['status']: logger.info("Chargevalue loaded: {}".format(int(config['status']['chargevalue']))) cm.set_chargevalue(int(config['status']['chargevalue'])) if 'valuekwh' in config['status']: logger.info("valuekwh loaded: {}".format(float(config['status']['valuekwh']))) cm.set_chargevaluekwh(float(config['status']['valuekwh'])) lasthour = -1 lock = threading.Lock() def update(): logger.debug("Run update") victronconn.update() cm.update() config['battery_total'] = {} config['battery_total']['net_usage'] = str(cm.get_battery_total_net_usage()) config['battery_total']['net_delivery'] = str(cm.get_battery_total_net_delivery()) config['status'] = {} config['status']['chargemode'] = str(cm.get_chargemode_int()) config['status']['chargevalue'] = str(cm.get_chargevalue()) config['status']['valuekwh'] = str(cm.get_chargevaluekwh()) with open('config.ini', 'w') as configfile: config.write(configfile) pass def main(): while True: try: update() except Exception: logger.exception("Update failed, retrying next cycle") time.sleep(10) #pub=threading.Thread(target=publishing) sub=threading.Thread(target=mqtt.subscribing) main=threading.Thread(target=main) listener.start() sub.start() tibber.start() main.start() atexit.register(listener.stop)