import json, os, uuid from datetime import datetime as dt from common.Logger import logger from quickfaas.remotebus import publish from paho.mqtt import client from quickfaas.global_dict import get as get_params from quickfaas.global_dict import _set_global_args def reboot(): #basic = Basic() logger.info("!" * 10 + "REBOOTING DEVICE" + "!"*10) r = os.popen("kill -s SIGHUP `cat /var/run/python/supervisord.pid`").read() logger.info(f"REBOOT : {r}") def checkFileExist(filename): path = "/var/user/files" if not os.path.exists(path): logger.info("no folder making files folder in var/user") os.makedirs(path) with open(path + "/" + filename, "a") as f: json.dump({}, f) if not os.path.exists(path + "/" + filename): logger.info("no creds file making creds file") with open(path + "/" + filename, "a") as f: json.dump({}, f) def convertDStoJSON(ds): j = dict() for x in ds: j[x["key"]] = x["value"] return j def convertJSONtoDS(j): d = [] for key in j.keys(): d.append({"key": key, "value": j[key]}) return d def checkCredentialConfig(): logger.info("CHECKING CONFIG") cfgpath = "/var/user/cfg/device_supervisor/device_supervisor.cfg" credspath = "/var/user/files/creds.json" cfg = dict() with open(cfgpath, "r") as f: cfg = json.load(f) clouds = cfg.get("clouds") logger.info(clouds) #if not configured then try to configure from stored values if clouds[0]["args"]["clientId"] == "unknown" or clouds[0]["args"]["username"] == "unknown" or not clouds[0]["args"]["passwd"] or clouds[0]["args"]["passwd"] == "unknown": checkFileExist("creds.json") with open(credspath, "r") as c: creds = json.load(c) if creds: logger.info("updating config with stored data") clouds[0]["args"]["clientId"] = creds["clientId"] clouds[0]["args"]["username"] = creds["userName"] clouds[0]["args"]["passwd"] = creds["password"] cfg["clouds"] = clouds cfg = checkParameterConfig(cfg) with open(cfgpath, "w", encoding='utf-8') as n: json.dump(cfg, n, indent=1, ensure_ascii=False) reboot() else: #assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data checkFileExist("creds.json") with open(credspath, "r") as c: logger.info("updating stored file with new data") cfg = checkParameterConfig(cfg) with open(cfgpath, "w", encoding='utf-8') as n: json.dump(cfg, n, indent=1, ensure_ascii=False) creds = json.load(c) if creds: if creds["clientId"] != clouds[0]["args"]["clientId"]: creds["clientId"] = clouds[0]["args"]["clientId"] if creds["userName"] != clouds[0]["args"]["username"]: creds["userName"] = clouds[0]["args"]["username"] if creds["password"] != clouds[0]["args"]["passwd"]: creds["password"] = clouds[0]["args"]["passwd"] else: creds["clientId"] = clouds[0]["args"]["clientId"] creds["userName"] = clouds[0]["args"]["username"] creds["password"] = clouds[0]["args"]["passwd"] with open(credspath, "w") as cw: json.dump(creds,cw) def checkParameterConfig(cfg): logger.info("Checking Parameters!!!!") paramspath = "/var/user/files/params.json" cfgparams = convertDStoJSON(cfg.get("labels")) #check stored values checkFileExist("params.json") with open(paramspath, "r") as f: logger.info("Opened param storage file") params = json.load(f) if params: if cfgparams != params: #go through each param #if not "unknown" and cfg and params aren't the same take from cfg likely updated manually #if key in cfg but not in params copy to params logger.info("equalizing params between cfg and stored") for key in cfgparams.keys(): try: if cfgparams[key] != params[key] and cfgparams[key] != "unknown": params[key] = cfgparams[key] except: params[key] = cfgparams[key] cfg["labels"] = convertJSONtoDS(params) _set_global_args(convertJSONtoDS(params)) with open(paramspath, "w") as p: json.dump(params, p) else: with open(paramspath, "w") as p: logger.info("initializing param file with params in memory") json.dump(convertDStoJSON(get_params()), p) cfg["labels"] = get_params() return cfg payload = {} try: with open("/var/user/files/totalizers.json", "r") as t: totalizers = json.load(t) if not totalizers: logger.info("-----INITIALIZING TOTALIZERS-----") totalizers = { "day": 0, "month": 0, "lifetime": 0, "dayHolding": 0, "monthHolding": 0 } except: totalizers = { "day": 0, "month": 0, "lifetime": 0, "dayHolding": 0, "monthHolding": 0 } lwtData = { "init":False, "client": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport="tcp") } def lwt(mac): try: #if not lwtData["connected"]: if not lwtData["init"]: print("INITIALIZING LWT CLIENT") lwtData["client"].username_pw_set(username="admin", password="columbus") lwtData["client"].will_set("meshify/db/194/_/mainHP/" + mac + ":00:00/connected",json.dumps([{"value":False}])) lwtData["client"].reconnect_delay_set(min_delay=10, max_delay=120) lwtData["init"] = True print("Connecting to MQTT Broker for LWT purposes!!!!!!!") lwtData["client"].connect("mq194.imistaway.net",1883, 600) lwtData["client"].reconnect() lwtData["client"].publish("meshify/db/194/_/mainHP/" + mac + ":00:00/connected", json.dumps([{"value":True}])) except Exception as e: print("LWT DID NOT DO THE THING") print(e) def sendData(message,wizard_api): logger.debug(message) mac = __topic__.split("/")[-1] #':'.join(re.findall('..', '%012x' % uuid.getnode())) lwt(mac) checkCredentialConfig() try: publishFlowrate( message["values"]["flowmonitor"]["flowrate"]["raw_data"], message["values"]["flowmonitor"]["flow_unit"]["raw_data"]) totalizeDay(message["values"]["flowmonitor"]["totalizer_1"]["raw_data"],message["values"]["flowmonitor"]["totalizer_1_unit"]["raw_data"]) totalizeMonth(message["values"]["flowmonitor"]["totalizer_1"]["raw_data"],message["values"]["flowmonitor"]["totalizer_1_unit"]["raw_data"]) except Exception as e: logger.error(e) def saveTotalizers(): try: with open("/var/user/files/totalizers.json", "w") as t: json.dump(totalizers,t) except Exception as e: logger.error(e) def publishFlowrate(fr, unit): if unit == 45: publish(__topic__ + ":01:40/" + "gpm_flow", json.dumps([{"value": f"{fr}"}]),__qos__) publish(__topic__ + ":01:40/" + "bpd_flow", json.dumps([{"value": f"{fr*((60*24)/42)}"}]),__qos__) elif unit == 63: publish(__topic__ + ":01:40/" + "bpd_flow", json.dumps([{"value": f"{fr}"}]),__qos__) publish(__topic__ + ":01:40/" + "gpm_flow", json.dumps([{"value": f"{fr * (42/(24*60))}"}]),__qos__) def totalizeDay(lifetime,unit): now = dt.now() reset = False value = lifetime - totalizers["dayHolding"] if not int(now.strftime("%d")) == int(totalizers["day"]): totalizers["dayHolding"] = lifetime totalizers["day"] = int(now.strftime("%d")) saveTotalizers() reset = True if unit == 11: publish(__topic__ + ":01:40/" + "gal_total", json.dumps([{"value": f"{value}"}]),__qos__) publish(__topic__ + ":01:40/" + "bbl_total", json.dumps([{"value": f"{value/42}"}]),__qos__) publish(__topic__ + ":01:40/" + "lifetime_flow_meter_gal", json.dumps([{"value": f"{lifetime}"}]),__qos__) publish(__topic__ + ":01:40/" + "lifetime_flow_meter_bbls", json.dumps([{"value": f"{lifetime/42}"}]),__qos__) if reset: publish(__topic__ + ":01:40/" + "gal_total", json.dumps([{"value": f"{0}"}]),__qos__) publish(__topic__ + ":01:40/" + "bbl_total", json.dumps([{"value": f"{0}"}]),__qos__) publish(__topic__ + ":01:40/" + "gal_total_yesterday", json.dumps([{"value": f"{value}"}]),__qos__) publish(__topic__ + ":01:40/" + "bbl_total_yesterday", json.dumps([{"value": f"{value/42}"}]),__qos__) elif unit == 15: publish(__topic__ + ":01:40/" + "bbl_total", json.dumps([{"value": f"{value}"}]),__qos__) publish(__topic__ + ":01:40/" + "gal_total", json.dumps([{"value": f"{value*42}"}]),__qos__) publish(__topic__ + ":01:40/" + "lifetime_flow_meter_bbls", json.dumps([{"value": f"{lifetime}"}]),__qos__) publish(__topic__ + ":01:40/" + "lifetime_flow_meter_gal", json.dumps([{"value": f"{lifetime*42}"}]),__qos__) if reset: publish(__topic__ + ":01:40/" + "bbl_total", json.dumps([{"value": f"{0}"}]),__qos__) publish(__topic__ + ":01:40/" + "gal_total", json.dumps([{"value": f"{0}"}]),__qos__) publish(__topic__ + ":01:40/" + "bbl_total_yesterday", json.dumps([{"value": f"{value}"}]),__qos__) publish(__topic__ + ":01:40/" + "gal_total_yesterday", json.dumps([{"value": f"{value*42}"}]),__qos__) def totalizeMonth(lifetime, unit): now = dt.now() reset = False value = lifetime - totalizers["monthHolding"] if not int(now.strftime("%m")) == int(totalizers["month"]): totalizers["monthHolding"] = lifetime totalizers["month"] = now.strftime("%m") saveTotalizers() reset = True if unit == 11: publish(__topic__ + ":01:40/" + "gal_total_thismonth", json.dumps([{"value": f"{value}"}]),__qos__) publish(__topic__ + ":01:40/" + "bbl_total_thismonth", json.dumps([{"value": f"{value/42}"}]),__qos__) if reset: publish(__topic__ + ":01:40/" + "gal_total_thismonth", json.dumps([{"value": f"{0}"}]),__qos__) publish(__topic__ + ":01:40/" + "bbl_total_thismonth", json.dumps([{"value": f"{0}"}]),__qos__) publish(__topic__ + ":01:40/" + "gal_total_lastmonth", json.dumps([{"value": f"{value}"}]),__qos__) publish(__topic__ + ":01:40/" + "bbl_total_lastmonth", json.dumps([{"value": f"{value/42}"}]),__qos__) elif unit == 15: publish(__topic__ + ":01:40/" + "bbl_total_thismonth", json.dumps([{"value": f"{value}"}]),__qos__) publish(__topic__ + ":01:40/" + "gal_total_thismonth", json.dumps([{"value": f"{value*42}"}]),__qos__) if reset: publish(__topic__ + ":01:40/" + "bbl_total_thismonth", json.dumps([{"value": f"{0}"}]),__qos__) publish(__topic__ + ":01:40/" + "gal_total_thismonth", json.dumps([{"value": f"{0}"}]),__qos__) publish(__topic__ + ":01:40/" + "bbl_total_lastmonth", json.dumps([{"value": f"{value}"}]),__qos__) publish(__topic__ + ":01:40/" + "gal_total_lastmonth", json.dumps([{"value": f"{value*42}"}]),__qos__)