added driver updates

This commit is contained in:
Nico Melone
2023-02-05 09:01:11 -06:00
parent 93e27579cc
commit fe01435f0c
28 changed files with 9270 additions and 94 deletions

View File

@@ -995,6 +995,97 @@
"desc": "",
"transformType": 0
},
{
"name": "water_09_level",
"ctrlName": "hrtankbattery",
"group": "default",
"uploadType": "periodic",
"dataType": "FLOAT",
"addr": "WT_9.Val",
"decimal": 2,
"readWrite": "ro",
"unit": "",
"desc": "",
"transformType": 0
},
{
"name": "water_09_hihi_alm",
"ctrlName": "hrtankbattery",
"group": "default",
"uploadType": "periodic",
"dataType": "BIT",
"addr": "WT_9.Alm_HiHi",
"bitMap": 0,
"readWrite": "ro",
"unit": "",
"desc": "",
"transformType": 0
},
{
"name": "water_09_hi_alm",
"ctrlName": "hrtankbattery",
"group": "default",
"uploadType": "periodic",
"dataType": "BIT",
"addr": "WT_9.Alm_Hi",
"bitMap": 0,
"readWrite": "ro",
"unit": "",
"desc": "",
"transformType": 0
},
{
"name": "water_09_tx_alm",
"ctrlName": "hrtankbattery",
"group": "default",
"uploadType": "periodic",
"dataType": "BIT",
"addr": "WT_9.Alm_Fail",
"bitMap": 0,
"readWrite": "ro",
"unit": "",
"desc": "",
"transformType": 0
},
{
"name": "water_09_hihi_spt",
"ctrlName": "hrtankbattery",
"group": "default",
"uploadType": "periodic",
"dataType": "FLOAT",
"addr": "WT_9.PSet_HiHiLim",
"decimal": 2,
"readWrite": "ro",
"unit": "",
"desc": "",
"transformType": 0
},
{
"name": "water_09_hi_spt",
"ctrlName": "hrtankbattery",
"group": "default",
"uploadType": "periodic",
"dataType": "FLOAT",
"addr": "WT_9.PSet_HiLim",
"decimal": 2,
"readWrite": "ro",
"unit": "",
"desc": "",
"transformType": 0
},
{
"name": "water_09_max_height",
"ctrlName": "hrtankbattery",
"group": "default",
"uploadType": "periodic",
"dataType": "FLOAT",
"addr": "WT_9.Cfg_PVEUMax",
"decimal": 2,
"readWrite": "ro",
"unit": "",
"desc": "",
"transformType": 0
},
{
"name": "oil_run_tank",
"ctrlName": "hrtankbattery",
@@ -2742,6 +2833,57 @@
"content": "Water Tank 8 transmission error",
"alarmLable": "default"
},
{
"name": "water_09_hihi_alm",
"ctrlName": "hrtankbattery",
"measureName": "water_09_hihi_alm",
"alarmLevel": 5,
"cond1": {
"op": "eq",
"value": "1.0"
},
"condOp": "none",
"cond2": {
"op": "eq",
"value": ""
},
"content": "Water Tank 9 crossed HiHi threshold",
"alarmLable": "default"
},
{
"name": "water_09_hi_alm",
"ctrlName": "hrtankbattery",
"measureName": "water_09_hi_alm",
"alarmLevel": 5,
"cond1": {
"op": "eq",
"value": "1.0"
},
"condOp": "none",
"cond2": {
"op": "eq",
"value": ""
},
"content": "Water Tank 9 crossed Hi threshold",
"alarmLable": "default"
},
{
"name": "water_09_tx_alm",
"ctrlName": "hrtankbattery",
"measureName": "water_09_tx_alm",
"alarmLevel": 5,
"cond1": {
"op": "eq",
"value": "1.0"
},
"condOp": "none",
"cond2": {
"op": "eq",
"value": ""
},
"content": "Water Tank 9 transmission error",
"alarmLable": "default"
},
{
"name": "oil_01_hihi_alm",
"ctrlName": "hrtankbattery",

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,12 @@
# Enter your python code.
import json, time
from common.Logger import logger
from quickfaas.remotebus import publish
def sendAlarm(message):
logger.info(message)
payload = {}
payload["ts"] = time.time()*1000
payload["values"] = {message["measureName"]: message["value"]}
publish(__topic__, json.dumps(payload), __qos__)

View File

@@ -0,0 +1,138 @@
# Enter your python code.
import json, os
from datetime import datetime as dt
from common.Logger import logger
from quickfaas.remotebus import publish
from quickfaas.global_dict import get as get_params
from quickfaas.global_dict import _set_global_args
def reboot(reason="Rebooting for config file update"):
#basic = Basic()
logger.info("!" * 10 + "REBOOTING DEVICE" + "!"*10)
logger.info(reason)
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.debug("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.debug(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.debug("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.debug("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.debug("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.debug("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.debug("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.debug("initializing param file with params in memory")
json.dump(convertDStoJSON(get_params()), p)
cfg["labels"] = get_params()
return cfg
def sendData(message):
#logger.debug(message)
try:
checkCredentialConfig()
except Exception as e:
logger.error(e)
payload = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}}
for measure in message["measures"]:
try:
logger.debug(measure)
if abs(payload["ts"]/1000 - measure["timestamp"]) > 3600:
reboot(reason="Poll timestamp and actual timestamp out of sync. Actual: {} Poll: {}".format(payload["ts"]/1000,measure["timestamp"]))
payload["values"][measure["name"]] = measure["value"]
except Exception as e:
logger.error(e)
publish(__topic__, json.dumps(payload), __qos__)
publish("v1/devices/me/attributes", json.dumps({"latestReportTime": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__)

View File

@@ -0,0 +1,66 @@
import json, time
from quickfaas.measure import recall, write
from quickfaas.remotebus import publish
from common.Logger import logger
def sync():
#get new values and send
payload = {}
topic = "v1/devices/me/telemetry"
try:
data = recall()#json.loads(recall().decode("utf-8"))
except Exception as e:
logger.error(e)
logger.debug(data)
for controller in data:
for measure in controller["measures"]:
#publish measure
payload[measure["name"]] = measure["value"]
logger.debug("Sending on topic: {}".format(topic))
logger.debug("Sending value: {}".format(payload))
publish(topic, json.dumps(payload), 1)
def writeplctag(value):
#value in the form {"measurement": <measurement_name>, "value": <value to write>}
try:
#value = json.loads(value.replace("'",'"'))
logger.debug(value)
#payload format: [{"name": "advvfdipp", "measures": [{"name": "manualfrequencysetpoint", "value": 49}]}]
message = [{"name": "hrtankbattery", "measures":[{"name":value["measurement"], "value": value["value"]}]}]
resp = write(message)
logger.debug("RETURN FROM WRITE: {}".format(resp))
return True
except Exception as e:
logger.debug(e)
return False
def receiveCommand(topic, payload):
try:
logger.debug(topic)
logger.debug(json.loads(payload))
p = json.loads(payload)
command = p["method"]
commands = {
"sync": sync,
"writeplctag": writeplctag,
}
if command == "setPLCTag":
try:
result = commands["writeplctag"](p["params"])
logger.debug(result)
except Exception as e:
logger.error(e)
#logger.debug(command)
ack(topic.split("/")[-1])
time.sleep(5)
sync()
except Exception as e:
logger.debug(e)
def ack(msgid):
#logger.debug(msgid)
#logger.debug(mac)
#logger.debug(name)
#logger.debug(value)
publish("v1/devices/me/rpc/response/" + str(msgid), json.dumps({"msg": {"time": time.time()}, "metadata": "", "msgType": ""}), 1)