139 lines
3.1 KiB
Python
Executable File
139 lines
3.1 KiB
Python
Executable File
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)
|
|
|