diff --git a/.DS_Store b/.DS_Store index c6c1e49..47f6042 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/Pub_Sub.zip b/Pub_Sub.zip new file mode 100644 index 0000000..6419cdf Binary files /dev/null and b/Pub_Sub.zip differ diff --git a/Pub_Sub/.DS_Store b/Pub_Sub/.DS_Store index 7801afd..ad5d486 100644 Binary files a/Pub_Sub/.DS_Store and b/Pub_Sub/.DS_Store differ diff --git a/Pub_Sub/__pycache__/convert_config.cpython-310.pyc b/Pub_Sub/__pycache__/convert_config.cpython-310.pyc index 299d45d..ebbcb13 100644 Binary files a/Pub_Sub/__pycache__/convert_config.cpython-310.pyc and b/Pub_Sub/__pycache__/convert_config.cpython-310.pyc differ diff --git a/Pub_Sub/abbflow/.DS_Store b/Pub_Sub/abbflow/.DS_Store deleted file mode 100644 index c2ff33f..0000000 Binary files a/Pub_Sub/abbflow/.DS_Store and /dev/null differ diff --git a/Pub_Sub/abbflow/thingsboard/v2/abbflowrtu_tb_v2.cfg b/Pub_Sub/abbflow_rtu/thingsboard/abbflow_rtu_tb_v2.cfg similarity index 100% rename from Pub_Sub/abbflow/thingsboard/v2/abbflowrtu_tb_v2.cfg rename to Pub_Sub/abbflow_rtu/thingsboard/abbflow_rtu_tb_v2.cfg diff --git a/Pub_Sub/abbflow_rtu/thingsboard/abbflow_rtu_tb_v3.cfg b/Pub_Sub/abbflow_rtu/thingsboard/abbflow_rtu_tb_v3.cfg new file mode 100644 index 0000000..07a5519 --- /dev/null +++ b/Pub_Sub/abbflow_rtu/thingsboard/abbflow_rtu_tb_v3.cfg @@ -0,0 +1,388 @@ +{ + "controllers": [ + { + "protocol": "Modbus-RTU", + "name": "abbflow", + "args": { + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "continuousAcquisition": 1, + "maxContinuousNumber": 64 + }, + "endpoint": "rs232", + "samplePeriod": 10, + "expired": 10000 + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "reference": 10 + } + ], + "measures": [ + { + "name": "volume_flow", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44004", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44004", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_volume", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44006", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44006", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "battery_voltage", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44002", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44002", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "differential_pressure", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44014", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44014", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_volume", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44008", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44008", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "accumulated_volume", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44010", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44010", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "static_pressure", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44016", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44016", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "temperature", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44018", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44018", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "charger_voltage", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44020", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44020", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_calculation_period_volume", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44013", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44013", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + } + ], + "alarms": [], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "INFO", + "coms": [ + { + "name": "rs232", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + }, + { + "name": "rs485", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + } + ] + }, + "clouds": [ + { + "cacheSize": 100, + "enable": 1, + "name": "default", + "type": "Standard MQTT", + "args": { + "host": "hp.henrypump.cloud", + "port": 1883, + "clientId": "unknown", + "auth": 1, + "tls": 0, + "cleanSession": 1, + "mqttVersion": "v3.1.1", + "keepalive": 60, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "unknown", + "passwd": "unknown", + "authType": 1 + } + } + ], + "labels": [ + { + "key": "SN", + "value": "GF5022210011338" + }, + { + "key": "MAC", + "value": "00:18:05:1e:94:f4" + }, + { + "key": "MAC_UPPER", + "value": "00:18:05:1A:E5:57" + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "name": "Send Data", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "qos": 1, + "groups": [ + "default" + ], + "funcName": "sendData", + "script": "# Enter your python code.\nimport json, os, time\nfrom datetime import datetime as dt\nfrom datetime import timedelta as td\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom quickfaas.global_dict import get as get_params\nfrom quickfaas.global_dict import _set_global_args\n\ndef reboot(reason=\"Rebooting for config file update\"):\n #basic = Basic()\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\n logger.info(reason)\n r = os.popen(\"kill -s SIGHUP `cat /var/run/python/supervisord.pid`\").read()\n logger.info(f\"REBOOT : {r}\")\n\ndef checkFileExist(filename):\n path = \"/var/user/files\"\n if not os.path.exists(path):\n logger.debug(\"no folder making files folder in var/user\")\n os.makedirs(path)\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n if not os.path.exists(path + \"/\" + filename):\n logger.debug(\"no creds file making creds file\")\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\ndef convertJSONtoDS(j):\n d = []\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n return d\n\ndef checkCredentialConfig():\n logger.debug(\"CHECKING CONFIG\")\n cfgpath = \"/var/user/cfg/device_supervisor/device_supervisor.cfg\"\n credspath = \"/var/user/files/creds.json\"\n cfg = dict()\n with open(cfgpath, \"r\") as f:\n cfg = json.load(f)\n clouds = cfg.get(\"clouds\")\n logger.debug(clouds)\n #if not configured then try to configure from stored values\n if clouds[0][\"args\"][\"clientId\"] == \"unknown\" or clouds[0][\"args\"][\"username\"] == \"unknown\" or not clouds[0][\"args\"][\"passwd\"] or clouds[0][\"args\"][\"passwd\"] == \"unknown\":\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n creds = json.load(c)\n if creds:\n logger.debug(\"updating config with stored data\")\n clouds[0][\"args\"][\"clientId\"] = creds[\"clientId\"]\n clouds[0][\"args\"][\"username\"] = creds[\"userName\"]\n clouds[0][\"args\"][\"passwd\"] = creds[\"password\"]\n cfg[\"clouds\"] = clouds\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n reboot()\n else:\n #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\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n logger.debug(\"updating stored file with new data\")\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n creds = json.load(c)\n if creds:\n if creds[\"clientId\"] != clouds[0][\"args\"][\"clientId\"]:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n if creds[\"userName\"] != clouds[0][\"args\"][\"username\"]:\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n if creds[\"password\"] != clouds[0][\"args\"][\"passwd\"]:\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n else:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n with open(credspath, \"w\") as cw:\n json.dump(creds,cw)\n\ndef checkParameterConfig(cfg):\n logger.debug(\"Checking Parameters!!!!\")\n paramspath = \"/var/user/files/params.json\"\n cfgparams = convertDStoJSON(cfg.get(\"labels\"))\n #check stored values \n checkFileExist(\"params.json\")\n with open(paramspath, \"r\") as f:\n logger.debug(\"Opened param storage file\")\n params = json.load(f)\n if params:\n if cfgparams != params:\n #go through each param\n #if not \"unknown\" and cfg and params aren't the same take from cfg likely updated manually\n #if key in cfg but not in params copy to params\n logger.debug(\"equalizing params between cfg and stored\")\n for key in cfgparams.keys():\n try:\n if cfgparams[key] != params[key] and cfgparams[key] != \"unknown\":\n params[key] = cfgparams[key]\n except:\n params[key] = cfgparams[key]\n cfg[\"labels\"] = convertJSONtoDS(params)\n _set_global_args(convertJSONtoDS(params))\n with open(paramspath, \"w\") as p:\n json.dump(params, p)\n else:\n with open(paramspath, \"w\") as p:\n logger.debug(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n \n return cfg\n\ndef get_totalizers():\n try:\n with open(\"/var/user/files/totalizers.json\", \"r\") as t:\n totalizers = json.load(t)\n if not totalizers:\n logger.debug(\"-----INITIALIZING TOTALIZERS-----\")\n totalizers = {\n \"dayDate\": \"2022-01-01\",\n \"week\": 0,\n \"monthDate\": \"2022-01-01\",\n \"year\": 0,\n \"lifetime\": 0,\n \"dayHolding\": 0,\n \"weekHolding\": 0,\n \"monthHolding\": 0,\n \"yearHolding\": 0\n }\n except:\n totalizers = {\n \"dayDate\": \"2022-01-01\",\n \"week\": 0,\n \"monthDate\": \"2022-01-01\",\n \"year\": 0,\n \"lifetime\": 0,\n \"dayHolding\": 0,\n \"weekHolding\": 0,\n \"monthHolding\": 0,\n \"yearHolding\": 0\n }\n return totalizers\n\ndef saveTotalizers(totalizers):\n try:\n with open(\"/var/user/files/totalizers.json\", \"w\") as t:\n json.dump(totalizers,t)\n except Exception as e:\n logger.error(e)\n\ndef totalizeDay(lifetime):\n totalizers = get_totalizers()\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n now = now - td(seconds=60*60*8) #time shifted back 8 hours\n reset = False\n value = lifetime - totalizers[\"dayHolding\"]\n if not now.date() == dt.strptime(totalizers[\"dayDate\"], \"%Y-%m-%d\").date():\n totalizers[\"dayHolding\"] = lifetime\n totalizers[\"dayDate\"] = str(now.date())\n saveTotalizers(totalizers)\n reset = True\n return (value,reset)\n\ndef totalizeMonth(lifetime):\n totalizers = get_totalizers()\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n now = now - td(seconds=60*60*8) #time shifted back 8 hours\n now = dt.strptime(f\"{now.year}-{now.month}\", \"%Y-%m\")\n reset = False\n value = lifetime - totalizers[\"monthHolding\"]\n if not now.date() == dt.strptime(totalizers[\"monthDate\"], \"%Y-%m-%d\").date():\n totalizers[\"monthHolding\"] = lifetime\n totalizers[\"monthDate\"] = str(now.date())\n saveTotalizers(totalizers)\n reset = True\n return (value,reset)\n\n# Helper function to split the payload into chunks\ndef chunk_payload(payload, chunk_size=20):\n chunked_values = list(payload[\"values\"].items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n \"ts\": payload[\"ts\"],\n \"values\": dict(chunked_values[i:i+chunk_size])\n }\n\ndef sendData(message):\n logger.debug(message)\n try:\n checkCredentialConfig()\n except Exception as e:\n logger.error(e)\n payload = {\"ts\": (round(dt.timestamp(dt.now())/600)*600)*1000, \"values\": {}}\n resetPayload = {\"ts\": \"\", \"values\": {}}\n\n for measure in message[\"measures\"]:\n try:\n if abs(payload[\"ts\"]/1000 - measure[\"timestamp\"]) > 3600:\n reboot(reason=\"Poll timestamp and actual timestamp out of sync. Actual: {} Poll: {}\".format(payload[\"ts\"]/1000,measure[\"timestamp\"]))\n if measure[\"health\"] == 1:\n if measure[\"name\"] in [\"accumulated_volume\"]:\n payload[\"values\"][\"today_volume\"], dayReset = totalizeDay(measure[\"value\"])\n payload[\"values\"][\"month_volume\"], monthReset = totalizeMonth(measure[\"value\"])\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"] \n elif measure[\"name\"] in [\"today_volume\", \"yesterday_volume\"]:\n pass\n else:\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n except Exception as e:\n logger.error(e)\n \n for chunk in chunk_payload(payload=payload):\n publish(__topic__, json.dumps(chunk), __qos__)\n time.sleep(2)\n\n publish(\"v1/devices/me/attributes\", json.dumps({\"latestReportTime\": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__)\n\n if dayReset:\n resetPayload[\"values\"][\"yesterday_volume\"] = payload[\"values\"][\"today_volume\"]\n resetPayload[\"values\"][\"today_volume\"] = 0\n if monthReset:\n resetPayload[\"values\"][\"last_month_volume\"] = payload[\"values\"][\"month_volume\"]\n resetPayload[\"values\"][\"month_volume\"] = 0\n \n if resetPayload[\"values\"]:\n resetPayload[\"ts\"] = 1 + (round(dt.timestamp(dt.now())/600)*600)*1000\n publish(__topic__, json.dumps(resetPayload), __qos__) \n \n", + "msgType": 0, + "cloudName": "default" + } + ], + "downloadFuncs": [ + { + "name": "Commands", + "topic": "v1/devices/me/rpc/request/+", + "qos": 1, + "funcName": "receiveCommand", + "payload_type": "JSON", + "script": "import json, time\nfrom datetime import datetime as dt\nfrom quickfaas.measure import recall, write\nfrom quickfaas.remotebus import publish\nfrom common.Logger import logger\n\n# Helper function to split the payload into chunks\ndef chunk_payload(payload, chunk_size=20):\n chunked_values = list(payload[\"values\"].items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n \"ts\": payload[\"ts\"],\n \"values\": dict(chunked_values[i:i+chunk_size])\n }\n\ndef sync():\n #get new values and send\n payload = {\"ts\": round(dt.timestamp(dt.now()))*1000, \"values\": {}}\n topic = \"v1/devices/me/telemetry\"\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.debug(data)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n for chunk in chunk_payload(payload=payload):\n publish(topic, json.dumps(chunk), 1)\n time.sleep(2)\n\ndef writeplctag(value, wizard_api):\n try:\n #value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"abbflow\":{value[\"measurement\"]: value[\"value\"]}}\n resp = wizard_api.write_plc_values(message)\n #logger.debug(\"RETURN FROM WRITE: {}\".format(resp))\n return True\n except Exception as e:\n logger.debug(e)\n return False\n \ndef receiveCommand(topic, payload, wizard_api):\n try:\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)\n command = p[\"method\"]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n } \n if command == \"setPLCTag\":\n result = commands[\"writeplctag\"](p[\"params\"],wizard_api)\n if result:\n sync()\n #commands[command](p[\"mac\"].lower(),p[\"payload\"][\"value\"], wizard_api)\n #logger.debug(command)\n ack(topic.split(\"/\")[-1], wizard_api)\n except Exception as e:\n logger.debug(e)\n \n\ndef ack(msgid, wizard_api):\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"v1/devices/me/rpc/response/\" + str(msgid), json.dumps({\"msg\": {\"time\": time.time()}, \"metadata\": \"\", \"msgType\": \"\"}))", + "msgType": 0, + "cloudName": "default", + "trigger": "command_event" + } + ] + }, + "modbusSlave": { + "enable": 0, + "protocol": "Modbus-TCP", + "port": 502, + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "maxConnection": 5, + "mapping_table": [] + }, + "iec104Server": { + "enable": 0, + "cotSize": 2, + "port": 2404, + "serverList": [ + { + "asduAddr": 1 + } + ], + "kValue": 12, + "wValue": 8, + "t0": 15, + "t1": 15, + "t2": 10, + "t3": 20, + "maximumLink": 5, + "timeSet": 1, + "byteOrder": "abcd", + "mapping_table": [] + }, + "opcuaServer": { + "enable": 0, + "port": 4840, + "maximumLink": 5, + "securityMode": 0, + "identifierType": "String", + "mapping_table": [] + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "southMetadata": {}, + "bindMetadata": { + "version": "", + "timestamp": "" + } +} \ No newline at end of file diff --git a/Pub_Sub/abbflow/thingsboard/v1/abbflow_tb_v1.cfg b/Pub_Sub/abbflow_rtu/thingsboard/abbflow_tb_v1.cfg similarity index 100% rename from Pub_Sub/abbflow/thingsboard/v1/abbflow_tb_v1.cfg rename to Pub_Sub/abbflow_rtu/thingsboard/abbflow_tb_v1.cfg diff --git a/Pub_Sub/abbflow/thingsboard/v2/pub/sendData.py b/Pub_Sub/abbflow_rtu/thingsboard/pub/sendData.py similarity index 93% rename from Pub_Sub/abbflow/thingsboard/v2/pub/sendData.py rename to Pub_Sub/abbflow_rtu/thingsboard/pub/sendData.py index 21a8ea2..25af1ba 100644 --- a/Pub_Sub/abbflow/thingsboard/v2/pub/sendData.py +++ b/Pub_Sub/abbflow_rtu/thingsboard/pub/sendData.py @@ -200,28 +200,27 @@ def sendData(message): logger.error(e) payload = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}} resetPayload = {"ts": "", "values": {}} + for measure in message["measures"]: try: 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"])) - - if measure["name"] in ["accumulated_volume"]: - payload["values"]["today_volume"], dayReset = totalizeDay(measure["value"]) - payload["values"]["month_volume"], monthReset = totalizeMonth(measure["value"]) - if measure["name"] in ["today_volume", "yesterday_volume"]: - pass - else: - payload["values"][measure["name"]] = measure["value"] + if measure["health"] == 1: + if measure["name"] in ["accumulated_volume"]: + payload["values"]["today_volume"], dayReset = totalizeDay(measure["value"]) + payload["values"]["month_volume"], monthReset = totalizeMonth(measure["value"]) + payload["values"][measure["name"]] = measure["value"] + elif measure["name"] in ["today_volume", "yesterday_volume"]: + pass + else: + payload["values"][measure["name"]] = measure["value"] except Exception as e: logger.error(e) - if payload["values"]["today_volume"] < 0: - del payload["values"]["today_volume"] - if payload["values"]["month_volume"] < 0: - del payload["values"]["month_volume"] - + for chunk in chunk_payload(payload=payload): publish(__topic__, json.dumps(chunk), __qos__) time.sleep(2) + publish("v1/devices/me/attributes", json.dumps({"latestReportTime": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__) if dayReset: @@ -234,4 +233,4 @@ def sendData(message): if resetPayload["values"]: resetPayload["ts"] = 1 + (round(dt.timestamp(dt.now())/600)*600)*1000 publish(__topic__, json.dumps(resetPayload), __qos__) - \ No newline at end of file + diff --git a/Pub_Sub/abbflow/thingsboard/v2/sub/receiveCommand.py b/Pub_Sub/abbflow_rtu/thingsboard/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/abbflow/thingsboard/v2/sub/receiveCommand.py rename to Pub_Sub/abbflow_rtu/thingsboard/sub/receiveCommand.py diff --git a/Pub_Sub/abbflow/thingsboard/v1/abbflowtcp_tb_v1.cfg b/Pub_Sub/abbflow_tcp/thingsboard/abbflow_tcp_tb_v1.cfg similarity index 100% rename from Pub_Sub/abbflow/thingsboard/v1/abbflowtcp_tb_v1.cfg rename to Pub_Sub/abbflow_tcp/thingsboard/abbflow_tcp_tb_v1.cfg diff --git a/Pub_Sub/abbflow/thingsboard/v2/abbflowtcp_tb_v2.cfg b/Pub_Sub/abbflow_tcp/thingsboard/abbflow_tcp_tb_v2.cfg similarity index 100% rename from Pub_Sub/abbflow/thingsboard/v2/abbflowtcp_tb_v2.cfg rename to Pub_Sub/abbflow_tcp/thingsboard/abbflow_tcp_tb_v2.cfg diff --git a/Pub_Sub/abbflow_tcp/thingsboard/abbflow_tcp_tb_v3.cfg b/Pub_Sub/abbflow_tcp/thingsboard/abbflow_tcp_tb_v3.cfg new file mode 100644 index 0000000..3ba7739 --- /dev/null +++ b/Pub_Sub/abbflow_tcp/thingsboard/abbflow_tcp_tb_v3.cfg @@ -0,0 +1,387 @@ +{ + "controllers": [ + { + "protocol": "Modbus-TCP", + "name": "abbflow", + "args": { + "slaveAddr": 1, + "int16Ord": "ba", + "int32Ord": "abcd", + "float32Ord": "abcd", + "continuousAcquisition": 0 + }, + "samplePeriod": 1, + "expired": 10000, + "endpoint": "192.168.1.10:502" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "reference": 10 + } + ], + "measures": [ + { + "name": "volume_flow", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44001", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44001", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_volume", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44003", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44003", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "battery_voltage", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44005", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44005", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "differential_pressure", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44007", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44007", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_volume", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44009", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44009", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "accumulated_volume", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44011", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44011", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "static_pressure", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44013", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44013", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "temperature", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44015", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44015", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "charger_voltage", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44017", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44017", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_calculation_period_volume", + "ctrlName": "abbflow", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "44019", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "regAddr": "44019", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + } + ], + "alarms": [], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "INFO", + "coms": [ + { + "name": "rs232", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + }, + { + "name": "rs485", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + } + ] + }, + "clouds": [ + { + "cacheSize": 100, + "enable": 1, + "name": "default", + "type": "Standard MQTT", + "args": { + "host": "hp.henrypump.cloud", + "port": 1883, + "clientId": "unknown", + "auth": 1, + "tls": 0, + "cleanSession": 1, + "mqttVersion": "v3.1.1", + "keepalive": 60, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "unknown", + "passwd": "unknown", + "authType": 1 + } + } + ], + "labels": [ + { + "key": "SN", + "value": "GF5022210011330" + }, + { + "key": "MAC", + "value": "00:18:05:1e:95:14" + }, + { + "key": "MAC_UPPER", + "value": "00:18:05:1A:E5:57" + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "name": "Send Data", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "qos": 1, + "groups": [ + "default" + ], + "funcName": "sendData", + "script": "# Enter your python code.\nimport json, os, time\nfrom datetime import datetime as dt\nfrom datetime import timedelta as td\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom quickfaas.global_dict import get as get_params\nfrom quickfaas.global_dict import _set_global_args\n\ndef reboot(reason=\"Rebooting for config file update\"):\n #basic = Basic()\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\n logger.info(reason)\n r = os.popen(\"kill -s SIGHUP `cat /var/run/python/supervisord.pid`\").read()\n logger.info(f\"REBOOT : {r}\")\n\ndef checkFileExist(filename):\n path = \"/var/user/files\"\n if not os.path.exists(path):\n logger.debug(\"no folder making files folder in var/user\")\n os.makedirs(path)\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n if not os.path.exists(path + \"/\" + filename):\n logger.debug(\"no creds file making creds file\")\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\ndef convertJSONtoDS(j):\n d = []\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n return d\n\ndef checkCredentialConfig():\n logger.debug(\"CHECKING CONFIG\")\n cfgpath = \"/var/user/cfg/device_supervisor/device_supervisor.cfg\"\n credspath = \"/var/user/files/creds.json\"\n cfg = dict()\n with open(cfgpath, \"r\") as f:\n cfg = json.load(f)\n clouds = cfg.get(\"clouds\")\n logger.debug(clouds)\n #if not configured then try to configure from stored values\n if clouds[0][\"args\"][\"clientId\"] == \"unknown\" or clouds[0][\"args\"][\"username\"] == \"unknown\" or not clouds[0][\"args\"][\"passwd\"] or clouds[0][\"args\"][\"passwd\"] == \"unknown\":\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n creds = json.load(c)\n if creds:\n logger.debug(\"updating config with stored data\")\n clouds[0][\"args\"][\"clientId\"] = creds[\"clientId\"]\n clouds[0][\"args\"][\"username\"] = creds[\"userName\"]\n clouds[0][\"args\"][\"passwd\"] = creds[\"password\"]\n cfg[\"clouds\"] = clouds\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n reboot()\n else:\n #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\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n logger.debug(\"updating stored file with new data\")\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n creds = json.load(c)\n if creds:\n if creds[\"clientId\"] != clouds[0][\"args\"][\"clientId\"]:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n if creds[\"userName\"] != clouds[0][\"args\"][\"username\"]:\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n if creds[\"password\"] != clouds[0][\"args\"][\"passwd\"]:\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n else:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n with open(credspath, \"w\") as cw:\n json.dump(creds,cw)\n\ndef checkParameterConfig(cfg):\n logger.debug(\"Checking Parameters!!!!\")\n paramspath = \"/var/user/files/params.json\"\n cfgparams = convertDStoJSON(cfg.get(\"labels\"))\n #check stored values \n checkFileExist(\"params.json\")\n with open(paramspath, \"r\") as f:\n logger.debug(\"Opened param storage file\")\n params = json.load(f)\n if params:\n if cfgparams != params:\n #go through each param\n #if not \"unknown\" and cfg and params aren't the same take from cfg likely updated manually\n #if key in cfg but not in params copy to params\n logger.debug(\"equalizing params between cfg and stored\")\n for key in cfgparams.keys():\n try:\n if cfgparams[key] != params[key] and cfgparams[key] != \"unknown\":\n params[key] = cfgparams[key]\n except:\n params[key] = cfgparams[key]\n cfg[\"labels\"] = convertJSONtoDS(params)\n _set_global_args(convertJSONtoDS(params))\n with open(paramspath, \"w\") as p:\n json.dump(params, p)\n else:\n with open(paramspath, \"w\") as p:\n logger.debug(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n \n return cfg\n\ndef get_totalizers():\n try:\n with open(\"/var/user/files/totalizers.json\", \"r\") as t:\n totalizers = json.load(t)\n if not totalizers:\n logger.debug(\"-----INITIALIZING TOTALIZERS-----\")\n totalizers = {\n \"dayDate\": \"2022-01-01\",\n \"week\": 0,\n \"monthDate\": \"2022-01-01\",\n \"year\": 0,\n \"lifetime\": 0,\n \"dayHolding\": 0,\n \"weekHolding\": 0,\n \"monthHolding\": 0,\n \"yearHolding\": 0\n }\n except:\n totalizers = {\n \"dayDate\": \"2022-01-01\",\n \"week\": 0,\n \"monthDate\": \"2022-01-01\",\n \"year\": 0,\n \"lifetime\": 0,\n \"dayHolding\": 0,\n \"weekHolding\": 0,\n \"monthHolding\": 0,\n \"yearHolding\": 0\n }\n return totalizers\n\ndef saveTotalizers(totalizers):\n try:\n with open(\"/var/user/files/totalizers.json\", \"w\") as t:\n json.dump(totalizers,t)\n except Exception as e:\n logger.error(e)\n\ndef totalizeDay(lifetime):\n totalizers = get_totalizers()\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n now = now - td(seconds=60*60*8) #time shifted back 8 hours\n reset = False\n value = lifetime - totalizers[\"dayHolding\"]\n if not now.date() == dt.strptime(totalizers[\"dayDate\"], \"%Y-%m-%d\").date():\n totalizers[\"dayHolding\"] = lifetime\n totalizers[\"dayDate\"] = str(now.date())\n saveTotalizers(totalizers)\n reset = True\n return (value,reset)\n\ndef totalizeMonth(lifetime):\n totalizers = get_totalizers()\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n now = now - td(seconds=60*60*8) #time shifted back 8 hours\n now = dt.strptime(f\"{now.year}-{now.month}\", \"%Y-%m\")\n reset = False\n value = lifetime - totalizers[\"monthHolding\"]\n if not now.date() == dt.strptime(totalizers[\"monthDate\"], \"%Y-%m-%d\").date():\n totalizers[\"monthHolding\"] = lifetime\n totalizers[\"monthDate\"] = str(now.date())\n saveTotalizers(totalizers)\n reset = True\n return (value,reset)\n\n# Helper function to split the payload into chunks\ndef chunk_payload(payload, chunk_size=20):\n chunked_values = list(payload[\"values\"].items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n \"ts\": payload[\"ts\"],\n \"values\": dict(chunked_values[i:i+chunk_size])\n }\n\ndef sendData(message):\n logger.debug(message)\n try:\n checkCredentialConfig()\n except Exception as e:\n logger.error(e)\n payload = {\"ts\": (round(dt.timestamp(dt.now())/600)*600)*1000, \"values\": {}}\n resetPayload = {\"ts\": \"\", \"values\": {}}\n\n for measure in message[\"measures\"]:\n try:\n if abs(payload[\"ts\"]/1000 - measure[\"timestamp\"]) > 3600:\n reboot(reason=\"Poll timestamp and actual timestamp out of sync. Actual: {} Poll: {}\".format(payload[\"ts\"]/1000,measure[\"timestamp\"]))\n if measure[\"health\"] == 1:\n if measure[\"name\"] in [\"accumulated_volume\"]:\n payload[\"values\"][\"today_volume\"], dayReset = totalizeDay(measure[\"value\"])\n payload[\"values\"][\"month_volume\"], monthReset = totalizeMonth(measure[\"value\"])\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"] \n elif measure[\"name\"] in [\"today_volume\", \"yesterday_volume\"]:\n pass\n else:\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n except Exception as e:\n logger.error(e)\n \n for chunk in chunk_payload(payload=payload):\n publish(__topic__, json.dumps(chunk), __qos__)\n time.sleep(2)\n\n publish(\"v1/devices/me/attributes\", json.dumps({\"latestReportTime\": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__)\n\n if dayReset:\n resetPayload[\"values\"][\"yesterday_volume\"] = payload[\"values\"][\"today_volume\"]\n resetPayload[\"values\"][\"today_volume\"] = 0\n if monthReset:\n resetPayload[\"values\"][\"last_month_volume\"] = payload[\"values\"][\"month_volume\"]\n resetPayload[\"values\"][\"month_volume\"] = 0\n \n if resetPayload[\"values\"]:\n resetPayload[\"ts\"] = 1 + (round(dt.timestamp(dt.now())/600)*600)*1000\n publish(__topic__, json.dumps(resetPayload), __qos__) \n \n", + "msgType": 0, + "cloudName": "default" + } + ], + "downloadFuncs": [ + { + "name": "Commands", + "topic": "v1/devices/me/rpc/request/+", + "qos": 1, + "funcName": "receiveCommand", + "payload_type": "JSON", + "script": "import json, time\nfrom datetime import datetime as dt\nfrom quickfaas.measure import recall, write\nfrom quickfaas.remotebus import publish\nfrom common.Logger import logger\n\n# Helper function to split the payload into chunks\ndef chunk_payload(payload, chunk_size=20):\n chunked_values = list(payload[\"values\"].items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n \"ts\": payload[\"ts\"],\n \"values\": dict(chunked_values[i:i+chunk_size])\n }\n\ndef sync():\n #get new values and send\n payload = {\"ts\": round(dt.timestamp(dt.now()))*1000, \"values\": {}}\n topic = \"v1/devices/me/telemetry\"\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.debug(data)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n for chunk in chunk_payload(payload=payload):\n publish(topic, json.dumps(chunk), 1)\n time.sleep(2)\n\ndef writeplctag(value, wizard_api):\n try:\n #value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"abbflow\":{value[\"measurement\"]: value[\"value\"]}}\n resp = wizard_api.write_plc_values(message)\n #logger.debug(\"RETURN FROM WRITE: {}\".format(resp))\n return True\n except Exception as e:\n logger.debug(e)\n return False\n \ndef receiveCommand(topic, payload, wizard_api):\n try:\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)\n command = p[\"method\"]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n } \n if command == \"setPLCTag\":\n result = commands[\"writeplctag\"](p[\"params\"],wizard_api)\n if result:\n sync()\n #commands[command](p[\"mac\"].lower(),p[\"payload\"][\"value\"], wizard_api)\n #logger.debug(command)\n ack(topic.split(\"/\")[-1], wizard_api)\n except Exception as e:\n logger.debug(e)\n \n\ndef ack(msgid, wizard_api):\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"v1/devices/me/rpc/response/\" + str(msgid), json.dumps({\"msg\": {\"time\": time.time()}, \"metadata\": \"\", \"msgType\": \"\"}))", + "msgType": 0, + "cloudName": "default", + "trigger": "command_event" + } + ] + }, + "modbusSlave": { + "enable": 0, + "protocol": "Modbus-TCP", + "port": 502, + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "maxConnection": 5, + "mapping_table": [] + }, + "iec104Server": { + "enable": 0, + "cotSize": 2, + "port": 2404, + "serverList": [ + { + "asduAddr": 1 + } + ], + "kValue": 12, + "wValue": 8, + "t0": 15, + "t1": 15, + "t2": 10, + "t3": 20, + "maximumLink": 5, + "timeSet": 1, + "byteOrder": "abcd", + "mapping_table": [] + }, + "opcuaServer": { + "enable": 0, + "port": 4840, + "maximumLink": 5, + "securityMode": 0, + "identifierType": "String", + "mapping_table": [] + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "southMetadata": {}, + "bindMetadata": { + "version": "", + "timestamp": "" + } +} \ No newline at end of file diff --git a/Pub_Sub/abbflow/thingsboard/v1/pub/sendData.py b/Pub_Sub/abbflow_tcp/thingsboard/pub/sendData.py similarity index 76% rename from Pub_Sub/abbflow/thingsboard/v1/pub/sendData.py rename to Pub_Sub/abbflow_tcp/thingsboard/pub/sendData.py index eb0b429..25af1ba 100644 --- a/Pub_Sub/abbflow/thingsboard/v1/pub/sendData.py +++ b/Pub_Sub/abbflow_tcp/thingsboard/pub/sendData.py @@ -1,6 +1,7 @@ # Enter your python code. -import json, os +import json, os, time from datetime import datetime as dt +from datetime import timedelta as td from common.Logger import logger from quickfaas.remotebus import publish from quickfaas.global_dict import get as get_params @@ -16,12 +17,12 @@ def reboot(reason="Rebooting for config file update"): def checkFileExist(filename): path = "/var/user/files" if not os.path.exists(path): - logger.info("no folder making files folder in var/user") + logger.debug("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") + logger.debug("no creds file making creds file") with open(path + "/" + filename, "a") as f: json.dump({}, f) @@ -38,21 +39,21 @@ def convertJSONtoDS(j): return d def checkCredentialConfig(): - logger.info("CHECKING CONFIG") + 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.info(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.info("updating config with stored data") + 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"] @@ -65,7 +66,7 @@ def checkCredentialConfig(): #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") + 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) @@ -85,20 +86,20 @@ def checkCredentialConfig(): json.dump(creds,cw) def checkParameterConfig(cfg): - logger.info("Checking Parameters!!!!") + 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.info("Opened param storage file") + 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.info("equalizing params between cfg and stored") + logger.debug("equalizing params between cfg and stored") for key in cfgparams.keys(): try: if cfgparams[key] != params[key] and cfgparams[key] != "unknown": @@ -111,7 +112,7 @@ def checkParameterConfig(cfg): json.dump(params, p) else: with open(paramspath, "w") as p: - logger.info("initializing param file with params in memory") + logger.debug("initializing param file with params in memory") json.dump(convertDStoJSON(get_params()), p) cfg["labels"] = get_params() @@ -122,11 +123,11 @@ def get_totalizers(): with open("/var/user/files/totalizers.json", "r") as t: totalizers = json.load(t) if not totalizers: - logger.info("-----INITIALIZING TOTALIZERS-----") + logger.debug("-----INITIALIZING TOTALIZERS-----") totalizers = { - "day": 0, + "dayDate": "2022-01-01", "week": 0, - "month": 0, + "monthDate": "2022-01-01", "year": 0, "lifetime": 0, "dayHolding": 0, @@ -136,9 +137,9 @@ def get_totalizers(): } except: totalizers = { - "day": 0, + "dayDate": "2022-01-01", "week": 0, - "month": 0, + "monthDate": "2022-01-01", "year": 0, "lifetime": 0, "dayHolding": 0, @@ -158,11 +159,12 @@ def saveTotalizers(totalizers): def totalizeDay(lifetime): totalizers = get_totalizers() now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600) + now = now - td(seconds=60*60*8) #time shifted back 8 hours reset = False value = lifetime - totalizers["dayHolding"] - if (not int(now.strftime("%d")) == int(totalizers["day"]) and now.hour >= 8 and now.minute == 0) or (abs(int(now.strftime("%d")) - int(totalizers["day"])) > 1 ): + if not now.date() == dt.strptime(totalizers["dayDate"], "%Y-%m-%d").date(): totalizers["dayHolding"] = lifetime - totalizers["day"] = int(now.strftime("%d")) + totalizers["dayDate"] = str(now.date()) saveTotalizers(totalizers) reset = True return (value,reset) @@ -170,15 +172,26 @@ def totalizeDay(lifetime): def totalizeMonth(lifetime): totalizers = get_totalizers() now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600) + now = now - td(seconds=60*60*8) #time shifted back 8 hours + now = dt.strptime(f"{now.year}-{now.month}", "%Y-%m") reset = False value = lifetime - totalizers["monthHolding"] - if (not int(now.strftime("%m")) == int(totalizers["month"]) and now.hour >= 8 and now.minute == 0) or (abs(int(now.strftime("%m")) - int(totalizers["month"])) > 1 ): + if not now.date() == dt.strptime(totalizers["monthDate"], "%Y-%m-%d").date(): totalizers["monthHolding"] = lifetime - totalizers["month"] = now.strftime("%m") + totalizers["monthDate"] = str(now.date()) saveTotalizers(totalizers) reset = True return (value,reset) +# Helper function to split the payload into chunks +def chunk_payload(payload, chunk_size=20): + chunked_values = list(payload["values"].items()) + for i in range(0, len(chunked_values), chunk_size): + yield { + "ts": payload["ts"], + "values": dict(chunked_values[i:i+chunk_size]) + } + def sendData(message): logger.debug(message) try: @@ -187,22 +200,27 @@ def sendData(message): logger.error(e) payload = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}} resetPayload = {"ts": "", "values": {}} + for measure in message["measures"]: try: - if abs(payload["ts"]/1000 - measure["timestamp"]) > 7200: + 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"])) - - if measure["name"] in ["accumulated_volume"]: - payload["values"]["today_volume"], dayReset = totalizeDay(measure["value"]) - payload["values"]["month_volume"], monthReset = totalizeMonth(measure["value"]) - if measure["name"] in ["today_volume", "yesterday_volume"]: - pass - else: - payload["values"][measure["name"]] = measure["value"] + if measure["health"] == 1: + if measure["name"] in ["accumulated_volume"]: + payload["values"]["today_volume"], dayReset = totalizeDay(measure["value"]) + payload["values"]["month_volume"], monthReset = totalizeMonth(measure["value"]) + payload["values"][measure["name"]] = measure["value"] + elif measure["name"] in ["today_volume", "yesterday_volume"]: + pass + else: + payload["values"][measure["name"]] = measure["value"] except Exception as e: logger.error(e) + + for chunk in chunk_payload(payload=payload): + publish(__topic__, json.dumps(chunk), __qos__) + time.sleep(2) - publish(__topic__, json.dumps(payload), __qos__) publish("v1/devices/me/attributes", json.dumps({"latestReportTime": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__) if dayReset: @@ -215,4 +233,4 @@ def sendData(message): if resetPayload["values"]: resetPayload["ts"] = 1 + (round(dt.timestamp(dt.now())/600)*600)*1000 publish(__topic__, json.dumps(resetPayload), __qos__) - \ No newline at end of file + diff --git a/Pub_Sub/abbflow/thingsboard/v1/sub/receiveCommand.py b/Pub_Sub/abbflow_tcp/thingsboard/sub/receiveCommand.py similarity index 60% rename from Pub_Sub/abbflow/thingsboard/v1/sub/receiveCommand.py rename to Pub_Sub/abbflow_tcp/thingsboard/sub/receiveCommand.py index c6d3980..efa6cbe 100644 --- a/Pub_Sub/abbflow/thingsboard/v1/sub/receiveCommand.py +++ b/Pub_Sub/abbflow_tcp/thingsboard/sub/receiveCommand.py @@ -1,29 +1,42 @@ -# Enter your python code. -import json -from quickfaas.measure import recall +import json, time +from datetime import datetime as dt +from quickfaas.measure import recall, write +from quickfaas.remotebus import publish from common.Logger import logger -def sync(wizard_api): +# Helper function to split the payload into chunks +def chunk_payload(payload, chunk_size=20): + chunked_values = list(payload["values"].items()) + for i in range(0, len(chunked_values), chunk_size): + yield { + "ts": payload["ts"], + "values": dict(chunked_values[i:i+chunk_size]) + } + +def sync(): #get new values and send - payload = {} + payload = {"ts": round(dt.timestamp(dt.now()))*1000, "values": {}} + topic = "v1/devices/me/telemetry" try: data = recall()#json.loads(recall().decode("utf-8")) except Exception as e: logger.error(e) - logger.info(data) + logger.debug(data) for controller in data: for measure in controller["measures"]: #publish measure - topic = "v1/devices/me/telemetry" - payload[measure["name"]] = measure["value"] - logger.debug("Sending on topic: {}".format(topic)) - logger.debug("Sending value: {}".format(payload)) - wizard_api.mqtt_publish(topic, json.dumps(payload)) + payload["values"][measure["name"]] = measure["value"] + logger.debug("Sending on topic: {}".format(topic)) + logger.debug("Sending value: {}".format(payload)) + for chunk in chunk_payload(payload=payload): + publish(topic, json.dumps(chunk), 1) + time.sleep(2) + def writeplctag(value, wizard_api): try: #value = json.loads(value.replace("'",'"')) logger.debug(value) - message = {"advvfdipp":{value["measurement"]: value["value"]}} + message = {"abbflow":{value["measurement"]: value["value"]}} resp = wizard_api.write_plc_values(message) #logger.debug("RETURN FROM WRITE: {}".format(resp)) return True @@ -44,7 +57,7 @@ def receiveCommand(topic, payload, wizard_api): if command == "setPLCTag": result = commands["writeplctag"](p["params"],wizard_api) if result: - sync(wizard_api) + sync() #commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api) #logger.debug(command) ack(topic.split("/")[-1], wizard_api) diff --git a/Pub_Sub/advvfdipp/.DS_Store b/Pub_Sub/advvfdipp/.DS_Store index bc84c72..306b9ee 100644 Binary files a/Pub_Sub/advvfdipp/.DS_Store and b/Pub_Sub/advvfdipp/.DS_Store differ diff --git a/Pub_Sub/advvfdipp/guidon/.DS_Store b/Pub_Sub/advvfdipp/guidon/.DS_Store deleted file mode 100644 index 4bb2d79..0000000 Binary files a/Pub_Sub/advvfdipp/guidon/.DS_Store and /dev/null differ diff --git a/Pub_Sub/advvfdipp/guidon/v1/.DS_Store b/Pub_Sub/advvfdipp/guidon/v1/.DS_Store deleted file mode 100644 index 643c2a6..0000000 Binary files a/Pub_Sub/advvfdipp/guidon/v1/.DS_Store and /dev/null differ diff --git a/Pub_Sub/advvfdipp/guidon/v1/device_supervisor_advvfdippv1.cfg b/Pub_Sub/advvfdipp/guidon/v1/device_supervisor_advvfdippv1.cfg deleted file mode 100644 index b506e3e..0000000 --- a/Pub_Sub/advvfdipp/guidon/v1/device_supervisor_advvfdippv1.cfg +++ /dev/null @@ -1,1207 +0,0 @@ -{ - "controllers": [ - { - "protocol": "EtherNet/IP", - "name": "advvfdipp", - "args": {}, - "samplePeriod": 10, - "expired": 10000, - "endpoint": "192.168.1.10:44818" - } - ], - "groups": [ - { - "name": "default", - "uploadInterval": 600, - "reference": 44 - } - ], - "measures": [ - { - "name": "flowrate", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "val_Flowmeter", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "fluidlevel", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "val_FluidLevel", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "intakepressure", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "val_IntakePressure", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "intaketemperature", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "val_IntakeTemperature", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "tubingpressure", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "val_TubingPressure", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "pidcontrolmode", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "sts_PID_Control", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "wellstatus", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "Device_Status_INT", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "vfdfrequency", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "VFD_SpeedFdbk", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "flowtotal", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Flow_Total[0]", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "energytotal", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Energy_Total[0]", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "vfdcurrent", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "VFD_OutCurrent", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "downholesensorstatus", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "Downhole_Sensor_Status_INT", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "fluidspecificgravity", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "cfg_FluidSpecificGravity", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "flowtotalyesterday", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Flow_Total[1]", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "energytotalyesterday", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Energy_Total[1]", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmflowrate", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_Flowmeter", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmintakepressure", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_IntakePressure", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmintaketemperature", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_IntakeTemperature", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmtubingpressure", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_TubingPressure", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmvfd", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_VFD", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmlockout", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_Lockout", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "runpermissive", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "Run_Permissive_INT", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "startpermissive", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "Start_Permissive_INT", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "startcommand", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "cmd_Start", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "stopcommand", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "cmd_Stop", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "flowsetpoint", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "cfg_PID_FlowSP", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "fluidlevelsetpoint", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "cfg_PID_FluidLevelSP", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "manualfrequencysetpoint", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "cfg_PID_ManualSP", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "tubingpressuresetpoint", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "cfg_PID_TubingPressureSP", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmfluidlevel", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_FluidLevel", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "pressureshutdownlimit", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "AIn_IntakePressure.Val_LoLim", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "pressurestartuplimit", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "AIn_IntakePressure.Val_HiLim", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "temperatureshutdownlimit", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "AIn_IntakeTemperature.Val_HiLim", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "temperaturestartuplimit", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "AIn_IntakeTemperature.Val_LoLim", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "sensorheight", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "cfg_DHSensorDistToIntake", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "last_vfd_fault_code", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "PowerFlex755.Val_LastFaultCode", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "vfd_fault", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "sts_CurrentVFDFaultCode", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "controllerfault_io", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "ControllerFault_IO", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "controllerfault_program", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "ControllerFault_Program", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "minvfdfrequency", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "PowerFlex755.Cfg_MinSpdRef", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "maxvfdfrequency", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "PowerFlex755.Cfg_MaxSpdRef", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "hartnettotal", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "in_HART_Flowmeter_Net", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "hartfwdtotal", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "in_HART_Flowmeter_Fwd", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "hartrevtotal", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "in_HART_Flowmeter_Rev", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "cmd_Start", - "readWrite": "rw", - "uploadType": "periodic", - "group": "default", - "name": "cmd_Start", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "cmd_Stop", - "readWrite": "rw", - "uploadType": "periodic", - "group": "default", - "name": "cmd_Stop", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "External_Commands", - "readWrite": "ro", - "uploadType": "periodic", - "group": "default", - "name": "external_commands", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "Remote_Comm_Fail", - "readWrite": "ro", - "uploadType": "periodic", - "group": "default", - "name": "remote_comm", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "Aux_Pump_Hand_Input", - "readWrite": "ro", - "uploadType": "periodic", - "group": "default", - "name": "aux_pump_hand", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "Aux_Pump_Auto_Input", - "readWrite": "ro", - "uploadType": "periodic", - "group": "default", - "name": "aux_pump_auto", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "Aux_Pump_Run_Feedback", - "readWrite": "ro", - "uploadType": "periodic", - "group": "default", - "name": "aux_pump_run", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "Aux_Pump_Fault_Feedback", - "readWrite": "ro", - "uploadType": "periodic", - "group": "default", - "name": "aux_pump_fault", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - } - ], - "alarms": [], - "misc": { - "maxAlarmRecordSz": 2000, - "logLvl": "DEBUG", - "coms": [ - { - "name": "rs232", - "baud": 9600, - "bits": 8, - "stopbits": 1, - "parityChk": "n" - }, - { - "name": "rs485", - "baud": 19200, - "bits": 8, - "stopbits": 1, - "parityChk": "n" - } - ] - }, - "clouds": [ - { - "cacheSize": 100, - "enable": 1, - "type": "Standard MQTT", - "args": { - "host": "mq194.imistaway.net", - "port": 1883, - "clientId": "sv-inhand-demo", - "auth": 1, - "tls": 0, - "cleanSession": 1, - "mqttVersion": "v3.1.1", - "keepalive": 120, - "key": "", - "cert": "", - "rootCA": "", - "verifyServer": 0, - "verifyClient": 0, - "username": "admin", - "passwd": "columbus", - "authType": 1 - }, - "name": "default" - } - ], - "labels": [ - { - "key": "SN", - "value": "GF5022137006251" - }, - { - "key": "MAC", - "value": "00:18:05:1a:e5:36" - }, - { - "key": "MAC_UPPER", - "value": "00:18:05:1A:E5:37" - }, - { - "key": "MAC_LOWER", - "value": "00:18:05:1a:e5:37" - } - ], - "quickfaas": { - "genericFuncs": [], - "uploadFuncs": [ - { - "name": "Send Data", - "trigger": "measure_event", - "topic": "meshify/db/194/_/advvfdipp/${MAC_LOWER}", - "qos": 1, - "groups": [ - "default" - ], - "funcName": "sendData", - "script": "# Enter your python code.\nimport json\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nimport re, uuid\n\n\ndef sendData(message):\n #logger.debug(message)\n mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n if measure[\"name\"] in [\"wellstatus\",\"pidcontrolmode\",\"downholesensorstatus\",\"alarmflowrate\",\"alarmintakepressure\",\"alarmintaketemperature\",\"alarmtubingpressure\",\"alarmvfd\",\"alarmlockout\",\"alarmfluidlevel\",\"runpermissive\",\"startpermissive\",\"last_vfd_fault_code\",\"vfd_fault\"]:\n logger.debug(\"Converting DINT/BOOL to STRING\")\n value = convert_int(measure[\"name\"], measure[\"value\"])\n logger.debug(\"Converted {} to {}\".format(measure[\"value\"], value))\n publish(__topic__ + mac + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": value}), __qos__)\n else:\n publish(__topic__ + mac + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": measure[\"value\"]}), __qos__)\n except Exception as e:\n logger.error(e)\n \n #publish(__topic__, json.dumps({measure[\"name\"]: measure[\"value\"]}), __qos__)\n\ndef convert_int(plc_tag, value):\n well_status_codes = {\n 0: \"Running\",\n 1: \"Pumped Off\",\n 2: \"Alarmed\",\n 3: \"Locked Out\",\n 4: \"Stopped\"\n }\n\n pid_control_codes = {\n 0: \"Flow\",\n 1: \"Fluid Level\",\n 2: \"Tubing Pressure\",\n 3: \"Manual\"\n }\n\n downhole_codes = {\n 0: \"OK\",\n 1: \"Connecting\",\n 2: \"Open Circuit\",\n 3: \"Shorted\",\n 4: \"Cannot Decode\"\n }\n\n permissive_codes = {\n 0: \"OK\",\n 1: \"Flow\",\n 2: \"Intake Pressure\",\n 3: \"Intake Temperature\",\n 4: \"Tubing Pressure\",\n 5: \"VFD\",\n 6: \"Fluid Level\",\n 7: \"Min. Downtime\"\n }\n\n alarm_codes = {\n 0: \"OK\",\n 1: \"Alarm\"\n }\n\n alarm_vfd_codes = {\n 0: \"OK\",\n 1: \"Locked Out\"\n }\n\n vfd_fault_codes = {\n 0: \"No Fault\",\n 2: \"Auxiliary Input\",\n 3: \"Power Loss\",\n 4: \"UnderVoltage\",\n 5: \"OverVoltage\",\n 7: \"Motor Overload\",\n 8: \"Heatsink OverTemp\",\n 9: \"Thermister OverTemp\",\n 10: \"Dynamic Brake OverTemp\",\n 12: \"Hardware OverCurrent\",\n 13: \"Ground Fault\",\n 14: \"Ground Warning\",\n 15: \"Load Loss\",\n 17: \"Input Phase Loss\",\n 18: \"Motor PTC Trip\",\n 19: \"Task Overrun\",\n 20: \"Torque Prove Speed Band\",\n 21: \"Output Phase Loss\",\n 24: \"Decel Inhibit\",\n 25: \"OverSpeed Limit\",\n 26: \"Brake Slipped\",\n 27: \"Torque Prove Conflict\",\n 28: \"TP Encls Confict\",\n 29: \"Analog In Loss\",\n 33: \"Auto Restarts Exhausted\",\n 35: \"IPM OverCurrent\",\n 36: \"SW OverCurrent\",\n 38: \"Phase U to Ground\",\n 39: \"Phase V to Ground\",\n 40: \"Phase W to Ground\",\n 41: \"Phase UV Short\",\n 42: \"Phase VW Short\",\n 43: \"Phase WU Short\",\n 44: \"Phase UNeg to Ground\",\n 45: \"Phase VNeg to Ground\",\n 46: \"Phase WNeg to Ground\",\n 48: \"System Defaulted\",\n 49: \"Drive Powerup\",\n 51: \"Clear Fault Queue\",\n 55: \"Control Board Overtemp\",\n 59: \"Invalid Code\",\n 61: \"Shear Pin 1\",\n 62: \"Shear Pin 2\",\n 64: \"Drive Overload\",\n 66: \"OW Torque Level\",\n 67: \"Pump Off\",\n 71: \"Port 1 Adapter\",\n 72: \"Port 2 Adapter\",\n 73: \"Port 3 Adapter\",\n 74: \"Port 4 Adapter\",\n 75: \"Port 5 Adapter\",\n 76: \"Port 6 Adapter\",\n 77: \"IR Volts Range\",\n 78: \"FluxAmps Ref Range\",\n 79: \"Excessive Load\",\n 80: \"AutoTune Aborted\",\n 81: \"Port 1 DPI Loss\",\n 82: \"Port 2 DPI Loss\",\n 83: \"Port 3 DPI Loss\",\n 84: \"Port 4 DPI Loss\",\n 85: \"Port 5 DPI Loss\",\n 86: \"Port 6 DPI Loss\",\n 87: \"IXo Voltage Range\",\n 91: \"Primary Velocity Feedback Loss\",\n 93: \"Hardware Enable Check\",\n 94: \"Alternate Velocity Feedback Loss\",\n 95: \"Auxiliary Velocity Feedback Loss\",\n 96: \"Position Feedback Loss\",\n 97: \"Auto Tach Switch\",\n 100: \"Parameter Checksum\",\n 101: \"Power Down NVS Blank\",\n 102: \"NVS Not Blank\",\n 103: \"Power Down NVS Incompatible\",\n 104: \"Power Board Checksum\",\n 106: \"Incompat MCB-PB\",\n 107: \"Replaced MCB-PB\",\n 108: \"Analog Calibration Checksum\",\n 110: \"Invalid Power Board Data\",\n 111: \"Power Board Invalid ID\",\n 112: \"Power Board App Min Version\",\n 113: \"Tracking DataError\",\n 115: \"Power Down Table Full\",\n 116: \"Power Down Entry Too Large\",\n 117: \"Power Down Data Checksum\",\n 118: \"Power Board Power Down Checksum\",\n 124: \"App ID Changed\",\n 125: \"Using Backup App\",\n 134: \"Start on Power Up\",\n 137: \"External Precharge Error\",\n 138: \"Precharge Open\",\n 141: \"Autotune Enc Angle\",\n 142: \"Autotune Speed Restricted\",\n 143: \"Autotune Current Regulator\",\n 144: \"Autotune Inertia\",\n 145: \"Autotune Travel\",\n 13035: \"Net IO Timeout\",\n 13037: \"Net IO Timeout\"\n\n }\n\n plc_tags = {\n \"wellstatus\": well_status_codes.get(value, \"Invalid Code\"),\n \"pidcontrolmode\": pid_control_codes.get(value, \"Invalid Code\"),\n \"downholesensorstatus\": downhole_codes.get(value, \"Invalid Code\"),\n \"alarmflowrate\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmintakepressure\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmintaketemperature\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmtubingpressure\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmvfd\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmlockout\": alarm_vfd_codes.get(value, \"Invalid Code\"),\n \"alarmfluidlevel\": alarm_codes.get(value, \"Invalid Code\"),\n \"runpermissive\": permissive_codes.get(value, \"Invalid Code\"),\n \"startpermissive\": permissive_codes.get(value, \"Invalid Code\"),\n \"last_vfd_fault_code\": vfd_fault_codes.get(value, \"Invalid Code\"),\n \"vfd_fault\": vfd_fault_codes.get(value, \"Invalid Code\")\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")\n\n ", - "msgType": 0, - "cloudName": "default" - } - ], - "downloadFuncs": [ - { - "name": "Commands", - "topic": "meshify/sets/194/${MAC_UPPER}:01:99", - "qos": 1, - "funcName": "receiveCommand", - "payload_type": "Plaintext", - "script": "# Enter your python code.\nimport json\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(mac,value, wizard_api):\n #get new values and send\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.info(data)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n topic = \"meshify/db/194/_/abbflow/\" + mac + \"/\" + measure[\"name\"]\n payload = [{\"value\": measure[\"value\"]}]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n wizard_api.mqtt_publish(topic, json.dumps(payload))\ndef writeplctag(mac, value, wizard_api):\n try:\n value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"advvfdipp\":{value[\"tag\"]: value[\"val\"]}}\n wizard_api.write_plc_values(message)\n except Exception as e:\n logger.debug(e)\n \ndef receiveCommand(topic, payload, wizard_api):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)[0]\n command = p[\"payload\"][\"name\"].split(\".\")[1]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n }\n commands[command](p[\"mac\"].lower(),p[\"payload\"][\"value\"], wizard_api)\n #logger.debug(command)\n ack(p[\"msgId\"], p[\"mac\"], p[\"payload\"][\"name\"].split(\".\")[1], p[\"payload\"][\"value\"], wizard_api)\n\ndef ack(msgid, mac, name, value, wizard_api):\n #logger.debug(mac)\n mac = \"\".join(mac.split(\":\")[:-2])\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"meshify/responses/\" + str(msgid), json.dumps([{\"value\": \"{} Success Setting: {} To: {}\".format(mac,name, value), \"msgid\": str(msgid)}]))", - "msgType": 0, - "trigger": "command_event", - "cloudName": "default" - } - ] - }, - "modbusSlave": { - "enable": 0, - "protocol": "Modbus-TCP", - "port": 502, - "slaveAddr": 1, - "int16Ord": "ab", - "int32Ord": "abcd", - "float32Ord": "abcd", - "maxConnection": 5, - "mapping_table": [] - }, - "iec104Server": { - "enable": 0, - "cotSize": 2, - "port": 2404, - "serverList": [ - { - "asduAddr": 1 - } - ], - "kValue": 12, - "wValue": 8, - "t0": 15, - "t1": 15, - "t2": 10, - "t3": 20, - "maximumLink": 5, - "timeSet": 1, - "byteOrder": "abcd", - "mapping_table": [] - }, - "opcuaServer": { - "enable": 0, - "port": 4840, - "maximumLink": 5, - "securityMode": 0, - "identifierType": "String", - "mapping_table": [] - }, - "bindConfig": { - "enable": 0, - "bind": { - "modelId": "", - "modelName": "", - "srcId": "", - "srcName": "", - "devId": "", - "devName": "" - }, - "varGroups": [], - "variables": [], - "alerts": [] - }, - "southMetadata": {}, - "bindMetadata": { - "version": "", - "timestamp": "" - } -} \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/guidon/v1/pub/sendData.py b/Pub_Sub/advvfdipp/guidon/v1/pub/sendData.py deleted file mode 100644 index 1a72a91..0000000 --- a/Pub_Sub/advvfdipp/guidon/v1/pub/sendData.py +++ /dev/null @@ -1,191 +0,0 @@ -# Enter your python code. -import json -from common.Logger import logger -from quickfaas.remotebus import publish -import re, uuid - - -def sendData(message): - #logger.debug(message) - mac = ':'.join(re.findall('..', '%012x' % uuid.getnode())) - for measure in message["measures"]: - try: - logger.debug(measure) - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault"]: - logger.debug("Converting DINT/BOOL to STRING") - value = convert_int(measure["name"], measure["value"]) - logger.debug("Converted {} to {}".format(measure["value"], value)) - publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": value}), __qos__) - else: - publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__) - except Exception as e: - logger.error(e) - - #publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__) - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - plc_tags = { - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") - - \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/guidon/v1/sub/receiveCommand.py b/Pub_Sub/advvfdipp/guidon/v1/sub/receiveCommand.py deleted file mode 100644 index 5eef284..0000000 --- a/Pub_Sub/advvfdipp/guidon/v1/sub/receiveCommand.py +++ /dev/null @@ -1,50 +0,0 @@ -# Enter your python code. -import json -from quickfaas.measure import recall -from common.Logger import logger - -def sync(mac,value, wizard_api): - #get new values and send - try: - data = recall()#json.loads(recall().decode("utf-8")) - except Exception as e: - logger.error(e) - logger.info(data) - for controller in data: - for measure in controller["measures"]: - #publish measure - topic = "meshify/db/194/_/abbflow/" + mac + "/" + measure["name"] - payload = [{"value": measure["value"]}] - logger.debug("Sending on topic: {}".format(topic)) - logger.debug("Sending value: {}".format(payload)) - wizard_api.mqtt_publish(topic, json.dumps(payload)) -def writeplctag(mac, value, wizard_api): - try: - value = json.loads(value.replace("'",'"')) - logger.debug(value) - message = {"advvfdipp":{value["tag"]: value["val"]}} - wizard_api.write_plc_values(message) - except Exception as e: - logger.debug(e) - -def receiveCommand(topic, payload, wizard_api): - logger.debug(topic) - logger.debug(json.loads(payload)) - p = json.loads(payload)[0] - command = p["payload"]["name"].split(".")[1] - commands = { - "sync": sync, - "writeplctag": writeplctag, - } - commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api) - #logger.debug(command) - ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api) - -def ack(msgid, mac, name, value, wizard_api): - #logger.debug(mac) - mac = "".join(mac.split(":")[:-2]) - #logger.debug(msgid) - #logger.debug(mac) - #logger.debug(name) - #logger.debug(value) - wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}])) \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/guidon/v2/.DS_Store b/Pub_Sub/advvfdipp/guidon/v2/.DS_Store deleted file mode 100644 index 55d38c9..0000000 Binary files a/Pub_Sub/advvfdipp/guidon/v2/.DS_Store and /dev/null differ diff --git a/Pub_Sub/advvfdipp/guidon/v2/device_supervisor_advvfdippv2.cfg b/Pub_Sub/advvfdipp/guidon/v2/device_supervisor_advvfdippv2.cfg deleted file mode 100644 index 56c32cc..0000000 --- a/Pub_Sub/advvfdipp/guidon/v2/device_supervisor_advvfdippv2.cfg +++ /dev/null @@ -1,1207 +0,0 @@ -{ - "controllers": [ - { - "protocol": "EtherNet/IP", - "name": "advvfdipp", - "args": {}, - "samplePeriod": 10, - "expired": 10000, - "endpoint": "192.168.1.30:44818" - } - ], - "groups": [ - { - "name": "default", - "uploadInterval": 600, - "reference": 44 - } - ], - "measures": [ - { - "name": "flowrate", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "val_Flowmeter", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "fluidlevel", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "val_FluidLevel", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "intakepressure", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "val_IntakePressure", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "intaketemperature", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "val_IntakeTemperature", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "tubingpressure", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "val_TubingPressure", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "pidcontrolmode", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "sts_PID_Control", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "wellstatus", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "Device_Status_INT", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "vfdfrequency", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "VFD_SpeedFdbk", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "flowtotal", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Flow_Total[0]", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "energytotal", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Energy_Total[0]", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "vfdcurrent", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "VFD_OutCurrent", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "downholesensorstatus", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "Downhole_Sensor_Status_INT", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "fluidspecificgravity", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "cfg_FluidSpecificGravity", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "flowtotalyesterday", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Flow_Total[1]", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "energytotalyesterday", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Energy_Total[1]", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmflowrate", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_Flowmeter", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmintakepressure", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_IntakePressure", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmintaketemperature", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_IntakeTemperature", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmtubingpressure", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_TubingPressure", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmvfd", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_VFD", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmlockout", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_Lockout", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "runpermissive", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "Run_Permissive_INT", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "startpermissive", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "Start_Permissive_INT", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "startcommand", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "cmd_Start", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "stopcommand", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "cmd_Stop", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "flowsetpoint", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "cfg_PID_FlowSP", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "fluidlevelsetpoint", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "cfg_PID_FluidLevelSP", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "manualfrequencysetpoint", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "cfg_PID_ManualSP", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "tubingpressuresetpoint", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "cfg_PID_TubingPressureSP", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "alarmfluidlevel", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "alarm_FluidLevel", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "pressureshutdownlimit", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "AIn_IntakePressure.Val_LoLim", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "pressurestartuplimit", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "AIn_IntakePressure.Val_HiLim", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "temperatureshutdownlimit", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "AIn_IntakeTemperature.Val_HiLim", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "temperaturestartuplimit", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "AIn_IntakeTemperature.Val_LoLim", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "sensorheight", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "cfg_DHSensorDistToIntake", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "last_vfd_fault_code", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "PowerFlex755.Val_LastFaultCode", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "vfd_fault", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "sts_CurrentVFDFaultCode", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "controllerfault_io", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "ControllerFault_IO", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "controllerfault_program", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "ControllerFault_Program", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "minvfdfrequency", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "PowerFlex755.Cfg_MinSpdRef", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "maxvfdfrequency", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "PowerFlex755.Cfg_MaxSpdRef", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "hartnettotal", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "in_HART_Flowmeter_Net", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "hartfwdtotal", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "in_HART_Flowmeter_Fwd", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "name": "hartrevtotal", - "ctrlName": "advvfdipp", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "in_HART_Flowmeter_Rev", - "decimal": 2, - "len": 1, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "gain": "", - "offset": "" - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "cmd_Start", - "readWrite": "rw", - "uploadType": "periodic", - "group": "default", - "name": "cmd_Start", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "cmd_Stop", - "readWrite": "rw", - "uploadType": "periodic", - "group": "default", - "name": "cmd_Stop", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "External_Commands", - "readWrite": "ro", - "uploadType": "periodic", - "group": "default", - "name": "external_commands", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "Remote_Comm_Fail", - "readWrite": "ro", - "uploadType": "periodic", - "group": "default", - "name": "remote_comm", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "Aux_Pump_Hand_Input", - "readWrite": "ro", - "uploadType": "periodic", - "group": "default", - "name": "aux_pump_hand", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "Aux_Pump_Auto_Input", - "readWrite": "ro", - "uploadType": "periodic", - "group": "default", - "name": "aux_pump_auto", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "Aux_Pump_Run_Feedback", - "readWrite": "ro", - "uploadType": "periodic", - "group": "default", - "name": "aux_pump_run", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - }, - { - "ctrlName": "advvfdipp", - "dataType": "BIT", - "addr": "Aux_Pump_Fault_Feedback", - "readWrite": "ro", - "uploadType": "periodic", - "group": "default", - "name": "aux_pump_fault", - "desc": "", - "unit": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "maxValue": "", - "minValue": "", - "maxScaleValue": "", - "minScaleValue": "", - "decimal": 2 - } - ], - "alarms": [], - "misc": { - "maxAlarmRecordSz": 2000, - "logLvl": "DEBUG", - "coms": [ - { - "name": "rs232", - "baud": 9600, - "bits": 8, - "stopbits": 1, - "parityChk": "n" - }, - { - "name": "rs485", - "baud": 19200, - "bits": 8, - "stopbits": 1, - "parityChk": "n" - } - ] - }, - "clouds": [ - { - "cacheSize": 100, - "enable": 1, - "type": "Standard MQTT", - "args": { - "host": "mq194.imistaway.net", - "port": 1883, - "clientId": "sv-inhand-demo", - "auth": 1, - "tls": 0, - "cleanSession": 1, - "mqttVersion": "v3.1.1", - "keepalive": 120, - "key": "", - "cert": "", - "rootCA": "", - "verifyServer": 0, - "verifyClient": 0, - "username": "admin", - "passwd": "columbus", - "authType": 1 - }, - "name": "default" - } - ], - "labels": [ - { - "key": "SN", - "value": "GF5022137006251" - }, - { - "key": "MAC", - "value": "00:18:05:1a:e5:36" - }, - { - "key": "MAC_UPPER", - "value": "00:18:05:1A:E5:37" - }, - { - "key": "MAC_LOWER", - "value": "00:18:05:1a:e5:37" - } - ], - "quickfaas": { - "genericFuncs": [], - "uploadFuncs": [ - { - "name": "Send Data", - "trigger": "measure_event", - "topic": "meshify/db/194/_/advvfdipp/${MAC_LOWER}", - "qos": 1, - "groups": [ - "default" - ], - "funcName": "sendData", - "script": "# Enter your python code.\nimport json\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nimport re, uuid\nfrom paho.mqtt import client\n\nlwtData = {\n \"init\":False,\n \"client\": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport=\"tcp\")\n}\ndef lwt(mac):\n try:\n #if not lwtData[\"connected\"]:\n if not lwtData[\"init\"]:\n logger.info(\"INITIALIZING LWT CLIENT\")\n lwtData[\"client\"].username_pw_set(username=\"admin\", password=\"columbus\")\n lwtData[\"client\"].will_set(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\",json.dumps({\"value\":False}))\n lwtData[\"init\"] = True\n logger.info(\"Connecting to MQTT Broker for LWT purposes!!!!!!!\")\n lwtData[\"client\"].connect(\"mq194.imistaway.net\",1883, 600)\n lwtData[\"client\"].publish(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\", json.dumps({\"value\":True}))\n except Exception as e:\n logger.error(\"LWT DID NOT DO THE THING\")\n logger.error(e)\n\ndef sendData(message):\n #logger.debug(message)\n mac = __topic__.split(\"/\")[-1] #':'.join(re.findall('..', '%012x' % uuid.getnode()))\n lwt(mac)\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n if measure[\"name\"] in [\"wellstatus\",\"pidcontrolmode\",\"downholesensorstatus\",\"alarmflowrate\",\"alarmintakepressure\",\"alarmintaketemperature\",\"alarmtubingpressure\",\"alarmvfd\",\"alarmlockout\",\"alarmfluidlevel\",\"runpermissive\",\"startpermissive\",\"last_vfd_fault_code\",\"vfd_fault\", \"external_commands\", \"remote_comm\", \"aux_pump_hand\",\"aux_pump_auto\",\"aux_pump_run\", \"aux_pump_fault\"]:\n logger.debug(\"Converting DINT/BOOL to STRING\")\n value = convert_int(measure[\"name\"], measure[\"value\"])\n logger.debug(\"Converted {} to {}\".format(measure[\"value\"], value))\n publish(__topic__ + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": value}), __qos__)\n else:\n publish(__topic__ + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": measure[\"value\"]}), __qos__)\n except Exception as e:\n logger.error(e)\n \n #publish(__topic__, json.dumps({measure[\"name\"]: measure[\"value\"]}), __qos__)\n\ndef convert_int(plc_tag, value):\n well_status_codes = {\n 0: \"Running\",\n 1: \"Pumped Off\",\n 2: \"Alarmed\",\n 3: \"Locked Out\",\n 4: \"Stopped\"\n }\n\n pid_control_codes = {\n 0: \"Flow\",\n 1: \"Fluid Level\",\n 2: \"Tubing Pressure\",\n 3: \"Manual\"\n }\n\n downhole_codes = {\n 0: \"OK\",\n 1: \"Connecting\",\n 2: \"Open Circuit\",\n 3: \"Shorted\",\n 4: \"Cannot Decode\"\n }\n\n permissive_codes = {\n 0: \"OK\",\n 1: \"Flow\",\n 2: \"Intake Pressure\",\n 3: \"Intake Temperature\",\n 4: \"Tubing Pressure\",\n 5: \"VFD\",\n 6: \"Fluid Level\",\n 7: \"Min. Downtime\"\n }\n\n alarm_codes = {\n 0: \"OK\",\n 1: \"Alarm\"\n }\n\n alarm_vfd_codes = {\n 0: \"OK\",\n 1: \"Locked Out\"\n }\n\n vfd_fault_codes = {\n 0: \"No Fault\",\n 2: \"Auxiliary Input\",\n 3: \"Power Loss\",\n 4: \"UnderVoltage\",\n 5: \"OverVoltage\",\n 7: \"Motor Overload\",\n 8: \"Heatsink OverTemp\",\n 9: \"Thermister OverTemp\",\n 10: \"Dynamic Brake OverTemp\",\n 12: \"Hardware OverCurrent\",\n 13: \"Ground Fault\",\n 14: \"Ground Warning\",\n 15: \"Load Loss\",\n 17: \"Input Phase Loss\",\n 18: \"Motor PTC Trip\",\n 19: \"Task Overrun\",\n 20: \"Torque Prove Speed Band\",\n 21: \"Output Phase Loss\",\n 24: \"Decel Inhibit\",\n 25: \"OverSpeed Limit\",\n 26: \"Brake Slipped\",\n 27: \"Torque Prove Conflict\",\n 28: \"TP Encls Confict\",\n 29: \"Analog In Loss\",\n 33: \"Auto Restarts Exhausted\",\n 35: \"IPM OverCurrent\",\n 36: \"SW OverCurrent\",\n 38: \"Phase U to Ground\",\n 39: \"Phase V to Ground\",\n 40: \"Phase W to Ground\",\n 41: \"Phase UV Short\",\n 42: \"Phase VW Short\",\n 43: \"Phase WU Short\",\n 44: \"Phase UNeg to Ground\",\n 45: \"Phase VNeg to Ground\",\n 46: \"Phase WNeg to Ground\",\n 48: \"System Defaulted\",\n 49: \"Drive Powerup\",\n 51: \"Clear Fault Queue\",\n 55: \"Control Board Overtemp\",\n 59: \"Invalid Code\",\n 61: \"Shear Pin 1\",\n 62: \"Shear Pin 2\",\n 64: \"Drive Overload\",\n 66: \"OW Torque Level\",\n 67: \"Pump Off\",\n 71: \"Port 1 Adapter\",\n 72: \"Port 2 Adapter\",\n 73: \"Port 3 Adapter\",\n 74: \"Port 4 Adapter\",\n 75: \"Port 5 Adapter\",\n 76: \"Port 6 Adapter\",\n 77: \"IR Volts Range\",\n 78: \"FluxAmps Ref Range\",\n 79: \"Excessive Load\",\n 80: \"AutoTune Aborted\",\n 81: \"Port 1 DPI Loss\",\n 82: \"Port 2 DPI Loss\",\n 83: \"Port 3 DPI Loss\",\n 84: \"Port 4 DPI Loss\",\n 85: \"Port 5 DPI Loss\",\n 86: \"Port 6 DPI Loss\",\n 87: \"IXo Voltage Range\",\n 91: \"Primary Velocity Feedback Loss\",\n 93: \"Hardware Enable Check\",\n 94: \"Alternate Velocity Feedback Loss\",\n 95: \"Auxiliary Velocity Feedback Loss\",\n 96: \"Position Feedback Loss\",\n 97: \"Auto Tach Switch\",\n 100: \"Parameter Checksum\",\n 101: \"Power Down NVS Blank\",\n 102: \"NVS Not Blank\",\n 103: \"Power Down NVS Incompatible\",\n 104: \"Power Board Checksum\",\n 106: \"Incompat MCB-PB\",\n 107: \"Replaced MCB-PB\",\n 108: \"Analog Calibration Checksum\",\n 110: \"Invalid Power Board Data\",\n 111: \"Power Board Invalid ID\",\n 112: \"Power Board App Min Version\",\n 113: \"Tracking DataError\",\n 115: \"Power Down Table Full\",\n 116: \"Power Down Entry Too Large\",\n 117: \"Power Down Data Checksum\",\n 118: \"Power Board Power Down Checksum\",\n 124: \"App ID Changed\",\n 125: \"Using Backup App\",\n 134: \"Start on Power Up\",\n 137: \"External Precharge Error\",\n 138: \"Precharge Open\",\n 141: \"Autotune Enc Angle\",\n 142: \"Autotune Speed Restricted\",\n 143: \"Autotune Current Regulator\",\n 144: \"Autotune Inertia\",\n 145: \"Autotune Travel\",\n 13035: \"Net IO Timeout\",\n 13037: \"Net IO Timeout\"\n\n }\n\n external_commands = {\n 0: \"HP Control\",\n 1: \"Customer Control\"\n }\n\n remote_comm = {\n 0: \"Good\",\n 1: \"Comms Failure\"\n }\n\n aux_pump_hand = {\n 0: \"Off\",\n 1: \"On\"\n }\n\n aux_pump_auto = {\n 0: \"Off\",\n 1: \"On\"\n }\n\n aux_pump_run = {\n 0: \"Stopped\",\n 1: \"Running\"\n }\n\n aux_pump_fault = {\n 0: \"Good\",\n 1: \"Faulted\"\n }\n\n\n plc_tags = {\n \"external_commands\": external_commands.get(value, \"Invalid Code\"),\n \"remote_comm\": remote_comm.get(value, \"Invalid Code\"),\n \"aux_pump_hand\": aux_pump_hand.get(value, \"Invalid Code\"),\n \"aux_pump_auto\": aux_pump_auto.get(value, \"Invalid Code\"),\n \"aux_pump_run\": aux_pump_run.get(value, \"Invalid Code\"),\n \"aux_pump_fault\": aux_pump_fault.get(value, \"Invalid Code\"),\n \"wellstatus\": well_status_codes.get(value, \"Invalid Code\"),\n \"pidcontrolmode\": pid_control_codes.get(value, \"Invalid Code\"),\n \"downholesensorstatus\": downhole_codes.get(value, \"Invalid Code\"),\n \"alarmflowrate\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmintakepressure\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmintaketemperature\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmtubingpressure\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmvfd\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmlockout\": alarm_vfd_codes.get(value, \"Invalid Code\"),\n \"alarmfluidlevel\": alarm_codes.get(value, \"Invalid Code\"),\n \"runpermissive\": permissive_codes.get(value, \"Invalid Code\"),\n \"startpermissive\": permissive_codes.get(value, \"Invalid Code\"),\n \"last_vfd_fault_code\": vfd_fault_codes.get(value, \"Invalid Code\"),\n \"vfd_fault\": vfd_fault_codes.get(value, \"Invalid Code\")\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")\n\n ", - "msgType": 0, - "cloudName": "default" - } - ], - "downloadFuncs": [ - { - "name": "Commands", - "topic": "meshify/sets/194/${MAC_UPPER}:01:99", - "qos": 1, - "funcName": "receiveCommand", - "payload_type": "Plaintext", - "script": "# Enter your python code.\nimport json\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(mac,value, wizard_api):\n #get new values and send\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.info(data)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n topic = \"meshify/db/194/_/advvfdipp/\" + mac + \"/\" + measure[\"name\"]\n if measure[\"name\"] in [\"wellstatus\",\"pidcontrolmode\",\"downholesensorstatus\",\"alarmflowrate\",\"alarmintakepressure\",\"alarmintaketemperature\",\"alarmtubingpressure\",\"alarmvfd\",\"alarmlockout\",\"alarmfluidlevel\",\"runpermissive\",\"startpermissive\",\"last_vfd_fault_code\",\"vfd_fault\", \"external_commands\", \"remote_comm\", \"aux_pump_hand\",\"aux_pump_auto\",\"aux_pump_run\", \"aux_pump_fault\"]:\n payload = [{\"value\": convert_int(measure[\"name\"], measure[\"value\"])}]\n else:\n payload = [{\"value\": measure[\"value\"]}]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n wizard_api.mqtt_publish(topic, json.dumps(payload))\ndef writeplctag(mac, value, wizard_api):\n try:\n value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"advvfdipp\":{value[\"tag\"]: value[\"val\"]}}\n wizard_api.write_plc_values(message)\n except Exception as e:\n logger.debug(e)\n \ndef receiveCommand(topic, payload, wizard_api):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)[0]\n command = p[\"payload\"][\"name\"].split(\".\")[1]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n }\n commands[command](p[\"mac\"].lower(),p[\"payload\"][\"value\"], wizard_api)\n #logger.debug(command)\n ack(p[\"msgId\"], p[\"mac\"], p[\"payload\"][\"name\"].split(\".\")[1], p[\"payload\"][\"value\"], wizard_api)\n\ndef ack(msgid, mac, name, value, wizard_api):\n #logger.debug(mac)\n mac = \"\".join(mac.split(\":\")[:-2])\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"meshify/responses/\" + str(msgid), json.dumps([{\"value\": \"{} Success Setting: {} To: {}\".format(mac,name, value), \"msgid\": str(msgid)}]))\n\ndef convert_int(plc_tag, value):\n well_status_codes = {\n 0: \"Running\",\n 1: \"Pumped Off\",\n 2: \"Alarmed\",\n 3: \"Locked Out\",\n 4: \"Stopped\"\n }\n\n pid_control_codes = {\n 0: \"Flow\",\n 1: \"Fluid Level\",\n 2: \"Tubing Pressure\",\n 3: \"Manual\"\n }\n\n downhole_codes = {\n 0: \"OK\",\n 1: \"Connecting\",\n 2: \"Open Circuit\",\n 3: \"Shorted\",\n 4: \"Cannot Decode\"\n }\n\n permissive_codes = {\n 0: \"OK\",\n 1: \"Flow\",\n 2: \"Intake Pressure\",\n 3: \"Intake Temperature\",\n 4: \"Tubing Pressure\",\n 5: \"VFD\",\n 6: \"Fluid Level\",\n 7: \"Min. Downtime\"\n }\n\n alarm_codes = {\n 0: \"OK\",\n 1: \"Alarm\"\n }\n\n alarm_vfd_codes = {\n 0: \"OK\",\n 1: \"Locked Out\"\n }\n\n vfd_fault_codes = {\n 0: \"No Fault\",\n 2: \"Auxiliary Input\",\n 3: \"Power Loss\",\n 4: \"UnderVoltage\",\n 5: \"OverVoltage\",\n 7: \"Motor Overload\",\n 8: \"Heatsink OverTemp\",\n 9: \"Thermister OverTemp\",\n 10: \"Dynamic Brake OverTemp\",\n 12: \"Hardware OverCurrent\",\n 13: \"Ground Fault\",\n 14: \"Ground Warning\",\n 15: \"Load Loss\",\n 17: \"Input Phase Loss\",\n 18: \"Motor PTC Trip\",\n 19: \"Task Overrun\",\n 20: \"Torque Prove Speed Band\",\n 21: \"Output Phase Loss\",\n 24: \"Decel Inhibit\",\n 25: \"OverSpeed Limit\",\n 26: \"Brake Slipped\",\n 27: \"Torque Prove Conflict\",\n 28: \"TP Encls Confict\",\n 29: \"Analog In Loss\",\n 33: \"Auto Restarts Exhausted\",\n 35: \"IPM OverCurrent\",\n 36: \"SW OverCurrent\",\n 38: \"Phase U to Ground\",\n 39: \"Phase V to Ground\",\n 40: \"Phase W to Ground\",\n 41: \"Phase UV Short\",\n 42: \"Phase VW Short\",\n 43: \"Phase WU Short\",\n 44: \"Phase UNeg to Ground\",\n 45: \"Phase VNeg to Ground\",\n 46: \"Phase WNeg to Ground\",\n 48: \"System Defaulted\",\n 49: \"Drive Powerup\",\n 51: \"Clear Fault Queue\",\n 55: \"Control Board Overtemp\",\n 59: \"Invalid Code\",\n 61: \"Shear Pin 1\",\n 62: \"Shear Pin 2\",\n 64: \"Drive Overload\",\n 66: \"OW Torque Level\",\n 67: \"Pump Off\",\n 71: \"Port 1 Adapter\",\n 72: \"Port 2 Adapter\",\n 73: \"Port 3 Adapter\",\n 74: \"Port 4 Adapter\",\n 75: \"Port 5 Adapter\",\n 76: \"Port 6 Adapter\",\n 77: \"IR Volts Range\",\n 78: \"FluxAmps Ref Range\",\n 79: \"Excessive Load\",\n 80: \"AutoTune Aborted\",\n 81: \"Port 1 DPI Loss\",\n 82: \"Port 2 DPI Loss\",\n 83: \"Port 3 DPI Loss\",\n 84: \"Port 4 DPI Loss\",\n 85: \"Port 5 DPI Loss\",\n 86: \"Port 6 DPI Loss\",\n 87: \"IXo Voltage Range\",\n 91: \"Primary Velocity Feedback Loss\",\n 93: \"Hardware Enable Check\",\n 94: \"Alternate Velocity Feedback Loss\",\n 95: \"Auxiliary Velocity Feedback Loss\",\n 96: \"Position Feedback Loss\",\n 97: \"Auto Tach Switch\",\n 100: \"Parameter Checksum\",\n 101: \"Power Down NVS Blank\",\n 102: \"NVS Not Blank\",\n 103: \"Power Down NVS Incompatible\",\n 104: \"Power Board Checksum\",\n 106: \"Incompat MCB-PB\",\n 107: \"Replaced MCB-PB\",\n 108: \"Analog Calibration Checksum\",\n 110: \"Invalid Power Board Data\",\n 111: \"Power Board Invalid ID\",\n 112: \"Power Board App Min Version\",\n 113: \"Tracking DataError\",\n 115: \"Power Down Table Full\",\n 116: \"Power Down Entry Too Large\",\n 117: \"Power Down Data Checksum\",\n 118: \"Power Board Power Down Checksum\",\n 124: \"App ID Changed\",\n 125: \"Using Backup App\",\n 134: \"Start on Power Up\",\n 137: \"External Precharge Error\",\n 138: \"Precharge Open\",\n 141: \"Autotune Enc Angle\",\n 142: \"Autotune Speed Restricted\",\n 143: \"Autotune Current Regulator\",\n 144: \"Autotune Inertia\",\n 145: \"Autotune Travel\",\n 13035: \"Net IO Timeout\",\n 13037: \"Net IO Timeout\"\n\n }\n\n external_commands = {\n 0: \"HP Control\",\n 1: \"Customer Control\"\n }\n\n remote_comm = {\n 0: \"Good\",\n 1: \"Comms Failure\"\n }\n\n aux_pump_hand = {\n 0: \"Off\",\n 1: \"On\"\n }\n\n aux_pump_auto = {\n 0: \"Off\",\n 1: \"On\"\n }\n\n aux_pump_run = {\n 0: \"Stopped\",\n 1: \"Running\"\n }\n\n aux_pump_fault = {\n 0: \"Good\",\n 1: \"Faulted\"\n }\n\n\n plc_tags = {\n \"external_commands\": external_commands.get(value, \"Invalid Code\"),\n \"remote_comm\": remote_comm.get(value, \"Invalid Code\"),\n \"aux_pump_hand\": aux_pump_hand.get(value, \"Invalid Code\"),\n \"aux_pump_auto\": aux_pump_auto.get(value, \"Invalid Code\"),\n \"aux_pump_run\": aux_pump_run.get(value, \"Invalid Code\"),\n \"aux_pump_fault\": aux_pump_fault.get(value, \"Invalid Code\"),\n \"wellstatus\": well_status_codes.get(value, \"Invalid Code\"),\n \"pidcontrolmode\": pid_control_codes.get(value, \"Invalid Code\"),\n \"downholesensorstatus\": downhole_codes.get(value, \"Invalid Code\"),\n \"alarmflowrate\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmintakepressure\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmintaketemperature\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmtubingpressure\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmvfd\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmlockout\": alarm_vfd_codes.get(value, \"Invalid Code\"),\n \"alarmfluidlevel\": alarm_codes.get(value, \"Invalid Code\"),\n \"runpermissive\": permissive_codes.get(value, \"Invalid Code\"),\n \"startpermissive\": permissive_codes.get(value, \"Invalid Code\"),\n \"last_vfd_fault_code\": vfd_fault_codes.get(value, \"Invalid Code\"),\n \"vfd_fault\": vfd_fault_codes.get(value, \"Invalid Code\")\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")", - "msgType": 0, - "trigger": "command_event", - "cloudName": "default" - } - ] - }, - "modbusSlave": { - "enable": 0, - "protocol": "Modbus-TCP", - "port": 502, - "slaveAddr": 1, - "int16Ord": "ab", - "int32Ord": "abcd", - "float32Ord": "abcd", - "maxConnection": 5, - "mapping_table": [] - }, - "iec104Server": { - "enable": 0, - "cotSize": 2, - "port": 2404, - "serverList": [ - { - "asduAddr": 1 - } - ], - "kValue": 12, - "wValue": 8, - "t0": 15, - "t1": 15, - "t2": 10, - "t3": 20, - "maximumLink": 5, - "timeSet": 1, - "byteOrder": "abcd", - "mapping_table": [] - }, - "opcuaServer": { - "enable": 0, - "port": 4840, - "maximumLink": 5, - "securityMode": 0, - "identifierType": "String", - "mapping_table": [] - }, - "bindConfig": { - "enable": 0, - "bind": { - "modelId": "", - "modelName": "", - "srcId": "", - "srcName": "", - "devId": "", - "devName": "" - }, - "varGroups": [], - "variables": [], - "alerts": [] - }, - "southMetadata": {}, - "bindMetadata": { - "version": "", - "timestamp": "" - } -} \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/guidon/v2/pub/sendData.py b/Pub_Sub/advvfdipp/guidon/v2/pub/sendData.py deleted file mode 100644 index a930375..0000000 --- a/Pub_Sub/advvfdipp/guidon/v2/pub/sendData.py +++ /dev/null @@ -1,357 +0,0 @@ -import json, os, uuid -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 - -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"]: - logger.info("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["init"] = True - logger.info("Connecting to MQTT Broker for LWT purposes!!!!!!!") - lwtData["client"].connect("mq194.imistaway.net",1883, 600) - lwtData["client"].publish("meshify/db/194/_/mainHP/" + mac + ":00:00/connected", json.dumps({"value":True})) - except Exception as e: - logger.error("LWT DID NOT DO THE THING") - logger.error(e) - -def sendData(message): - #logger.debug(message) - mac = __topic__.split("/")[-1] #':'.join(re.findall('..', '%012x' % uuid.getnode())) - lwt(mac) - checkCredentialConfig() - for measure in message["measures"]: - try: - logger.debug(measure) - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault", "external_commands", "remote_comm", "aux_pump_hand","aux_pump_auto","aux_pump_run", "aux_pump_fault"]: - logger.debug("Converting DINT/BOOL to STRING") - value = convert_int(measure["name"], measure["value"]) - logger.debug("Converted {} to {}".format(measure["value"], value)) - publish(__topic__ + ":01:99/" + measure["name"], json.dumps({"value": value}), __qos__) - else: - publish(__topic__ + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__) - except Exception as e: - logger.error(e) - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - external_commands = { - 0: "HP Control", - 1: "Customer Control" - } - - remote_comm = { - 0: "Good", - 1: "Comms Failure" - } - - aux_pump_hand = { - 0: "Off", - 1: "On" - } - - aux_pump_auto = { - 0: "Off", - 1: "On" - } - - aux_pump_run = { - 0: "Stopped", - 1: "Running" - } - - aux_pump_fault = { - 0: "Good", - 1: "Faulted" - } - - - plc_tags = { - "external_commands": external_commands.get(value, "Invalid Code"), - "remote_comm": remote_comm.get(value, "Invalid Code"), - "aux_pump_hand": aux_pump_hand.get(value, "Invalid Code"), - "aux_pump_auto": aux_pump_auto.get(value, "Invalid Code"), - "aux_pump_run": aux_pump_run.get(value, "Invalid Code"), - "aux_pump_fault": aux_pump_fault.get(value, "Invalid Code"), - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") - - \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/guidon/v2/sub/receiveCommand.py b/Pub_Sub/advvfdipp/guidon/v2/sub/receiveCommand.py deleted file mode 100644 index e1cf9e3..0000000 --- a/Pub_Sub/advvfdipp/guidon/v2/sub/receiveCommand.py +++ /dev/null @@ -1,255 +0,0 @@ -# Enter your python code. -import json -from quickfaas.measure import recall -from common.Logger import logger - -def sync(mac,value, wizard_api): - #get new values and send - try: - data = recall()#json.loads(recall().decode("utf-8")) - except Exception as e: - logger.error(e) - logger.info(data) - for controller in data: - for measure in controller["measures"]: - #publish measure - topic = "meshify/db/194/_/advvfdipp/" + mac + "/" + measure["name"] - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault", "external_commands", "remote_comm", "aux_pump_hand","aux_pump_auto","aux_pump_run", "aux_pump_fault"]: - payload = [{"value": convert_int(measure["name"], measure["value"])}] - else: - payload = [{"value": measure["value"]}] - logger.debug("Sending on topic: {}".format(topic)) - logger.debug("Sending value: {}".format(payload)) - wizard_api.mqtt_publish(topic, json.dumps(payload)) -def writeplctag(mac, value, wizard_api): - try: - value = json.loads(value.replace("'",'"')) - logger.debug(value) - message = {"advvfdipp":{value["tag"]: value["val"]}} - wizard_api.write_plc_values(message) - except Exception as e: - logger.debug(e) - -def receiveCommand(topic, payload, wizard_api): - logger.debug(topic) - logger.debug(json.loads(payload)) - p = json.loads(payload)[0] - command = p["payload"]["name"].split(".")[1] - commands = { - "sync": sync, - "writeplctag": writeplctag, - } - commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api) - #logger.debug(command) - ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api) - -def ack(msgid, mac, name, value, wizard_api): - #logger.debug(mac) - mac = "".join(mac.split(":")[:-2]) - #logger.debug(msgid) - #logger.debug(mac) - #logger.debug(name) - #logger.debug(value) - wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}])) - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - external_commands = { - 0: "HP Control", - 1: "Customer Control" - } - - remote_comm = { - 0: "Good", - 1: "Comms Failure" - } - - aux_pump_hand = { - 0: "Off", - 1: "On" - } - - aux_pump_auto = { - 0: "Off", - 1: "On" - } - - aux_pump_run = { - 0: "Stopped", - 1: "Running" - } - - aux_pump_fault = { - 0: "Good", - 1: "Faulted" - } - - - plc_tags = { - "external_commands": external_commands.get(value, "Invalid Code"), - "remote_comm": remote_comm.get(value, "Invalid Code"), - "aux_pump_hand": aux_pump_hand.get(value, "Invalid Code"), - "aux_pump_auto": aux_pump_auto.get(value, "Invalid Code"), - "aux_pump_run": aux_pump_run.get(value, "Invalid Code"), - "aux_pump_fault": aux_pump_fault.get(value, "Invalid Code"), - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/mistaway/v3/advvfdipp_ma_v3.cfg b/Pub_Sub/advvfdipp/mistaway/advvfdipp_ma_v3.cfg similarity index 100% rename from Pub_Sub/advvfdipp/mistaway/v3/advvfdipp_ma_v3.cfg rename to Pub_Sub/advvfdipp/mistaway/advvfdipp_ma_v3.cfg diff --git a/Pub_Sub/advvfdipp/mistaway/v4/advvfdipp_ma_v4.cfg b/Pub_Sub/advvfdipp/mistaway/advvfdipp_ma_v4.cfg similarity index 100% rename from Pub_Sub/advvfdipp/mistaway/v4/advvfdipp_ma_v4.cfg rename to Pub_Sub/advvfdipp/mistaway/advvfdipp_ma_v4.cfg diff --git a/Pub_Sub/advvfdipp/mistaway/v1/device_supervisor_advvfdippv1.cfg b/Pub_Sub/advvfdipp/mistaway/device_supervisor_advvfdippv1.cfg similarity index 100% rename from Pub_Sub/advvfdipp/mistaway/v1/device_supervisor_advvfdippv1.cfg rename to Pub_Sub/advvfdipp/mistaway/device_supervisor_advvfdippv1.cfg diff --git a/Pub_Sub/advvfdipp/mistaway/v2/device_supervisor_advvfdippv2.cfg b/Pub_Sub/advvfdipp/mistaway/device_supervisor_advvfdippv2.cfg similarity index 100% rename from Pub_Sub/advvfdipp/mistaway/v2/device_supervisor_advvfdippv2.cfg rename to Pub_Sub/advvfdipp/mistaway/device_supervisor_advvfdippv2.cfg diff --git a/Pub_Sub/advvfdipp/mistaway/v4/pub/sendData.py b/Pub_Sub/advvfdipp/mistaway/pub/sendData.py similarity index 100% rename from Pub_Sub/advvfdipp/mistaway/v4/pub/sendData.py rename to Pub_Sub/advvfdipp/mistaway/pub/sendData.py diff --git a/Pub_Sub/advvfdipp/mistaway/v3/sub/receiveCommand.py b/Pub_Sub/advvfdipp/mistaway/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/advvfdipp/mistaway/v3/sub/receiveCommand.py rename to Pub_Sub/advvfdipp/mistaway/sub/receiveCommand.py diff --git a/Pub_Sub/advvfdipp/mistaway/v1/pub/sendData.py b/Pub_Sub/advvfdipp/mistaway/v1/pub/sendData.py deleted file mode 100644 index 1a72a91..0000000 --- a/Pub_Sub/advvfdipp/mistaway/v1/pub/sendData.py +++ /dev/null @@ -1,191 +0,0 @@ -# Enter your python code. -import json -from common.Logger import logger -from quickfaas.remotebus import publish -import re, uuid - - -def sendData(message): - #logger.debug(message) - mac = ':'.join(re.findall('..', '%012x' % uuid.getnode())) - for measure in message["measures"]: - try: - logger.debug(measure) - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault"]: - logger.debug("Converting DINT/BOOL to STRING") - value = convert_int(measure["name"], measure["value"]) - logger.debug("Converted {} to {}".format(measure["value"], value)) - publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": value}), __qos__) - else: - publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__) - except Exception as e: - logger.error(e) - - #publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__) - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - plc_tags = { - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") - - \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/mistaway/v1/sub/receiveCommand.py b/Pub_Sub/advvfdipp/mistaway/v1/sub/receiveCommand.py deleted file mode 100644 index 5eef284..0000000 --- a/Pub_Sub/advvfdipp/mistaway/v1/sub/receiveCommand.py +++ /dev/null @@ -1,50 +0,0 @@ -# Enter your python code. -import json -from quickfaas.measure import recall -from common.Logger import logger - -def sync(mac,value, wizard_api): - #get new values and send - try: - data = recall()#json.loads(recall().decode("utf-8")) - except Exception as e: - logger.error(e) - logger.info(data) - for controller in data: - for measure in controller["measures"]: - #publish measure - topic = "meshify/db/194/_/abbflow/" + mac + "/" + measure["name"] - payload = [{"value": measure["value"]}] - logger.debug("Sending on topic: {}".format(topic)) - logger.debug("Sending value: {}".format(payload)) - wizard_api.mqtt_publish(topic, json.dumps(payload)) -def writeplctag(mac, value, wizard_api): - try: - value = json.loads(value.replace("'",'"')) - logger.debug(value) - message = {"advvfdipp":{value["tag"]: value["val"]}} - wizard_api.write_plc_values(message) - except Exception as e: - logger.debug(e) - -def receiveCommand(topic, payload, wizard_api): - logger.debug(topic) - logger.debug(json.loads(payload)) - p = json.loads(payload)[0] - command = p["payload"]["name"].split(".")[1] - commands = { - "sync": sync, - "writeplctag": writeplctag, - } - commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api) - #logger.debug(command) - ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api) - -def ack(msgid, mac, name, value, wizard_api): - #logger.debug(mac) - mac = "".join(mac.split(":")[:-2]) - #logger.debug(msgid) - #logger.debug(mac) - #logger.debug(name) - #logger.debug(value) - wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}])) \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/mistaway/v2/pub/sendData.py b/Pub_Sub/advvfdipp/mistaway/v2/pub/sendData.py deleted file mode 100644 index 84f5106..0000000 --- a/Pub_Sub/advvfdipp/mistaway/v2/pub/sendData.py +++ /dev/null @@ -1,211 +0,0 @@ -# Enter your python code. -import json -from common.Logger import logger -from quickfaas.remotebus import publish -import re, uuid -from paho.mqtt import client - -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"]: - logger.info("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["init"] = True - logger.info("Connecting to MQTT Broker for LWT purposes!!!!!!!") - lwtData["client"].connect("mq194.imistaway.net",1883, 600) - lwtData["client"].publish("meshify/db/194/_/mainHP/" + mac + ":00:00/connected", json.dumps({"value":True})) - except Exception as e: - logger.error("LWT DID NOT DO THE THING") - logger.error(e) - -def sendData(message): - #logger.debug(message) - mac = __topic__.split("/")[-1] #':'.join(re.findall('..', '%012x' % uuid.getnode())) - lwt(mac) - for measure in message["measures"]: - try: - logger.debug(measure) - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault"]: - logger.debug("Converting DINT/BOOL to STRING") - value = convert_int(measure["name"], measure["value"]) - logger.debug("Converted {} to {}".format(measure["value"], value)) - publish(__topic__ + ":01:99/" + measure["name"], json.dumps({"value": value}), __qos__) - else: - publish(__topic__ + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__) - except Exception as e: - logger.error(e) - - #publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__) - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - plc_tags = { - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") - - \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/mistaway/v2/sub/receiveCommand.py b/Pub_Sub/advvfdipp/mistaway/v2/sub/receiveCommand.py deleted file mode 100644 index f9e6cbd..0000000 --- a/Pub_Sub/advvfdipp/mistaway/v2/sub/receiveCommand.py +++ /dev/null @@ -1,218 +0,0 @@ -# Enter your python code. -import json -from quickfaas.measure import recall -from common.Logger import logger - -def sync(mac,value, wizard_api): - #get new values and send - try: - data = recall()#json.loads(recall().decode("utf-8")) - except Exception as e: - logger.error(e) - logger.info(data) - for controller in data: - for measure in controller["measures"]: - #publish measure - topic = "meshify/db/194/_/advvfdipp/" + mac + "/" + measure["name"] - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault"]: - payload = [{"value": convert_int(measure["name"], measure["value"])}] - else: - payload = [{"value": measure["value"]}] - logger.debug("Sending on topic: {}".format(topic)) - logger.debug("Sending value: {}".format(payload)) - wizard_api.mqtt_publish(topic, json.dumps(payload)) -def writeplctag(mac, value, wizard_api): - try: - value = json.loads(value.replace("'",'"')) - logger.debug(value) - message = {"advvfdipp":{value["tag"]: value["val"]}} - wizard_api.write_plc_values(message) - except Exception as e: - logger.debug(e) - -def receiveCommand(topic, payload, wizard_api): - logger.debug(topic) - logger.debug(json.loads(payload)) - p = json.loads(payload)[0] - command = p["payload"]["name"].split(".")[1] - commands = { - "sync": sync, - "writeplctag": writeplctag, - } - commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api) - #logger.debug(command) - ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api) - -def ack(msgid, mac, name, value, wizard_api): - #logger.debug(mac) - mac = "".join(mac.split(":")[:-2]) - #logger.debug(msgid) - #logger.debug(mac) - #logger.debug(name) - #logger.debug(value) - wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}])) - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - plc_tags = { - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") diff --git a/Pub_Sub/advvfdipp/mistaway/v3/pub/sendData.py b/Pub_Sub/advvfdipp/mistaway/v3/pub/sendData.py deleted file mode 100644 index 700fcba..0000000 --- a/Pub_Sub/advvfdipp/mistaway/v3/pub/sendData.py +++ /dev/null @@ -1,324 +0,0 @@ -import json, uuid, os -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(): - 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 - - - -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): - #logger.debug(message) - mac = __topic__.split("/")[-1] - lwt(mac) - checkCredentialConfig() - for measure in message["measures"]: - try: - logger.debug(measure) - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault"]: - logger.debug("Converting DINT/BOOL to STRING") - value = convert_int(measure["name"], measure["value"]) - logger.debug("Converted {} to {}".format(measure["value"], value)) - publish(__topic__ + ":01:99/" + measure["name"], json.dumps({"value": value}), __qos__) - else: - publish(__topic__ + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__) - except Exception as e: - logger.error(e) - - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - plc_tags = { - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") - - \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/mistaway/v4/sub/receiveCommand.py b/Pub_Sub/advvfdipp/mistaway/v4/sub/receiveCommand.py deleted file mode 100644 index ff6b6d0..0000000 --- a/Pub_Sub/advvfdipp/mistaway/v4/sub/receiveCommand.py +++ /dev/null @@ -1,221 +0,0 @@ -# Enter your python code. -import json -from quickfaas.measure import recall -from common.Logger import logger - -def sync(mac,value, wizard_api): - #get new values and send - try: - data = recall()#json.loads(recall().decode("utf-8")) - except Exception as e: - logger.error(e) - logger.info(data) - for controller in data: - for measure in controller["measures"]: - #publish measure - topic = "meshify/db/194/_/advvfdipp/" + mac + "/" + measure["name"] - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault"]: - payload = [{"value": convert_int(measure["name"], measure["value"])}] - else: - payload = [{"value": measure["value"]}] - logger.debug("Sending on topic: {}".format(topic)) - logger.debug("Sending value: {}".format(payload)) - wizard_api.mqtt_publish(topic, json.dumps(payload)) -def writeplctag(mac, value, wizard_api): - try: - value = json.loads(value.replace("'",'"')) - logger.debug(value) - message = {"advvfdipp":{value["tag"]: value["val"]}} - wizard_api.write_plc_values(message) - except Exception as e: - logger.debug(e) - -def receiveCommand(topic, payload, wizard_api): - logger.debug(topic) - logger.debug(json.loads(payload)) - p = json.loads(payload)[0] - command = p["payload"]["name"].split(".")[1] - commands = { - "sync": sync, - "writeplctag": writeplctag, - } - commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api) - #logger.debug(command) - ack(p["msgId"], p["mac"], command, p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api) - -def ack(msgid, mac, name, command, value, wizard_api): - #logger.debug(mac) - macsquish = "".join(mac.split(":")[:-2]) - maclower = ":".join(mac.split(":")[:-2]) - maclower = maclower.lower() - #logger.debug(msgid) - #logger.debug(mac) - #logger.debug(name) - #logger.debug(value) - wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(macsquish,name, value), "msgid": str(msgid)}])) - wizard_api.mqtt_publish("meshify/db/194/_/mainMeshify/" + maclower + ":00:00/commands", json.dumps([{"value": {"status": "success", "value": str(value), "channel": command}, "msgid": str(msgid)}])) - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - plc_tags = { - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") diff --git a/Pub_Sub/advvfdipp/thingsboard/v2/advvfdipp_tb_v2.cfg b/Pub_Sub/advvfdipp/thingsboard/advvfdipp_tb_v2.cfg similarity index 100% rename from Pub_Sub/advvfdipp/thingsboard/v2/advvfdipp_tb_v2.cfg rename to Pub_Sub/advvfdipp/thingsboard/advvfdipp_tb_v2.cfg diff --git a/Pub_Sub/advvfdipp/thingsboard/v3/advvfdipp_tb_v3.cfg b/Pub_Sub/advvfdipp/thingsboard/advvfdipp_tb_v3.cfg similarity index 100% rename from Pub_Sub/advvfdipp/thingsboard/v3/advvfdipp_tb_v3.cfg rename to Pub_Sub/advvfdipp/thingsboard/advvfdipp_tb_v3.cfg diff --git a/Pub_Sub/advvfdipp/thingsboard/v4/advvfdipp_tb_v4.cfg b/Pub_Sub/advvfdipp/thingsboard/advvfdipp_tb_v4.cfg similarity index 100% rename from Pub_Sub/advvfdipp/thingsboard/v4/advvfdipp_tb_v4.cfg rename to Pub_Sub/advvfdipp/thingsboard/advvfdipp_tb_v4.cfg diff --git a/Pub_Sub/advvfdipp/thingsboard/advvfdipp_tb_v5.cfg b/Pub_Sub/advvfdipp/thingsboard/advvfdipp_tb_v5.cfg new file mode 100644 index 0000000..66687ae --- /dev/null +++ b/Pub_Sub/advvfdipp/thingsboard/advvfdipp_tb_v5.cfg @@ -0,0 +1,1221 @@ +{ + "controllers": [ + { + "protocol": "EtherNet/IP", + "name": "advvfdipp", + "args": {}, + "samplePeriod": 2, + "expired": 10000, + "endpoint": "192.168.1.10:44818" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "reference": 45 + } + ], + "measures": [ + { + "name": "flowrate", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "val_Flowmeter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "fluidlevel", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "val_FluidLevel", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "intakepressure", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "val_IntakePressure", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "intaketemperature", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "val_IntakeTemperature", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "tubingpressure", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "val_TubingPressure", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "wellstatus", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "INT", + "addr": "Device_Status_INT", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "vfdfrequency", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "VFD_SpeedFdbk", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "flowtotal", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Flow_Total[0]", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "energytotal", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Energy_Total[0]", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "vfdcurrent", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "VFD_OutCurrent", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "downholesensorstatus", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "INT", + "addr": "Downhole_Sensor_Status_INT", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "fluidspecificgravity", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "cfg_FluidSpecificGravity", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "flowtotalyesterday", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Flow_Total[1]", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "energytotalyesterday", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Energy_Total[1]", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "alarmflowrate", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "alarm_Flowmeter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "alarmintakepressure", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "alarm_IntakePressure", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "alarmintaketemperature", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "alarm_IntakeTemperature", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "alarmtubingpressure", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "alarm_TubingPressure", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "alarmvfd", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "alarm_VFD", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "alarmlockout", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "alarm_Lockout", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "runpermissive", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "INT", + "addr": "Run_Permissive_INT", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "startpermissive", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "INT", + "addr": "Start_Permissive_INT", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "alarmfluidlevel", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "alarm_FluidLevel", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pressureshutdownlimit", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "AIn_IntakePressure.Val_LoLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pressurestartuplimit", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "AIn_IntakePressure.Val_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "temperatureshutdownlimit", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "AIn_IntakeTemperature.Val_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "temperaturestartuplimit", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "AIn_IntakeTemperature.Val_LoLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "sensorheight", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "cfg_DHSensorDistToIntake", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_vfd_fault_code", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "INT", + "addr": "PowerFlex755.Val_LastFaultCode", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "vfd_fault", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "INT", + "addr": "sts_CurrentVFDFaultCode", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "controllerfault_io", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "ControllerFault_IO", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "controllerfault_program", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "ControllerFault_Program", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "minvfdfrequency", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "PowerFlex755.Cfg_MinSpdRef", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "maxvfdfrequency", + "ctrlName": "advvfdipp", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "PowerFlex755.Cfg_MaxSpdRef", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "ctrlName": "advvfdipp", + "dataType": "BIT", + "addr": "cmd_Start", + "readWrite": "rw", + "uploadType": "periodic", + "group": "default", + "name": "startcommand", + "desc": "", + "unit": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "decimal": 2 + }, + { + "ctrlName": "advvfdipp", + "dataType": "BIT", + "addr": "cmd_Stop", + "readWrite": "rw", + "uploadType": "periodic", + "group": "default", + "name": "stopcommand", + "desc": "", + "unit": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "decimal": 2 + }, + { + "ctrlName": "advvfdipp", + "dataType": "DINT", + "addr": "sts_PID_Control", + "readWrite": "rw", + "uploadType": "periodic", + "group": "default", + "name": "pidcontrolmode", + "desc": "", + "unit": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "decimal": 2 + }, + { + "ctrlName": "advvfdipp", + "dataType": "FLOAT", + "addr": "cfg_PID_FlowSP", + "readWrite": "rw", + "uploadType": "periodic", + "group": "default", + "decimal": 2, + "name": "flowsetpoint", + "desc": "", + "unit": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "" + }, + { + "ctrlName": "advvfdipp", + "dataType": "FLOAT", + "addr": "cfg_PID_TubingPressureSP", + "readWrite": "rw", + "uploadType": "periodic", + "group": "default", + "decimal": 2, + "name": "tubingpressuresetpoint", + "desc": "", + "unit": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "" + }, + { + "ctrlName": "advvfdipp", + "dataType": "FLOAT", + "addr": "cfg_PID_FluidLevelSP", + "readWrite": "rw", + "uploadType": "periodic", + "group": "default", + "decimal": 2, + "name": "fluidlevelsetpoint", + "desc": "", + "unit": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "" + }, + { + "ctrlName": "advvfdipp", + "dataType": "FLOAT", + "addr": "cfg_PID_ManualSP", + "readWrite": "rw", + "uploadType": "periodic", + "group": "default", + "decimal": 2, + "name": "manualfrequencysetpoint", + "desc": "", + "unit": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "" + }, + { + "ctrlName": "advvfdipp", + "dataType": "BIT", + "addr": "cmd_ResetAlarms", + "readWrite": "rw", + "uploadType": "periodic", + "group": "default", + "name": "resetalarms", + "desc": "", + "unit": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "decimal": 2 + }, + { + "ctrlName": "advvfdipp", + "dataType": "FLOAT", + "addr": "val_Flowmeter_BarrelsPerMinute", + "readWrite": "ro", + "uploadType": "periodic", + "group": "default", + "decimal": 2, + "name": "flowrate_gpm", + "desc": "", + "unit": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "" + }, + { + "ctrlName": "advvfdipp", + "dataType": "BIT", + "addr": "PROMAG_300:I1.Connection_Fault", + "readWrite": "ro", + "uploadType": "periodic", + "group": "default", + "name": "flowmeter_fault", + "desc": "", + "unit": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "decimal": 2 + } + ], + "alarms": [ + { + "name": "alarmflowrate", + "ctrlName": "advvfdipp", + "measureName": "alarmflowrate", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Flow Rate Alarm triggered", + "alarmLable": "default" + }, + { + "name": "alarmintakepressure", + "ctrlName": "advvfdipp", + "measureName": "alarmintakepressure", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Intake Pressure Alarm triggered", + "alarmLable": "default" + }, + { + "name": "alarmintaketemperature", + "ctrlName": "advvfdipp", + "measureName": "alarmintaketemperature", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Intake Temperature Alarm triggered", + "alarmLable": "default" + }, + { + "name": "alarmtubingpressure", + "ctrlName": "advvfdipp", + "measureName": "alarmtubingpressure", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Tubing Pressure Alarm triggered", + "alarmLable": "default" + }, + { + "name": "alarmvfd", + "ctrlName": "advvfdipp", + "measureName": "alarmvfd", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "VFD Alarm triggered", + "alarmLable": "default" + }, + { + "name": "alarmlockout", + "ctrlName": "advvfdipp", + "measureName": "alarmlockout", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Lockout Alarm triggered", + "alarmLable": "default" + }, + { + "name": "alarmfluidlevel", + "ctrlName": "advvfdipp", + "measureName": "alarmfluidlevel", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Fluid Level Alarm triggered", + "alarmLable": "default" + }, + { + "name": "controllerfault_io", + "ctrlName": "advvfdipp", + "measureName": "controllerfault_io", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Controller IO Alarm triggered", + "alarmLable": "default" + }, + { + "name": "controllerfault_program", + "ctrlName": "advvfdipp", + "measureName": "controllerfault_program", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Controller Fault Alarm triggered", + "alarmLable": "default" + }, + { + "name": "flowmeter_fault", + "ctrlName": "advvfdipp", + "measureName": "flowmeter_fault", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Flow Meter Alarm triggered", + "alarmLable": "default" + } + ], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "INFO", + "coms": [ + { + "name": "rs232", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + }, + { + "name": "rs485", + "baud": 19200, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + } + ] + }, + "clouds": [ + { + "cacheSize": 100, + "enable": 1, + "type": "Standard MQTT", + "args": { + "host": "hp.henrypump.cloud", + "port": 1883, + "clientId": "unknown", + "auth": 1, + "tls": 0, + "cleanSession": 1, + "mqttVersion": "v3.1.1", + "keepalive": 120, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "unknown", + "passwd": "unknown", + "authType": 1 + }, + "name": "default" + } + ], + "labels": [ + { + "key": "SN", + "value": "GF5022210011339" + }, + { + "key": "MAC", + "value": "00:18:05:1e:95:0f" + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "name": "Send Data", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "qos": 1, + "groups": [ + "default" + ], + "funcName": "sendData", + "script": "# Enter your python code.\nimport json, os, time\nfrom datetime import datetime as dt\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom quickfaas.global_dict import get as get_params\nfrom quickfaas.global_dict import _set_global_args\n\ndef reboot(reason=\"Rebooting for config file update\"):\n #basic = Basic()\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\n logger.info(reason)\n r = os.popen(\"kill -s SIGHUP `cat /var/run/python/supervisord.pid`\").read()\n logger.info(f\"REBOOT : {r}\")\n\ndef checkFileExist(filename):\n path = \"/var/user/files\"\n if not os.path.exists(path):\n logger.debug(\"no folder making files folder in var/user\")\n os.makedirs(path)\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n if not os.path.exists(path + \"/\" + filename):\n logger.debug(\"no creds file making creds file\")\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\ndef convertJSONtoDS(j):\n d = []\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n return d\n\ndef checkCredentialConfig():\n logger.debug(\"CHECKING CONFIG\")\n cfgpath = \"/var/user/cfg/device_supervisor/device_supervisor.cfg\"\n credspath = \"/var/user/files/creds.json\"\n cfg = dict()\n with open(cfgpath, \"r\") as f:\n cfg = json.load(f)\n clouds = cfg.get(\"clouds\")\n logger.debug(clouds)\n #if not configured then try to configure from stored values\n if clouds[0][\"args\"][\"clientId\"] == \"unknown\" or clouds[0][\"args\"][\"username\"] == \"unknown\" or not clouds[0][\"args\"][\"passwd\"] or clouds[0][\"args\"][\"passwd\"] == \"unknown\":\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n creds = json.load(c)\n if creds:\n logger.debug(\"updating config with stored data\")\n clouds[0][\"args\"][\"clientId\"] = creds[\"clientId\"]\n clouds[0][\"args\"][\"username\"] = creds[\"userName\"]\n clouds[0][\"args\"][\"passwd\"] = creds[\"password\"]\n cfg[\"clouds\"] = clouds\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n reboot()\n else:\n #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\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n logger.debug(\"updating stored file with new data\")\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n creds = json.load(c)\n if creds:\n if creds[\"clientId\"] != clouds[0][\"args\"][\"clientId\"]:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n if creds[\"userName\"] != clouds[0][\"args\"][\"username\"]:\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n if creds[\"password\"] != clouds[0][\"args\"][\"passwd\"]:\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n else:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n with open(credspath, \"w\") as cw:\n json.dump(creds,cw)\n\ndef checkParameterConfig(cfg):\n logger.debug(\"Checking Parameters!!!!\")\n paramspath = \"/var/user/files/params.json\"\n cfgparams = convertDStoJSON(cfg.get(\"labels\"))\n #check stored values \n checkFileExist(\"params.json\")\n with open(paramspath, \"r\") as f:\n logger.debug(\"Opened param storage file\")\n params = json.load(f)\n if params:\n if cfgparams != params:\n #go through each param\n #if not \"unknown\" and cfg and params aren't the same take from cfg likely updated manually\n #if key in cfg but not in params copy to params\n logger.debug(\"equalizing params between cfg and stored\")\n for key in cfgparams.keys():\n try:\n if cfgparams[key] != params[key] and cfgparams[key] != \"unknown\":\n params[key] = cfgparams[key]\n except:\n params[key] = cfgparams[key]\n cfg[\"labels\"] = convertJSONtoDS(params)\n _set_global_args(convertJSONtoDS(params))\n with open(paramspath, \"w\") as p:\n json.dump(params, p)\n else:\n with open(paramspath, \"w\") as p:\n logger.debug(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n \n return cfg\n\n# Helper function to split the payload into chunks\ndef chunk_payload(payload, chunk_size=20):\n chunked_values = list(payload[\"values\"].items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n \"ts\": payload[\"ts\"],\n \"values\": dict(chunked_values[i:i+chunk_size])\n }\n\ndef sendData(message):\n #logger.debug(message)\n try:\n checkCredentialConfig()\n except Exception as e:\n logger.error(e)\n payload = {\"ts\": (round(dt.timestamp(dt.now())/600)*600)*1000, \"values\": {}}\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n if abs(payload[\"ts\"]/1000 - measure[\"timestamp\"]) > 3600:\n reboot(reason=\"Poll timestamp and actual timestamp out of sync. Actual: {} Poll: {}\".format(payload[\"ts\"]/1000,measure[\"timestamp\"]))\n if measure[\"name\"] in [\"wellstatus\",\"pidcontrolmode\",\"downholesensorstatus\",\"alarmflowrate\",\"alarmintakepressure\",\"alarmintaketemperature\",\"alarmtubingpressure\",\"alarmvfd\",\"alarmlockout\",\"alarmfluidlevel\",\"runpermissive\",\"startpermissive\",\"last_vfd_fault_code\",\"vfd_fault\", \"flowmeter_fault\"]:\n logger.debug(\"Converting DINT/BOOL to STRING\")\n value = convert_int(measure[\"name\"], measure[\"value\"])\n logger.debug(\"Converted {} to {}\".format(measure[\"value\"], value))\n payload[\"values\"][measure[\"name\"]] = value\n payload[\"values\"][measure[\"name\"] + \"_int\"] = measure[\"value\"]\n else:\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"] \n except Exception as e:\n logger.error(e)\n \n for chunk in chunk_payload(payload=payload):\n publish(__topic__, json.dumps(chunk), __qos__)\n time.sleep(2)\n publish(\"v1/devices/me/attributes\", json.dumps({\"latestReportTime\": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__)\n\ndef convert_int(plc_tag, value):\n well_status_codes = {\n 0: \"Running\",\n 1: \"Pumped Off\",\n 2: \"Alarmed\",\n 3: \"Locked Out\",\n 4: \"Stopped\"\n }\n\n pid_control_codes = {\n 0: \"Flow\",\n 1: \"Fluid Level\",\n 2: \"Tubing Pressure\",\n 3: \"Manual\"\n }\n\n downhole_codes = {\n 0: \"OK\",\n 1: \"Connecting\",\n 2: \"Open Circuit\",\n 3: \"Shorted\",\n 4: \"Cannot Decode\"\n }\n\n permissive_codes = {\n 0: \"OK\",\n 1: \"Flow\",\n 2: \"Intake Pressure\",\n 3: \"Intake Temperature\",\n 4: \"Tubing Pressure\",\n 5: \"VFD\",\n 6: \"Fluid Level\",\n 7: \"Min. Downtime\"\n }\n\n alarm_codes = {\n 0: \"OK\",\n 1: \"Alarm\"\n }\n\n alarm_vfd_codes = {\n 0: \"OK\",\n 1: \"Locked Out\"\n }\n\n vfd_fault_codes = {\n 0: \"No Fault\",\n 2: \"Auxiliary Input\",\n 3: \"Power Loss\",\n 4: \"UnderVoltage\",\n 5: \"OverVoltage\",\n 7: \"Motor Overload\",\n 8: \"Heatsink OverTemp\",\n 9: \"Thermister OverTemp\",\n 10: \"Dynamic Brake OverTemp\",\n 12: \"Hardware OverCurrent\",\n 13: \"Ground Fault\",\n 14: \"Ground Warning\",\n 15: \"Load Loss\",\n 17: \"Input Phase Loss\",\n 18: \"Motor PTC Trip\",\n 19: \"Task Overrun\",\n 20: \"Torque Prove Speed Band\",\n 21: \"Output Phase Loss\",\n 24: \"Decel Inhibit\",\n 25: \"OverSpeed Limit\",\n 26: \"Brake Slipped\",\n 27: \"Torque Prove Conflict\",\n 28: \"TP Encls Confict\",\n 29: \"Analog In Loss\",\n 33: \"Auto Restarts Exhausted\",\n 35: \"IPM OverCurrent\",\n 36: \"SW OverCurrent\",\n 38: \"Phase U to Ground\",\n 39: \"Phase V to Ground\",\n 40: \"Phase W to Ground\",\n 41: \"Phase UV Short\",\n 42: \"Phase VW Short\",\n 43: \"Phase WU Short\",\n 44: \"Phase UNeg to Ground\",\n 45: \"Phase VNeg to Ground\",\n 46: \"Phase WNeg to Ground\",\n 48: \"System Defaulted\",\n 49: \"Drive Powerup\",\n 51: \"Clear Fault Queue\",\n 55: \"Control Board Overtemp\",\n 59: \"Invalid Code\",\n 61: \"Shear Pin 1\",\n 62: \"Shear Pin 2\",\n 64: \"Drive Overload\",\n 66: \"OW Torque Level\",\n 67: \"Pump Off\",\n 71: \"Port 1 Adapter\",\n 72: \"Port 2 Adapter\",\n 73: \"Port 3 Adapter\",\n 74: \"Port 4 Adapter\",\n 75: \"Port 5 Adapter\",\n 76: \"Port 6 Adapter\",\n 77: \"IR Volts Range\",\n 78: \"FluxAmps Ref Range\",\n 79: \"Excessive Load\",\n 80: \"AutoTune Aborted\",\n 81: \"Port 1 DPI Loss\",\n 82: \"Port 2 DPI Loss\",\n 83: \"Port 3 DPI Loss\",\n 84: \"Port 4 DPI Loss\",\n 85: \"Port 5 DPI Loss\",\n 86: \"Port 6 DPI Loss\",\n 87: \"IXo Voltage Range\",\n 91: \"Primary Velocity Feedback Loss\",\n 93: \"Hardware Enable Check\",\n 94: \"Alternate Velocity Feedback Loss\",\n 95: \"Auxiliary Velocity Feedback Loss\",\n 96: \"Position Feedback Loss\",\n 97: \"Auto Tach Switch\",\n 100: \"Parameter Checksum\",\n 101: \"Power Down NVS Blank\",\n 102: \"NVS Not Blank\",\n 103: \"Power Down NVS Incompatible\",\n 104: \"Power Board Checksum\",\n 106: \"Incompat MCB-PB\",\n 107: \"Replaced MCB-PB\",\n 108: \"Analog Calibration Checksum\",\n 110: \"Invalid Power Board Data\",\n 111: \"Power Board Invalid ID\",\n 112: \"Power Board App Min Version\",\n 113: \"Tracking DataError\",\n 115: \"Power Down Table Full\",\n 116: \"Power Down Entry Too Large\",\n 117: \"Power Down Data Checksum\",\n 118: \"Power Board Power Down Checksum\",\n 124: \"App ID Changed\",\n 125: \"Using Backup App\",\n 134: \"Start on Power Up\",\n 137: \"External Precharge Error\",\n 138: \"Precharge Open\",\n 141: \"Autotune Enc Angle\",\n 142: \"Autotune Speed Restricted\",\n 143: \"Autotune Current Regulator\",\n 144: \"Autotune Inertia\",\n 145: \"Autotune Travel\",\n 13035: \"Net IO Timeout\",\n 13037: \"Net IO Timeout\"\n\n }\n\n plc_tags = {\n \"wellstatus\": well_status_codes.get(value, \"Invalid Code\"),\n \"pidcontrolmode\": pid_control_codes.get(value, \"Invalid Code\"),\n \"downholesensorstatus\": downhole_codes.get(value, \"Invalid Code\"),\n \"alarmflowrate\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmintakepressure\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmintaketemperature\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmtubingpressure\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmvfd\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmlockout\": alarm_vfd_codes.get(value, \"Invalid Code\"),\n \"alarmfluidlevel\": alarm_codes.get(value, \"Invalid Code\"),\n \"runpermissive\": permissive_codes.get(value, \"Invalid Code\"),\n \"startpermissive\": permissive_codes.get(value, \"Invalid Code\"),\n \"last_vfd_fault_code\": vfd_fault_codes.get(value, \"Invalid Code\"),\n \"vfd_fault\": vfd_fault_codes.get(value, \"Invalid Code\"),\n \"flowmeter_fault\": alarm_codes.get(value, \"Invalid Code\")\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")\n\n ", + "msgType": 0, + "cloudName": "default" + }, + { + "name": "sendAlarm", + "trigger": "warning_event", + "topic": "v1/devices/me/telemetry", + "qos": 1, + "funcName": "sendAlarm", + "script": "# Enter your python code.\nimport json, time\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom quickfaas.measure import recall\n\n\ndef sendAlarm(message):\n logger.info(message)\n payload = {}\n payload[\"ts\"] = time.time()*1000\n payload[\"values\"] = {message[\"measureName\"]: message[\"value\"]}\n publish(__topic__, json.dumps(payload), __qos__)\n sync()\n\ndef sync():\n #get new values and send\n payload = {\"ts\": time.time()*1000, \"values\": {}}\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.debug(data)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n if measure[\"name\"] in [\"wellstatus\",\"pidcontrolmode\",\"downholesensorstatus\",\"alarmflowrate\",\"alarmintakepressure\",\"alarmintaketemperature\",\"alarmtubingpressure\",\"alarmvfd\",\"alarmlockout\",\"alarmfluidlevel\",\"runpermissive\",\"startpermissive\",\"last_vfd_fault_code\",\"vfd_fault\", \"flowmeter_fault\"]:\n payload[\"values\"][measure[\"name\"]] = convert_int(measure[\"name\"], measure[\"value\"])\n payload[\"values\"][measure[\"name\"]+ \"_int\"] = measure[\"value\"]\n else:\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n logger.debug(\"Sending on topic: {}\".format(__topic__))\n logger.debug(\"Sending value: {}\".format(payload))\n publish(__topic__, json.dumps(payload), 1)\n\n\ndef convert_int(plc_tag, value):\n well_status_codes = {\n 0: \"Running\",\n 1: \"Pumped Off\",\n 2: \"Alarmed\",\n 3: \"Locked Out\",\n 4: \"Stopped\"\n }\n\n pid_control_codes = {\n 0: \"Flow\",\n 1: \"Fluid Level\",\n 2: \"Tubing Pressure\",\n 3: \"Manual\"\n }\n\n downhole_codes = {\n 0: \"OK\",\n 1: \"Connecting\",\n 2: \"Open Circuit\",\n 3: \"Shorted\",\n 4: \"Cannot Decode\"\n }\n\n permissive_codes = {\n 0: \"OK\",\n 1: \"Flow\",\n 2: \"Intake Pressure\",\n 3: \"Intake Temperature\",\n 4: \"Tubing Pressure\",\n 5: \"VFD\",\n 6: \"Fluid Level\",\n 7: \"Min. Downtime\"\n }\n\n alarm_codes = {\n 0: \"OK\",\n 1: \"Alarm\"\n }\n\n alarm_vfd_codes = {\n 0: \"OK\",\n 1: \"Locked Out\"\n }\n\n vfd_fault_codes = {\n 0: \"No Fault\",\n 2: \"Auxiliary Input\",\n 3: \"Power Loss\",\n 4: \"UnderVoltage\",\n 5: \"OverVoltage\",\n 7: \"Motor Overload\",\n 8: \"Heatsink OverTemp\",\n 9: \"Thermister OverTemp\",\n 10: \"Dynamic Brake OverTemp\",\n 12: \"Hardware OverCurrent\",\n 13: \"Ground Fault\",\n 14: \"Ground Warning\",\n 15: \"Load Loss\",\n 17: \"Input Phase Loss\",\n 18: \"Motor PTC Trip\",\n 19: \"Task Overrun\",\n 20: \"Torque Prove Speed Band\",\n 21: \"Output Phase Loss\",\n 24: \"Decel Inhibit\",\n 25: \"OverSpeed Limit\",\n 26: \"Brake Slipped\",\n 27: \"Torque Prove Conflict\",\n 28: \"TP Encls Confict\",\n 29: \"Analog In Loss\",\n 33: \"Auto Restarts Exhausted\",\n 35: \"IPM OverCurrent\",\n 36: \"SW OverCurrent\",\n 38: \"Phase U to Ground\",\n 39: \"Phase V to Ground\",\n 40: \"Phase W to Ground\",\n 41: \"Phase UV Short\",\n 42: \"Phase VW Short\",\n 43: \"Phase WU Short\",\n 44: \"Phase UNeg to Ground\",\n 45: \"Phase VNeg to Ground\",\n 46: \"Phase WNeg to Ground\",\n 48: \"System Defaulted\",\n 49: \"Drive Powerup\",\n 51: \"Clear Fault Queue\",\n 55: \"Control Board Overtemp\",\n 59: \"Invalid Code\",\n 61: \"Shear Pin 1\",\n 62: \"Shear Pin 2\",\n 64: \"Drive Overload\",\n 66: \"OW Torque Level\",\n 67: \"Pump Off\",\n 71: \"Port 1 Adapter\",\n 72: \"Port 2 Adapter\",\n 73: \"Port 3 Adapter\",\n 74: \"Port 4 Adapter\",\n 75: \"Port 5 Adapter\",\n 76: \"Port 6 Adapter\",\n 77: \"IR Volts Range\",\n 78: \"FluxAmps Ref Range\",\n 79: \"Excessive Load\",\n 80: \"AutoTune Aborted\",\n 81: \"Port 1 DPI Loss\",\n 82: \"Port 2 DPI Loss\",\n 83: \"Port 3 DPI Loss\",\n 84: \"Port 4 DPI Loss\",\n 85: \"Port 5 DPI Loss\",\n 86: \"Port 6 DPI Loss\",\n 87: \"IXo Voltage Range\",\n 91: \"Primary Velocity Feedback Loss\",\n 93: \"Hardware Enable Check\",\n 94: \"Alternate Velocity Feedback Loss\",\n 95: \"Auxiliary Velocity Feedback Loss\",\n 96: \"Position Feedback Loss\",\n 97: \"Auto Tach Switch\",\n 100: \"Parameter Checksum\",\n 101: \"Power Down NVS Blank\",\n 102: \"NVS Not Blank\",\n 103: \"Power Down NVS Incompatible\",\n 104: \"Power Board Checksum\",\n 106: \"Incompat MCB-PB\",\n 107: \"Replaced MCB-PB\",\n 108: \"Analog Calibration Checksum\",\n 110: \"Invalid Power Board Data\",\n 111: \"Power Board Invalid ID\",\n 112: \"Power Board App Min Version\",\n 113: \"Tracking DataError\",\n 115: \"Power Down Table Full\",\n 116: \"Power Down Entry Too Large\",\n 117: \"Power Down Data Checksum\",\n 118: \"Power Board Power Down Checksum\",\n 124: \"App ID Changed\",\n 125: \"Using Backup App\",\n 134: \"Start on Power Up\",\n 137: \"External Precharge Error\",\n 138: \"Precharge Open\",\n 141: \"Autotune Enc Angle\",\n 142: \"Autotune Speed Restricted\",\n 143: \"Autotune Current Regulator\",\n 144: \"Autotune Inertia\",\n 145: \"Autotune Travel\",\n 13035: \"Net IO Timeout\",\n 13037: \"Net IO Timeout\"\n\n }\n\n plc_tags = {\n \"wellstatus\": well_status_codes.get(value, \"Invalid Code\"),\n \"pidcontrolmode\": pid_control_codes.get(value, \"Invalid Code\"),\n \"downholesensorstatus\": downhole_codes.get(value, \"Invalid Code\"),\n \"alarmflowrate\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmintakepressure\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmintaketemperature\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmtubingpressure\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmvfd\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmlockout\": alarm_vfd_codes.get(value, \"Invalid Code\"),\n \"alarmfluidlevel\": alarm_codes.get(value, \"Invalid Code\"),\n \"runpermissive\": permissive_codes.get(value, \"Invalid Code\"),\n \"startpermissive\": permissive_codes.get(value, \"Invalid Code\"),\n \"last_vfd_fault_code\": vfd_fault_codes.get(value, \"Invalid Code\"),\n \"vfd_fault\": vfd_fault_codes.get(value, \"Invalid Code\"),\n \"flowmeter_fault\": alarm_codes.get(value, \"Invalid Code\")\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")\n", + "alarms": [ + "default" + ], + "msgType": 0, + "cloudName": "default" + } + ], + "downloadFuncs": [ + { + "name": "Commands", + "topic": "v1/devices/me/rpc/request/+", + "qos": 1, + "funcName": "receiveCommand", + "payload_type": "JSON", + "script": "import json, time\nfrom datetime import datetime as dt\nfrom quickfaas.measure import recall, write\nfrom quickfaas.remotebus import publish\nfrom common.Logger import logger\n\n# Helper function to split the payload into chunks\ndef chunk_payload(payload, chunk_size=20):\n chunked_values = list(payload[\"values\"].items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n \"ts\": payload[\"ts\"],\n \"values\": dict(chunked_values[i:i+chunk_size])\n }\n\ndef sync():\n #get new values and send\n payload = {\"ts\": round(dt.timestamp(dt.now()))*1000, \"values\": {}}\n topic = \"v1/devices/me/telemetry\"\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.debug(data)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n if measure[\"name\"] in [\"wellstatus\",\"pidcontrolmode\",\"downholesensorstatus\",\"alarmflowrate\",\"alarmintakepressure\",\"alarmintaketemperature\",\"alarmtubingpressure\",\"alarmvfd\",\"alarmlockout\",\"alarmfluidlevel\",\"runpermissive\",\"startpermissive\",\"last_vfd_fault_code\",\"vfd_fault\", \"flowmeter_fault\"]:\n payload[measure[\"name\"]] = convert_int(measure[\"name\"], measure[\"value\"])\n payload[measure[\"name\"]+ \"_int\"] = measure[\"value\"]\n else:\n payload[measure[\"name\"]] = measure[\"value\"]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n for chunk in chunk_payload(payload=payload):\n publish(topic, json.dumps(chunk), 1)\n time.sleep(2)\ndef writeplctag(value):\n #value in the form {\"measurement\": , \"value\": }\n try:\n #value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n #payload format: [{\"name\": \"advvfdipp\", \"measures\": [{\"name\": \"manualfrequencysetpoint\", \"value\": 49}]}]\n message = [{\"name\": \"advvfdipp\", \"measures\":[{\"name\":value[\"measurement\"], \"value\": value[\"value\"]}]}]\n resp = write(message) \n logger.debug(\"RETURN FROM WRITE: {}\".format(resp))\n return True\n except Exception as e:\n logger.debug(e)\n return False\n \ndef receiveCommand(topic, payload):\n try:\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)\n command = p[\"method\"]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n } \n if command == \"setPLCTag\":\n try:\n result = commands[\"writeplctag\"](p[\"params\"])\n logger.debug(result)\n except Exception as e:\n logger.error(e)\n elif command == \"changeSetpoint\":\n try:\n logger.debug(\"attempting controlpoint write\")\n params_type = {\"measurement\": \"pidcontrolmode\", \"value\": p[\"params\"][\"setpointType\"]}\n if params_type[\"value\"]:\n commands[\"writeplctag\"](params_type)\n time.sleep(2)\n except Exception as e:\n logger.error(\"DID NOT WRITE CONTROL MODE\")\n logger.error(e)\n try:\n logger.debug(\"attempting setpoint write\")\n modes = {0: \"flowsetpoint\", 1: \"fluidlevelsetpoint\", 2: \"tubingpressuresetpoint\", 3: \"manualfrequencysetpoint\"}\n params_value = {\"value\": p[\"params\"][\"setpointValue\"]}\n if params_value[\"value\"]:\n params_value[\"measurement\"] = modes[getMode()]\n result = commands[\"writeplctag\"](params_value)\n logger.debug(result)\n except Exception as e:\n logger.error(\"DID NOT WRITE SETPOINT\")\n logger.error(e)\n #logger.debug(command)\n ack(topic.split(\"/\")[-1])\n time.sleep(5)\n sync()\n except Exception as e:\n logger.debug(e)\n \n\ndef ack(msgid):\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n publish(\"v1/devices/me/rpc/response/\" + str(msgid), json.dumps({\"msg\": {\"time\": time.time()}, \"metadata\": \"\", \"msgType\": \"\"}), 1)\n\ndef getMode():\n try:\n data = recall()\n for controller in data:\n for measure in controller[\"measures\"]:\n if measure[\"name\"] == \"pidcontrolmode\":\n return measure[\"value\"]\n except:\n return None\n\ndef convert_int(plc_tag, value):\n well_status_codes = {\n 0: \"Running\",\n 1: \"Pumped Off\",\n 2: \"Alarmed\",\n 3: \"Locked Out\",\n 4: \"Stopped\"\n }\n\n pid_control_codes = {\n 0: \"Flow\",\n 1: \"Fluid Level\",\n 2: \"Tubing Pressure\",\n 3: \"Manual\"\n }\n\n downhole_codes = {\n 0: \"OK\",\n 1: \"Connecting\",\n 2: \"Open Circuit\",\n 3: \"Shorted\",\n 4: \"Cannot Decode\"\n }\n\n permissive_codes = {\n 0: \"OK\",\n 1: \"Flow\",\n 2: \"Intake Pressure\",\n 3: \"Intake Temperature\",\n 4: \"Tubing Pressure\",\n 5: \"VFD\",\n 6: \"Fluid Level\",\n 7: \"Min. Downtime\"\n }\n\n alarm_codes = {\n 0: \"OK\",\n 1: \"Alarm\"\n }\n\n alarm_vfd_codes = {\n 0: \"OK\",\n 1: \"Locked Out\"\n }\n\n vfd_fault_codes = {\n 0: \"No Fault\",\n 2: \"Auxiliary Input\",\n 3: \"Power Loss\",\n 4: \"UnderVoltage\",\n 5: \"OverVoltage\",\n 7: \"Motor Overload\",\n 8: \"Heatsink OverTemp\",\n 9: \"Thermister OverTemp\",\n 10: \"Dynamic Brake OverTemp\",\n 12: \"Hardware OverCurrent\",\n 13: \"Ground Fault\",\n 14: \"Ground Warning\",\n 15: \"Load Loss\",\n 17: \"Input Phase Loss\",\n 18: \"Motor PTC Trip\",\n 19: \"Task Overrun\",\n 20: \"Torque Prove Speed Band\",\n 21: \"Output Phase Loss\",\n 24: \"Decel Inhibit\",\n 25: \"OverSpeed Limit\",\n 26: \"Brake Slipped\",\n 27: \"Torque Prove Conflict\",\n 28: \"TP Encls Confict\",\n 29: \"Analog In Loss\",\n 33: \"Auto Restarts Exhausted\",\n 35: \"IPM OverCurrent\",\n 36: \"SW OverCurrent\",\n 38: \"Phase U to Ground\",\n 39: \"Phase V to Ground\",\n 40: \"Phase W to Ground\",\n 41: \"Phase UV Short\",\n 42: \"Phase VW Short\",\n 43: \"Phase WU Short\",\n 44: \"Phase UNeg to Ground\",\n 45: \"Phase VNeg to Ground\",\n 46: \"Phase WNeg to Ground\",\n 48: \"System Defaulted\",\n 49: \"Drive Powerup\",\n 51: \"Clear Fault Queue\",\n 55: \"Control Board Overtemp\",\n 59: \"Invalid Code\",\n 61: \"Shear Pin 1\",\n 62: \"Shear Pin 2\",\n 64: \"Drive Overload\",\n 66: \"OW Torque Level\",\n 67: \"Pump Off\",\n 71: \"Port 1 Adapter\",\n 72: \"Port 2 Adapter\",\n 73: \"Port 3 Adapter\",\n 74: \"Port 4 Adapter\",\n 75: \"Port 5 Adapter\",\n 76: \"Port 6 Adapter\",\n 77: \"IR Volts Range\",\n 78: \"FluxAmps Ref Range\",\n 79: \"Excessive Load\",\n 80: \"AutoTune Aborted\",\n 81: \"Port 1 DPI Loss\",\n 82: \"Port 2 DPI Loss\",\n 83: \"Port 3 DPI Loss\",\n 84: \"Port 4 DPI Loss\",\n 85: \"Port 5 DPI Loss\",\n 86: \"Port 6 DPI Loss\",\n 87: \"IXo Voltage Range\",\n 91: \"Primary Velocity Feedback Loss\",\n 93: \"Hardware Enable Check\",\n 94: \"Alternate Velocity Feedback Loss\",\n 95: \"Auxiliary Velocity Feedback Loss\",\n 96: \"Position Feedback Loss\",\n 97: \"Auto Tach Switch\",\n 100: \"Parameter Checksum\",\n 101: \"Power Down NVS Blank\",\n 102: \"NVS Not Blank\",\n 103: \"Power Down NVS Incompatible\",\n 104: \"Power Board Checksum\",\n 106: \"Incompat MCB-PB\",\n 107: \"Replaced MCB-PB\",\n 108: \"Analog Calibration Checksum\",\n 110: \"Invalid Power Board Data\",\n 111: \"Power Board Invalid ID\",\n 112: \"Power Board App Min Version\",\n 113: \"Tracking DataError\",\n 115: \"Power Down Table Full\",\n 116: \"Power Down Entry Too Large\",\n 117: \"Power Down Data Checksum\",\n 118: \"Power Board Power Down Checksum\",\n 124: \"App ID Changed\",\n 125: \"Using Backup App\",\n 134: \"Start on Power Up\",\n 137: \"External Precharge Error\",\n 138: \"Precharge Open\",\n 141: \"Autotune Enc Angle\",\n 142: \"Autotune Speed Restricted\",\n 143: \"Autotune Current Regulator\",\n 144: \"Autotune Inertia\",\n 145: \"Autotune Travel\",\n 13035: \"Net IO Timeout\",\n 13037: \"Net IO Timeout\"\n\n }\n\n plc_tags = {\n \"wellstatus\": well_status_codes.get(value, \"Invalid Code\"),\n \"pidcontrolmode\": pid_control_codes.get(value, \"Invalid Code\"),\n \"downholesensorstatus\": downhole_codes.get(value, \"Invalid Code\"),\n \"alarmflowrate\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmintakepressure\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmintaketemperature\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmtubingpressure\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmvfd\": alarm_codes.get(value, \"Invalid Code\"),\n \"alarmlockout\": alarm_vfd_codes.get(value, \"Invalid Code\"),\n \"alarmfluidlevel\": alarm_codes.get(value, \"Invalid Code\"),\n \"runpermissive\": permissive_codes.get(value, \"Invalid Code\"),\n \"startpermissive\": permissive_codes.get(value, \"Invalid Code\"),\n \"last_vfd_fault_code\": vfd_fault_codes.get(value, \"Invalid Code\"),\n \"vfd_fault\": vfd_fault_codes.get(value, \"Invalid Code\"),\n \"flowmeter_fault\": alarm_codes.get(value, \"Invalid Code\")\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")\n", + "msgType": 0, + "trigger": "command_event", + "cloudName": "default" + } + ] + }, + "modbusSlave": { + "enable": 0, + "protocol": "Modbus-TCP", + "port": 502, + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "maxConnection": 5, + "mapping_table": [] + }, + "iec104Server": { + "enable": 0, + "cotSize": 2, + "port": 2404, + "serverList": [ + { + "asduAddr": 1 + } + ], + "kValue": 12, + "wValue": 8, + "t0": 15, + "t1": 15, + "t2": 10, + "t3": 20, + "maximumLink": 5, + "timeSet": 1, + "byteOrder": "abcd", + "mapping_table": [] + }, + "opcuaServer": { + "enable": 0, + "port": 4840, + "maximumLink": 5, + "securityMode": 0, + "identifierType": "String", + "mapping_table": [] + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "southMetadata": {}, + "bindMetadata": { + "version": "", + "timestamp": "" + } +} \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/thingsboard/v1/device_supervisor_advvfdipp_tb_v1.cfg b/Pub_Sub/advvfdipp/thingsboard/device_supervisor_advvfdipp_tb_v1.cfg similarity index 100% rename from Pub_Sub/advvfdipp/thingsboard/v1/device_supervisor_advvfdipp_tb_v1.cfg rename to Pub_Sub/advvfdipp/thingsboard/device_supervisor_advvfdipp_tb_v1.cfg diff --git a/Pub_Sub/advvfdipp/thingsboard/v4/pub/sendAlarms.py b/Pub_Sub/advvfdipp/thingsboard/pub/sendAlarms.py similarity index 100% rename from Pub_Sub/advvfdipp/thingsboard/v4/pub/sendAlarms.py rename to Pub_Sub/advvfdipp/thingsboard/pub/sendAlarms.py diff --git a/Pub_Sub/advvfdipp/thingsboard/v4/pub/sendData.py b/Pub_Sub/advvfdipp/thingsboard/pub/sendData.py similarity index 100% rename from Pub_Sub/advvfdipp/thingsboard/v4/pub/sendData.py rename to Pub_Sub/advvfdipp/thingsboard/pub/sendData.py diff --git a/Pub_Sub/advvfdipp/thingsboard/v4/sub/receiveCommand.py b/Pub_Sub/advvfdipp/thingsboard/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/advvfdipp/thingsboard/v4/sub/receiveCommand.py rename to Pub_Sub/advvfdipp/thingsboard/sub/receiveCommand.py diff --git a/Pub_Sub/advvfdipp/thingsboard/v1/pub/sendData.py b/Pub_Sub/advvfdipp/thingsboard/v1/pub/sendData.py deleted file mode 100644 index 6ba8ad4..0000000 --- a/Pub_Sub/advvfdipp/thingsboard/v1/pub/sendData.py +++ /dev/null @@ -1,194 +0,0 @@ -# Enter your python code. -import json -from common.Logger import logger -from quickfaas.remotebus import publish -import re, uuid -from paho.mqtt import client - - -def sendData(message): - #logger.debug(message) - payload = {} - for measure in message["measures"]: - try: - logger.debug(measure) - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault", "flowmeter_fault"]: - logger.debug("Converting DINT/BOOL to STRING") - value = convert_int(measure["name"], measure["value"]) - logger.debug("Converted {} to {}".format(measure["value"], value)) - payload[measure["name"]] = value - payload[measure["name"] + "_int"] = measure["value"] - else: - payload[measure["name"]] = measure["value"] - except Exception as e: - logger.error(e) - - publish(__topic__, json.dumps(payload), __qos__) - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - plc_tags = { - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code"), - "flowmeter_fault": alarm_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") - - \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/thingsboard/v1/sub/receiveCommand.py b/Pub_Sub/advvfdipp/thingsboard/v1/sub/receiveCommand.py deleted file mode 100644 index 082b02f..0000000 --- a/Pub_Sub/advvfdipp/thingsboard/v1/sub/receiveCommand.py +++ /dev/null @@ -1,257 +0,0 @@ -# Enter your python code. -import json -import time -from quickfaas.measure import recall -from common.Logger import logger - -def sync(wizard_api): - #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.info(data) - for controller in data: - for measure in controller["measures"]: - #publish measure - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault", "flowmeter_fault"]: - payload[measure["name"]] = convert_int(measure["name"], measure["value"]) - payload[measure["name"]+ "_int"] = measure["value"] - else: - payload[measure["name"]] = measure["value"] - logger.debug("Sending on topic: {}".format(topic)) - logger.debug("Sending value: {}".format(payload)) - wizard_api.mqtt_publish(topic, json.dumps(payload)) -def writeplctag(value, wizard_api): - try: - #value = json.loads(value.replace("'",'"')) - logger.debug(value) - message = {"advvfdipp":{value["measurement"]: value["value"]}} - resp = wizard_api.write_plc_values(message) - #logger.debug("RETURN FROM WRITE: {}".format(resp)) - return True - except Exception as e: - logger.debug(e) - return False - -def receiveCommand(topic, payload, wizard_api): - try: - logger.debug(topic) - logger.debug(json.loads(payload)) - p = json.loads(payload) - command = p["method"] - commands = { - "sync": sync, - "writeplctag": writeplctag, - } - if command == "setPLCTag": - result = commands["writeplctag"](p["params"],wizard_api) - elif command == "changeSetpoint": - try: - params_type = {"measurement": "pidcontrolmode", "value": p["params"]["setpointType"]} - if params_type["value"]: - commands["writeplctag"](params_type, wizard_api) - time.sleep(2) - except: - pass - try: - modes = {0: "flowsetpoint", 1: "fluidlevelsetpoint", 2: "tubingpressuresetpoint", 3: "manualfrequencysetpoint"} - params_value = {"value": p["params"]["setpointValue"]} - if params_value["value"]: - params_value["measurement"] = modes[getMode()] - commands["writeplctag"](params_value, wizard_api) - except: - pass - - #logger.debug(command) - ack(topic.split("/")[-1], wizard_api) - time.sleep(5) - sync(wizard_api) - except Exception as e: - logger.debug(e) - - -def ack(msgid, wizard_api): - #logger.debug(msgid) - #logger.debug(mac) - #logger.debug(name) - #logger.debug(value) - wizard_api.mqtt_publish("v1/devices/me/rpc/response/" + str(msgid), json.dumps({"msg": {"time": time.time()}, "metadata": "", "msgType": ""})) - -def getMode(): - try: - data = recall() - for controller in data: - for measure in controller["measures"]: - if measure["name"] == "pidcontrolmode": - return measure["value"] - except: - return None - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - plc_tags = { - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code"), - "flowmeter_fault": alarm_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") diff --git a/Pub_Sub/advvfdipp/thingsboard/v2/pub/sendData.py b/Pub_Sub/advvfdipp/thingsboard/v2/pub/sendData.py deleted file mode 100644 index 6ba8ad4..0000000 --- a/Pub_Sub/advvfdipp/thingsboard/v2/pub/sendData.py +++ /dev/null @@ -1,194 +0,0 @@ -# Enter your python code. -import json -from common.Logger import logger -from quickfaas.remotebus import publish -import re, uuid -from paho.mqtt import client - - -def sendData(message): - #logger.debug(message) - payload = {} - for measure in message["measures"]: - try: - logger.debug(measure) - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault", "flowmeter_fault"]: - logger.debug("Converting DINT/BOOL to STRING") - value = convert_int(measure["name"], measure["value"]) - logger.debug("Converted {} to {}".format(measure["value"], value)) - payload[measure["name"]] = value - payload[measure["name"] + "_int"] = measure["value"] - else: - payload[measure["name"]] = measure["value"] - except Exception as e: - logger.error(e) - - publish(__topic__, json.dumps(payload), __qos__) - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - plc_tags = { - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code"), - "flowmeter_fault": alarm_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") - - \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/thingsboard/v2/sub/receiveCommand.py b/Pub_Sub/advvfdipp/thingsboard/v2/sub/receiveCommand.py deleted file mode 100644 index 5427e70..0000000 --- a/Pub_Sub/advvfdipp/thingsboard/v2/sub/receiveCommand.py +++ /dev/null @@ -1,258 +0,0 @@ -# Enter your python code. -import json -import time -from quickfaas.measure import recall -from common.Logger import logger - -def sync(wizard_api): - #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.info(data) - for controller in data: - for measure in controller["measures"]: - #publish measure - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault", "flowmeter_fault"]: - payload[measure["name"]] = convert_int(measure["name"], measure["value"]) - payload[measure["name"]+ "_int"] = measure["value"] - else: - payload[measure["name"]] = measure["value"] - logger.debug("Sending on topic: {}".format(topic)) - logger.debug("Sending value: {}".format(payload)) - wizard_api.mqtt_publish(topic, json.dumps(payload)) -def writeplctag(value, wizard_api): - try: - #value = json.loads(value.replace("'",'"')) - logger.debug(value) - message = {"advvfdipp":{value["measurement"]: value["value"]}} - resp = wizard_api.write_plc_values(message) - #logger.debug("RETURN FROM WRITE: {}".format(resp)) - return True - except Exception as e: - logger.debug(e) - return False - -def receiveCommand(topic, payload, wizard_api): - try: - logger.debug(topic) - logger.debug(json.loads(payload)) - p = json.loads(payload) - command = p["method"] - commands = { - "sync": sync, - "writeplctag": writeplctag, - } - if command == "setPLCTag": - result = commands["writeplctag"](p["params"],wizard_api) - elif command == "changeSetpoint": - try: - params_type = {"measurement": "pidcontrolmode", "value": p["params"]["setpointType"]} - if params_type["value"]: - commands["writeplctag"](params_type, wizard_api) - time.sleep(2) - except: - pass - try: - modes = {0: "flowsetpoint", 1: "fluidlevelsetpoint", 2: "tubingpressuresetpoint", 3: "manualfrequencysetpoint"} - params_value = {"value": p["params"]["setpointValue"]} - if params_value["value"]: - params_value["measurement"] = modes[getMode()] - commands["writeplctag"](params_value, wizard_api) - except Exception as e: - logger.debug("DID NOT WRITE SETPOINT") - logger.debug(e) - - #logger.debug(command) - ack(topic.split("/")[-1], wizard_api) - time.sleep(5) - sync(wizard_api) - except Exception as e: - logger.debug(e) - - -def ack(msgid, wizard_api): - #logger.debug(msgid) - #logger.debug(mac) - #logger.debug(name) - #logger.debug(value) - wizard_api.mqtt_publish("v1/devices/me/rpc/response/" + str(msgid), json.dumps({"msg": {"time": time.time()}, "metadata": "", "msgType": ""})) - -def getMode(): - try: - data = recall() - for controller in data: - for measure in controller["measures"]: - if measure["name"] == "pidcontrolmode": - return measure["value"] - except: - return None - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - plc_tags = { - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code"), - "flowmeter_fault": alarm_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") diff --git a/Pub_Sub/advvfdipp/thingsboard/v3/advvfdipp_alarms_2023_Jan_05.csv b/Pub_Sub/advvfdipp/thingsboard/v3/advvfdipp_alarms_2023_Jan_05.csv deleted file mode 100644 index 27b0f34..0000000 --- a/Pub_Sub/advvfdipp/thingsboard/v3/advvfdipp_alarms_2023_Jan_05.csv +++ /dev/null @@ -1,11 +0,0 @@ -AlarmName,ControllerName,MeasuringPointName,AlarmLevel,Condition1,Operand1,CombineMethod,Condition2,Operand2,AlarmContent,AlarmTag -alarmflowrate,advvfdipp,alarmflowrate,5,eq,1,none,eq,,Flow Rate Alarm triggered,default -alarmintakepressure,advvfdipp,alarmintakepressure,5,eq,1,none,eq,,Intake Pressure Alarm triggered,default -alarmintaketemperature,advvfdipp,alarmintaketemperature,5,eq,1,none,eq,,Intake Temperature Alarm triggered,default -alarmtubingpressure,advvfdipp,alarmtubingpressure,5,eq,1,none,eq,,Tubing Pressure Alarm triggered,default -alarmvfd,advvfdipp,alarmvfd,5,eq,1,none,eq,,VFD Alarm triggered,default -alarmlockout,advvfdipp,alarmlockout,5,eq,1,none,eq,,Lockout Alarm triggered,default -alarmfluidlevel,advvfdipp,alarmfluidlevel,5,eq,1,none,eq,,Fluid Level Alarm triggered,default -controllerfault_io,advvfdipp,controllerfault_io,5,eq,1,none,eq,,Controller IO Alarm triggered,default -controllerfault_program,advvfdipp,controllerfault_program,5,eq,1,none,eq,,Controller Fault Alarm triggered,default -flowmeter_fault,advvfdipp,flowmeter_fault,5,eq,1,none,eq,,Flow Meter Alarm triggered,default \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/thingsboard/v3/pub/sendData.py b/Pub_Sub/advvfdipp/thingsboard/v3/pub/sendData.py deleted file mode 100644 index b6d38cc..0000000 --- a/Pub_Sub/advvfdipp/thingsboard/v3/pub/sendData.py +++ /dev/null @@ -1,312 +0,0 @@ -# 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.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 - -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"])) - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault", "flowmeter_fault"]: - logger.debug("Converting DINT/BOOL to STRING") - value = convert_int(measure["name"], measure["value"]) - logger.debug("Converted {} to {}".format(measure["value"], value)) - payload["values"][measure["name"]] = value - payload["values"][measure["name"] + "_int"] = measure["value"] - else: - 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__) - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - plc_tags = { - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code"), - "flowmeter_fault": alarm_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") - - \ No newline at end of file diff --git a/Pub_Sub/advvfdipp/thingsboard/v3/sub/receiveCommand.py b/Pub_Sub/advvfdipp/thingsboard/v3/sub/receiveCommand.py deleted file mode 100644 index 5610b34..0000000 --- a/Pub_Sub/advvfdipp/thingsboard/v3/sub/receiveCommand.py +++ /dev/null @@ -1,266 +0,0 @@ -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 - if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault", "flowmeter_fault"]: - payload[measure["name"]] = convert_int(measure["name"], measure["value"]) - payload[measure["name"]+ "_int"] = measure["value"] - else: - 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": , "value": } - try: - #value = json.loads(value.replace("'",'"')) - logger.debug(value) - #payload format: [{"name": "advvfdipp", "measures": [{"name": "manualfrequencysetpoint", "value": 49}]}] - message = [{"name": "advvfdipp", "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) - elif command == "changeSetpoint": - try: - logger.debug("attempting controlpoint write") - params_type = {"measurement": "pidcontrolmode", "value": p["params"]["setpointType"]} - if params_type["value"]: - commands["writeplctag"](params_type) - time.sleep(2) - except Exception as e: - logger.error("DID NOT WRITE CONTROL MODE") - logger.error(e) - try: - logger.debug("attempting setpoint write") - modes = {0: "flowsetpoint", 1: "fluidlevelsetpoint", 2: "tubingpressuresetpoint", 3: "manualfrequencysetpoint"} - params_value = {"value": p["params"]["setpointValue"]} - if params_value["value"]: - params_value["measurement"] = modes[getMode()] - result = commands["writeplctag"](params_value) - logger.debug(result) - except Exception as e: - logger.error("DID NOT WRITE SETPOINT") - 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) - -def getMode(): - try: - data = recall() - for controller in data: - for measure in controller["measures"]: - if measure["name"] == "pidcontrolmode": - return measure["value"] - except: - return None - -def convert_int(plc_tag, value): - well_status_codes = { - 0: "Running", - 1: "Pumped Off", - 2: "Alarmed", - 3: "Locked Out", - 4: "Stopped" - } - - pid_control_codes = { - 0: "Flow", - 1: "Fluid Level", - 2: "Tubing Pressure", - 3: "Manual" - } - - downhole_codes = { - 0: "OK", - 1: "Connecting", - 2: "Open Circuit", - 3: "Shorted", - 4: "Cannot Decode" - } - - permissive_codes = { - 0: "OK", - 1: "Flow", - 2: "Intake Pressure", - 3: "Intake Temperature", - 4: "Tubing Pressure", - 5: "VFD", - 6: "Fluid Level", - 7: "Min. Downtime" - } - - alarm_codes = { - 0: "OK", - 1: "Alarm" - } - - alarm_vfd_codes = { - 0: "OK", - 1: "Locked Out" - } - - vfd_fault_codes = { - 0: "No Fault", - 2: "Auxiliary Input", - 3: "Power Loss", - 4: "UnderVoltage", - 5: "OverVoltage", - 7: "Motor Overload", - 8: "Heatsink OverTemp", - 9: "Thermister OverTemp", - 10: "Dynamic Brake OverTemp", - 12: "Hardware OverCurrent", - 13: "Ground Fault", - 14: "Ground Warning", - 15: "Load Loss", - 17: "Input Phase Loss", - 18: "Motor PTC Trip", - 19: "Task Overrun", - 20: "Torque Prove Speed Band", - 21: "Output Phase Loss", - 24: "Decel Inhibit", - 25: "OverSpeed Limit", - 26: "Brake Slipped", - 27: "Torque Prove Conflict", - 28: "TP Encls Confict", - 29: "Analog In Loss", - 33: "Auto Restarts Exhausted", - 35: "IPM OverCurrent", - 36: "SW OverCurrent", - 38: "Phase U to Ground", - 39: "Phase V to Ground", - 40: "Phase W to Ground", - 41: "Phase UV Short", - 42: "Phase VW Short", - 43: "Phase WU Short", - 44: "Phase UNeg to Ground", - 45: "Phase VNeg to Ground", - 46: "Phase WNeg to Ground", - 48: "System Defaulted", - 49: "Drive Powerup", - 51: "Clear Fault Queue", - 55: "Control Board Overtemp", - 59: "Invalid Code", - 61: "Shear Pin 1", - 62: "Shear Pin 2", - 64: "Drive Overload", - 66: "OW Torque Level", - 67: "Pump Off", - 71: "Port 1 Adapter", - 72: "Port 2 Adapter", - 73: "Port 3 Adapter", - 74: "Port 4 Adapter", - 75: "Port 5 Adapter", - 76: "Port 6 Adapter", - 77: "IR Volts Range", - 78: "FluxAmps Ref Range", - 79: "Excessive Load", - 80: "AutoTune Aborted", - 81: "Port 1 DPI Loss", - 82: "Port 2 DPI Loss", - 83: "Port 3 DPI Loss", - 84: "Port 4 DPI Loss", - 85: "Port 5 DPI Loss", - 86: "Port 6 DPI Loss", - 87: "IXo Voltage Range", - 91: "Primary Velocity Feedback Loss", - 93: "Hardware Enable Check", - 94: "Alternate Velocity Feedback Loss", - 95: "Auxiliary Velocity Feedback Loss", - 96: "Position Feedback Loss", - 97: "Auto Tach Switch", - 100: "Parameter Checksum", - 101: "Power Down NVS Blank", - 102: "NVS Not Blank", - 103: "Power Down NVS Incompatible", - 104: "Power Board Checksum", - 106: "Incompat MCB-PB", - 107: "Replaced MCB-PB", - 108: "Analog Calibration Checksum", - 110: "Invalid Power Board Data", - 111: "Power Board Invalid ID", - 112: "Power Board App Min Version", - 113: "Tracking DataError", - 115: "Power Down Table Full", - 116: "Power Down Entry Too Large", - 117: "Power Down Data Checksum", - 118: "Power Board Power Down Checksum", - 124: "App ID Changed", - 125: "Using Backup App", - 134: "Start on Power Up", - 137: "External Precharge Error", - 138: "Precharge Open", - 141: "Autotune Enc Angle", - 142: "Autotune Speed Restricted", - 143: "Autotune Current Regulator", - 144: "Autotune Inertia", - 145: "Autotune Travel", - 13035: "Net IO Timeout", - 13037: "Net IO Timeout" - - } - - plc_tags = { - "wellstatus": well_status_codes.get(value, "Invalid Code"), - "pidcontrolmode": pid_control_codes.get(value, "Invalid Code"), - "downholesensorstatus": downhole_codes.get(value, "Invalid Code"), - "alarmflowrate": alarm_codes.get(value, "Invalid Code"), - "alarmintakepressure": alarm_codes.get(value, "Invalid Code"), - "alarmintaketemperature": alarm_codes.get(value, "Invalid Code"), - "alarmtubingpressure": alarm_codes.get(value, "Invalid Code"), - "alarmvfd": alarm_codes.get(value, "Invalid Code"), - "alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"), - "alarmfluidlevel": alarm_codes.get(value, "Invalid Code"), - "runpermissive": permissive_codes.get(value, "Invalid Code"), - "startpermissive": permissive_codes.get(value, "Invalid Code"), - "last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"), - "vfd_fault": vfd_fault_codes.get(value, "Invalid Code"), - "flowmeter_fault": alarm_codes.get(value, "Invalid Code") - } - - return plc_tags.get(plc_tag, "Invalid Tag") diff --git a/Pub_Sub/advvfdipp_sru/thingsboard/v1/advvfdipp_sru_tb_v1.cfg b/Pub_Sub/advvfdipp_sru/thingsboard/advvfdipp_sru_tb_v1.cfg similarity index 100% rename from Pub_Sub/advvfdipp_sru/thingsboard/v1/advvfdipp_sru_tb_v1.cfg rename to Pub_Sub/advvfdipp_sru/thingsboard/advvfdipp_sru_tb_v1.cfg diff --git a/Pub_Sub/advvfdipp_sru/thingsboard/v2/advvfdipp_sru_tb_v2.cfg b/Pub_Sub/advvfdipp_sru/thingsboard/advvfdipp_sru_tb_v2.cfg similarity index 100% rename from Pub_Sub/advvfdipp_sru/thingsboard/v2/advvfdipp_sru_tb_v2.cfg rename to Pub_Sub/advvfdipp_sru/thingsboard/advvfdipp_sru_tb_v2.cfg diff --git a/Pub_Sub/advvfdipp_sru/thingsboard/v2/pub/sendAlarms.py b/Pub_Sub/advvfdipp_sru/thingsboard/pub/sendAlarms.py similarity index 100% rename from Pub_Sub/advvfdipp_sru/thingsboard/v2/pub/sendAlarms.py rename to Pub_Sub/advvfdipp_sru/thingsboard/pub/sendAlarms.py diff --git a/Pub_Sub/advvfdipp_sru/thingsboard/v2/pub/sendData.py b/Pub_Sub/advvfdipp_sru/thingsboard/pub/sendData.py similarity index 100% rename from Pub_Sub/advvfdipp_sru/thingsboard/v2/pub/sendData.py rename to Pub_Sub/advvfdipp_sru/thingsboard/pub/sendData.py diff --git a/Pub_Sub/advvfdipp_sru/thingsboard/v1/pub/sendToPLC.py b/Pub_Sub/advvfdipp_sru/thingsboard/pub/sendToPLC.py similarity index 100% rename from Pub_Sub/advvfdipp_sru/thingsboard/v1/pub/sendToPLC.py rename to Pub_Sub/advvfdipp_sru/thingsboard/pub/sendToPLC.py diff --git a/Pub_Sub/advvfdipp_sru/thingsboard/v2/sub/receiveCommand.py b/Pub_Sub/advvfdipp_sru/thingsboard/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/advvfdipp_sru/thingsboard/v2/sub/receiveCommand.py rename to Pub_Sub/advvfdipp_sru/thingsboard/sub/receiveCommand.py diff --git a/Pub_Sub/advvfdipp_sru/thingsboard/v2/pub/sendToPLC.py b/Pub_Sub/advvfdipp_sru/thingsboard/v2/pub/sendToPLC.py deleted file mode 100644 index afdc889..0000000 --- a/Pub_Sub/advvfdipp_sru/thingsboard/v2/pub/sendToPLC.py +++ /dev/null @@ -1,29 +0,0 @@ -# Enter your python code. -import json, time -from quickfaas.measure import recall, write -from quickfaas.remotebus import publish -from common.Logger import logger - - -def writeplctag(value): - #value in the form {"measurement": , "value": } - try: - #value = json.loads(value.replace("'",'"')) - logger.debug(value) - #payload format: [{"name": "advvfdipp", "measures": [{"name": "manualfrequencysetpoint", "value": 49}]}] - message = [{"name": "advvfdipp", "measures":[{"name":value["measurement"], "value": value["value"]}]}] - resp = write(message) - logger.debug("RETURN FROM WRITE: {}".format(resp)) - return True - except Exception as e: - logger.error(e) - return False - -def sendToPLC(message): - logger.debug(message) - for measure in message["measures"]: - logger.debug(measure) - #{'ctrlName': 'modbus_converter', 'name': 'SRU_Data[1]', 'health': 1, 'timestamp': 1664894200, 'value': 47} - writeplctag({"measurement": measure["name"], "value": measure["value"]}) - #time.sleep(2) - \ No newline at end of file diff --git a/Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/advvfdipp_wo_downhole_tb_v1.cfg b/Pub_Sub/advvfdipp_wo_downhole/thingsboard/advvfdipp_wo_downhole_tb_v1.cfg similarity index 100% rename from Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/advvfdipp_wo_downhole_tb_v1.cfg rename to Pub_Sub/advvfdipp_wo_downhole/thingsboard/advvfdipp_wo_downhole_tb_v1.cfg diff --git a/Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/pub/sendAlarms.py b/Pub_Sub/advvfdipp_wo_downhole/thingsboard/pub/sendAlarms.py similarity index 100% rename from Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/pub/sendAlarms.py rename to Pub_Sub/advvfdipp_wo_downhole/thingsboard/pub/sendAlarms.py diff --git a/Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/pub/sendData.py b/Pub_Sub/advvfdipp_wo_downhole/thingsboard/pub/sendData.py similarity index 100% rename from Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/pub/sendData.py rename to Pub_Sub/advvfdipp_wo_downhole/thingsboard/pub/sendData.py diff --git a/Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/sub/receiveCommand.py b/Pub_Sub/advvfdipp_wo_downhole/thingsboard/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/sub/receiveCommand.py rename to Pub_Sub/advvfdipp_wo_downhole/thingsboard/sub/receiveCommand.py diff --git a/Pub_Sub/base.py b/Pub_Sub/base.py index 99bb4ce..688972f 100644 --- a/Pub_Sub/base.py +++ b/Pub_Sub/base.py @@ -1,4 +1,5 @@ -import json, os +import json, os, time +from datetime import datetime as dt from common.Logger import logger from quickfaas.global_dict import get as get_params from quickfaas.global_dict import _set_global_args @@ -139,4 +140,22 @@ def checkParameterConfig(cfg): except Exception as e: logger.error(f"Something went wrong in checkParameterConfig: {e}") os.system(f'rm {paramspath}') - return cfg \ No newline at end of file + return cfg + +# Helper function to split the payload into chunks +def chunk_payload(payload, chunk_size=20): + chunked_values = list(payload["values"].items()) + for i in range(0, len(chunked_values), chunk_size): + yield { + "ts": payload["ts"], + "values": dict(chunked_values[i:i+chunk_size]) + } + +def sendData(message): + payload = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}} + + for chunk in chunk_payload(payload=payload): + publish(__topic__, json.dumps(chunk), __qos__) + time.sleep(2) + + publish("v1/devices/me/attributes", json.dumps({"latestReportTime": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__) \ No newline at end of file diff --git a/Pub_Sub/cameratrailer/thingsboard/v1/cameratrailer_tb_v1.cfg b/Pub_Sub/cameratrailer/thingsboard/cameratrailer_tb_v1.cfg similarity index 100% rename from Pub_Sub/cameratrailer/thingsboard/v1/cameratrailer_tb_v1.cfg rename to Pub_Sub/cameratrailer/thingsboard/cameratrailer_tb_v1.cfg diff --git a/Pub_Sub/cameratrailer/thingsboard/v2/cameratrailer_tb_v2.cfg b/Pub_Sub/cameratrailer/thingsboard/cameratrailer_tb_v2.cfg similarity index 100% rename from Pub_Sub/cameratrailer/thingsboard/v2/cameratrailer_tb_v2.cfg rename to Pub_Sub/cameratrailer/thingsboard/cameratrailer_tb_v2.cfg diff --git a/Pub_Sub/cameratrailer/thingsboard/v3/cameratrailer_tb_v3.cfg b/Pub_Sub/cameratrailer/thingsboard/cameratrailer_tb_v3.cfg similarity index 100% rename from Pub_Sub/cameratrailer/thingsboard/v3/cameratrailer_tb_v3.cfg rename to Pub_Sub/cameratrailer/thingsboard/cameratrailer_tb_v3.cfg diff --git a/Pub_Sub/cameratrailer/thingsboard/v4/cameratrailer_tb_v4.cfg b/Pub_Sub/cameratrailer/thingsboard/cameratrailer_tb_v4.cfg similarity index 100% rename from Pub_Sub/cameratrailer/thingsboard/v4/cameratrailer_tb_v4.cfg rename to Pub_Sub/cameratrailer/thingsboard/cameratrailer_tb_v4.cfg diff --git a/Pub_Sub/cameratrailer/thingsboard/v4/pub/sendData.py b/Pub_Sub/cameratrailer/thingsboard/pub/sendData.py similarity index 100% rename from Pub_Sub/cameratrailer/thingsboard/v4/pub/sendData.py rename to Pub_Sub/cameratrailer/thingsboard/pub/sendData.py diff --git a/Pub_Sub/cameratrailer/thingsboard/v3/pub/sendSnapshot.py b/Pub_Sub/cameratrailer/thingsboard/pub/sendSnapshot.py similarity index 100% rename from Pub_Sub/cameratrailer/thingsboard/v3/pub/sendSnapshot.py rename to Pub_Sub/cameratrailer/thingsboard/pub/sendSnapshot.py diff --git a/Pub_Sub/cameratrailer/thingsboard/v2/pub/sendData.py b/Pub_Sub/cameratrailer/thingsboard/v2/pub/sendData.py deleted file mode 100644 index c9a8218..0000000 --- a/Pub_Sub/cameratrailer/thingsboard/v2/pub/sendData.py +++ /dev/null @@ -1,153 +0,0 @@ -import json, os -from datetime import datetime as dt -from common.Logger import logger -from quickfaas.remotebus import publish -from mobiuspi_lib.gps import GPS -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 - -def getGPS(): - # Create a gps instance - gps = GPS() - - # Retrieve GPS information - position_status = gps.get_position_status() - logger.debug("position_status: ") - logger.debug(position_status) - latitude = position_status["latitude"].split(" ") - longitude = position_status["longitude"].split(" ") - lat_dec = int(latitude[0][:-1]) + (float(latitude[1][:-1])/60) - lon_dec = int(longitude[0][:-1]) + (float(longitude[1][:-1])/60) - if latitude[2] == "S": - lat_dec = lat_dec * -1 - if longitude[2] == "W": - lon_dec = lon_dec * -1 - #lat_dec = round(lat_dec, 7) - #lon_dec = round(lon_dec, 7) - logger.info("HERE IS THE GPS COORDS") - logger.info(f"LATITUDE: {lat_dec}, LONGITUDE: {lon_dec}") - speedKnots = position_status["speed"].split(" ") - speedMPH = float(speedKnots[0]) * 1.151 - publish(__topic__, json.dumps({"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values":{"latitude":f"{lat_dec:.8f}", "longitude":f"{lon_dec:.8f}", "speed": f"{speedMPH:.2f}"}}), __qos__) - -def sendData(message,wizard_api): - logger.debug(message) - #publish(__topic__, json.dumps(message), __qos__) - try: - checkCredentialConfig() - getGPS() - except: - logger.error("Could not get gps data!") - - \ No newline at end of file diff --git a/Pub_Sub/cameratrailer/thingsboard/v2/pub/sendSnapshot.py b/Pub_Sub/cameratrailer/thingsboard/v2/pub/sendSnapshot.py deleted file mode 100644 index ba3fae5..0000000 --- a/Pub_Sub/cameratrailer/thingsboard/v2/pub/sendSnapshot.py +++ /dev/null @@ -1,46 +0,0 @@ -import json -from common.Logger import logger -from quickfaas.remotebus import publish -from quickfaas.global_dict import get as get_params -from datetime import datetime as dt -import requests -from requests.auth import HTTPDigestAuth -from requests.exceptions import ConnectionError -import base64 - - -def convertJSONtoDS(j): - d = [] - for key in j.keys(): - d.append({"key": key, "value": j[key]}) - return d - -def getImage(): - params = convertJSONtoDS(get_params()) - camera_ip = params["camera_ip"].replace("_", ":") - port = params["port"] - with open('./snapshot.jpg', 'wb') as handle: - resp = requests.get("http://" + camera_ip + ":" + port + "/cgi-bin/SnapshotJPEG?Resolution=640x360", auth=HTTPDigestAuth("ASS", "amerus@1903"), stream=True) - for block in resp.iter_content(1024): - if not block: - break - handle.write(block) - - with open('./snapshot.jpg', 'rb') as image_file: - encoded_string = base64.b64encode(image_file.read()) - publish(__topic__, json.dumps({"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values":{"snapshot": encoded_string.decode("UTF-8"), "camera_error": "OK"}}), __qos__) - - -def sendSnapshot(message,wizard_api): - logger.debug(message) - try: - getImage() - except ConnectionError as ce: - logger.error("Could not connect to Camera") - logger.error(ce) - publish(__topic__, json.dumps({"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values":{"camera_error": f"Could not connect to camera, check camera connection and power\n\n{ce}"}}), __qos__) - except Exception as e: - logger.error("Could not get image") - logger.error(e) - publish(__topic__, json.dumps({"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values":{"camera_error": f"Could not connect to camera, check camera connection and power\n\n{e}"}}), __qos__) - \ No newline at end of file diff --git a/Pub_Sub/cameratrailer/thingsboard/v3/pub/sendData.py b/Pub_Sub/cameratrailer/thingsboard/v3/pub/sendData.py deleted file mode 100644 index c9a8218..0000000 --- a/Pub_Sub/cameratrailer/thingsboard/v3/pub/sendData.py +++ /dev/null @@ -1,153 +0,0 @@ -import json, os -from datetime import datetime as dt -from common.Logger import logger -from quickfaas.remotebus import publish -from mobiuspi_lib.gps import GPS -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 - -def getGPS(): - # Create a gps instance - gps = GPS() - - # Retrieve GPS information - position_status = gps.get_position_status() - logger.debug("position_status: ") - logger.debug(position_status) - latitude = position_status["latitude"].split(" ") - longitude = position_status["longitude"].split(" ") - lat_dec = int(latitude[0][:-1]) + (float(latitude[1][:-1])/60) - lon_dec = int(longitude[0][:-1]) + (float(longitude[1][:-1])/60) - if latitude[2] == "S": - lat_dec = lat_dec * -1 - if longitude[2] == "W": - lon_dec = lon_dec * -1 - #lat_dec = round(lat_dec, 7) - #lon_dec = round(lon_dec, 7) - logger.info("HERE IS THE GPS COORDS") - logger.info(f"LATITUDE: {lat_dec}, LONGITUDE: {lon_dec}") - speedKnots = position_status["speed"].split(" ") - speedMPH = float(speedKnots[0]) * 1.151 - publish(__topic__, json.dumps({"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values":{"latitude":f"{lat_dec:.8f}", "longitude":f"{lon_dec:.8f}", "speed": f"{speedMPH:.2f}"}}), __qos__) - -def sendData(message,wizard_api): - logger.debug(message) - #publish(__topic__, json.dumps(message), __qos__) - try: - checkCredentialConfig() - getGPS() - except: - logger.error("Could not get gps data!") - - \ No newline at end of file diff --git a/Pub_Sub/cameratrailer/thingsboard/v4/pub/sendSnapshot.py b/Pub_Sub/cameratrailer/thingsboard/v4/pub/sendSnapshot.py deleted file mode 100644 index 2055d57..0000000 --- a/Pub_Sub/cameratrailer/thingsboard/v4/pub/sendSnapshot.py +++ /dev/null @@ -1,54 +0,0 @@ -import json, time, requests, base64 -from common.Logger import logger -from quickfaas.remotebus import publish -from quickfaas.global_dict import get as get_params -from datetime import datetime as dt -from requests.adapters import HTTPAdapter, Retry -from requests.auth import HTTPDigestAuth -from requests.exceptions import ConnectionError - - - -def convertDStoJSON(ds): - j = dict() - for x in ds: - j[x["key"]] = x["value"] - return j - -def getImage(): - params = convertDStoJSON(get_params()) - camera_ip = params["camera_ip"].replace("_", ".") - port = params["port"] - with open('./snapshot.jpg', 'wb') as handle: - with requests.Session() as s: - retries = Retry(total = 10, backoff_factor=0.1, status_forcelist=[404,408, 500, 502, 503, 504]) - s.mount('http://', HTTPAdapter(max_retries=retries)) - try: - resp = s.get("http://" + camera_ip + ":" + port + "/cgi-bin/camctrl?af=on", auth=HTTPDigestAuth("ASS", "amerus@1903"),stream=True) - except: - logger.error("Did not Auto Focus") - time.sleep(2) - resp = s.get("http://" + camera_ip + ":" + port + "/cgi-bin/SnapshotJPEG?Resolution=640x360", auth=HTTPDigestAuth("ASS", "amerus@1903"), stream=True) - for block in resp.iter_content(1024): - if not block: - break - handle.write(block) - - with open('./snapshot.jpg', 'rb') as image_file: - encoded_string = base64.b64encode(image_file.read()) - publish(__topic__, json.dumps({"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values":{"snapshot": encoded_string.decode("UTF-8"), "camera_error": "OK"}}), __qos__) - - -def sendSnapshot(message,wizard_api): - logger.debug(message) - try: - getImage() - except ConnectionError as ce: - logger.error("Could not connect to Camera") - logger.error(ce) - publish(__topic__, json.dumps({"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values":{"camera_error": f"Could not connect to camera (ConnectionError), check camera connection and power\n\n{ce}"}}), __qos__) - except Exception as e: - logger.error("Could not get image") - logger.error(e) - publish(__topic__, json.dumps({"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values":{"camera_error": f"Could not connect to camera, check camera connection, power, IP Address\n\n{e}"}}), __qos__) - \ No newline at end of file diff --git a/Pub_Sub/cameratrailer/thingsboard/hikvision_config.cnf b/Pub_Sub/cameratrailer_hk/hikvision_config.cnf similarity index 100% rename from Pub_Sub/cameratrailer/thingsboard/hikvision_config.cnf rename to Pub_Sub/cameratrailer_hk/hikvision_config.cnf diff --git a/Pub_Sub/cameratrailer/thingsboard/v5/cameratrailer_hk_tb_v5.cfg b/Pub_Sub/cameratrailer_hk/thingsboard/cameratrailer_hk_tb_v5.cfg similarity index 100% rename from Pub_Sub/cameratrailer/thingsboard/v5/cameratrailer_hk_tb_v5.cfg rename to Pub_Sub/cameratrailer_hk/thingsboard/cameratrailer_hk_tb_v5.cfg diff --git a/Pub_Sub/cameratrailer/thingsboard/v5/pub_hk/ddns.py b/Pub_Sub/cameratrailer_hk/thingsboard/pub/ddns.py similarity index 100% rename from Pub_Sub/cameratrailer/thingsboard/v5/pub_hk/ddns.py rename to Pub_Sub/cameratrailer_hk/thingsboard/pub/ddns.py diff --git a/Pub_Sub/cameratrailer/thingsboard/v5/pub_hk/sendData.py b/Pub_Sub/cameratrailer_hk/thingsboard/pub/sendData.py similarity index 100% rename from Pub_Sub/cameratrailer/thingsboard/v5/pub_hk/sendData.py rename to Pub_Sub/cameratrailer_hk/thingsboard/pub/sendData.py diff --git a/Pub_Sub/cameratrailer/thingsboard/v5/pub_hk/snapshot.py b/Pub_Sub/cameratrailer_hk/thingsboard/pub/snapshot.py similarity index 100% rename from Pub_Sub/cameratrailer/thingsboard/v5/pub_hk/snapshot.py rename to Pub_Sub/cameratrailer_hk/thingsboard/pub/snapshot.py diff --git a/Pub_Sub/config_manager.ipynb b/Pub_Sub/config_manager.ipynb index d3d676c..101421c 100644 --- a/Pub_Sub/config_manager.ipynb +++ b/Pub_Sub/config_manager.ipynb @@ -42,7 +42,6 @@ } ], "source": [ - "\n", "convert_config.write_code(root + \"/\" + devicetype + \"/\" + platform + \"/v\" + str(startversion) + \"/pub\" + \"/sendData.py\", convert_config.get_config_pub(root + \"/\" + devicetype + \"/\" + platform + \"/v\" + str(startversion) + \"/\" + deviceconfig))\n", "#convert_config.write_code(root + devicetype + \"/\" + platform + \"/v\" + str(startversion) + \"/sub\" + \"/receiveCommand.py\", convert_config.get_config_sub(root + \"/\" + devicetype + \"/\" + platform + \"/v\" + str(startversion) + \"/\" + deviceconfig))\n" ] @@ -63,7 +62,6 @@ } ], "source": [ - "\n", "convert_config.write_config(root + \"/\" + devicetype + \"/\" + platform + \"/v\" + str(startversion + 1) + \"/\" + devicetype + \"_\" + platform_short + \"_v\" + str(startversion + 1) + \".cfg\", \n", " convert_config.get_config(root + \"/\" + devicetype + \"/\" + platform + \"/v\" + str(startversion) + \"/\" + devicetype + \"_\" + platform_short + \"_v\" + str(startversion) + \".cfg\"),\n", " root + \"/\" + devicetype + \"/\" + platform + \"/v\" + str(startversion + 1) + \"/pub\" , \n", diff --git a/Pub_Sub/config_manager_v2.ipynb b/Pub_Sub/config_manager_v2.ipynb new file mode 100644 index 0000000..30789c0 --- /dev/null +++ b/Pub_Sub/config_manager_v2.ipynb @@ -0,0 +1,94 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "abbflow_tcp_tb_v3.cfg\n" + ] + } + ], + "source": [ + "import convert_config\n", + "import os\n", + "import re\n", + "\n", + "def get_latest_version(root, devicetype, platform):\n", + " platform_path = os.path.join(root, devicetype, platform)\n", + " if not os.path.exists(platform_path):\n", + " return 1\n", + " version_pattern = re.compile(r'v(\\d+)')\n", + " max_version = 0\n", + " for file in os.listdir(platform_path):\n", + " match = version_pattern.search(file)\n", + " if match:\n", + " version = int(match.group(1))\n", + " max_version = max(max_version, version)\n", + " return max_version + 1\n", + "\n", + "# Example usage\n", + "root = \"/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub\"\n", + "devicetype = \"abbflow_tcp\"\n", + "platform = \"thingsboard\" # or \"mistaway\"\n", + "platform_short = \"tb\" if platform == \"thingsboard\" else \"ma\" \n", + "startversion = get_latest_version(root, devicetype, platform)\n", + "\n", + "deviceconfig = f\"{devicetype}_{platform_short}_v{startversion}.cfg\"\n", + "print(deviceconfig)\n", + "# Rest of the code from config_manager.ipynb\n", + "# This would include calls to convert_config.write_code and convert_config.write_config\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/abbflow_tcp/thingsboard\n", + "/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/abbflow_tcp/thingsboard\n", + "Path did not exist creating path: /Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/abbflow_tcp/thingsboard/abbflow_tcp_tb_v3.cfg\n", + "/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/abbflow_tcp/thingsboard/pub\n", + "/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/abbflow_tcp/thingsboard/sub\n" + ] + } + ], + "source": [ + "convert_config.write_config(f\"{root}/{devicetype}/{platform}/{devicetype}_{platform_short}_v{str(startversion)}.cfg\", \n", + " convert_config.get_config(f\"{root}/{devicetype}/{platform}/{devicetype}_{platform_short}_v{str(startversion - 1)}.cfg\"),\n", + " root + \"/\" + devicetype + \"/\" + platform + \"/pub\" , \n", + " root + \"/\" + devicetype + \"/\" + platform + \"/sub\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "tbDataCollector", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Pub_Sub/convert_config.py b/Pub_Sub/convert_config.py index 05f5f4d..d5b4cac 100644 --- a/Pub_Sub/convert_config.py +++ b/Pub_Sub/convert_config.py @@ -5,7 +5,6 @@ import json def get_config(path): checkFileExist(path) with open(path, "r", encoding="utf-8") as f: - return json.load(f) def get_config_pub(path): @@ -42,13 +41,23 @@ def write_config(path, config, pubDir, subDir): if pubDir: checkFolderExist(pubDir) with os.scandir(pubDir) as it: - for ind, entry in enumerate(it): - config["quickfaas"]["uploadFuncs"][ind]["script"] = code_to_string(entry.path) + funcNum = 0 + for entry in it: + #print(entry) + #print(config["quickfaas"]["uploadFuncs"][ind]) + if not entry.name.startswith('.') and entry.is_file(): + config["quickfaas"]["uploadFuncs"][funcNum]["script"] = code_to_string(entry.path) + funcNum += 1 if subDir: checkFolderExist(subDir) with os.scandir(subDir) as it: - for ind, entry in enumerate(it): - config["quickfaas"]["downloadFuncs"][ind]["script"] = code_to_string(entry.path) + funcNum = 0 + for entry in it: + #print(entry) + #print(config["quickfaas"]["downloadFuncs"][ind]) + if not entry.name.startswith('.') and entry.is_file(): + config["quickfaas"]["downloadFuncs"][funcNum]["script"] = code_to_string(entry.path) + funcNum += 1 config["clouds"][0]["args"]["host"] = "hp.henrypump.cloud" config["clouds"][0]["args"]["clientId"] = "unknown" config["clouds"][0]["args"]["username"] = "unknown" diff --git a/Pub_Sub/dual_flowmeter/mistaway/v0/dual_flowmeter_ma_v0.cfg b/Pub_Sub/dual_flowmeter/mistaway/dual_flowmeter_ma_v0.cfg similarity index 100% rename from Pub_Sub/dual_flowmeter/mistaway/v0/dual_flowmeter_ma_v0.cfg rename to Pub_Sub/dual_flowmeter/mistaway/dual_flowmeter_ma_v0.cfg diff --git a/Pub_Sub/dual_flowmeter/mistaway/v1/dual_flowmeter_ma_v1.cfg b/Pub_Sub/dual_flowmeter/mistaway/dual_flowmeter_ma_v1.cfg similarity index 100% rename from Pub_Sub/dual_flowmeter/mistaway/v1/dual_flowmeter_ma_v1.cfg rename to Pub_Sub/dual_flowmeter/mistaway/dual_flowmeter_ma_v1.cfg diff --git a/Pub_Sub/dual_flowmeter/mistaway/v1/dual_flowmeter_ma_v1_2.6.1.cfg b/Pub_Sub/dual_flowmeter/mistaway/dual_flowmeter_ma_v1_2.6.1.cfg similarity index 100% rename from Pub_Sub/dual_flowmeter/mistaway/v1/dual_flowmeter_ma_v1_2.6.1.cfg rename to Pub_Sub/dual_flowmeter/mistaway/dual_flowmeter_ma_v1_2.6.1.cfg diff --git a/Pub_Sub/dual_flowmeter/mistaway/v1/pub/sendData.py b/Pub_Sub/dual_flowmeter/mistaway/pub/sendData.py similarity index 100% rename from Pub_Sub/dual_flowmeter/mistaway/v1/pub/sendData.py rename to Pub_Sub/dual_flowmeter/mistaway/pub/sendData.py diff --git a/Pub_Sub/dual_flowmeter/mistaway/v1/sub/receiveCommand.py b/Pub_Sub/dual_flowmeter/mistaway/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/dual_flowmeter/mistaway/v1/sub/receiveCommand.py rename to Pub_Sub/dual_flowmeter/mistaway/sub/receiveCommand.py diff --git a/Pub_Sub/fkplcpond/thingsboard/v2/bn_pond.cfg b/Pub_Sub/fkplcpond/thingsboard/bn_pond.cfg similarity index 100% rename from Pub_Sub/fkplcpond/thingsboard/v2/bn_pond.cfg rename to Pub_Sub/fkplcpond/thingsboard/bn_pond.cfg diff --git a/Pub_Sub/fkplcpond/thingsboard/v2/fkplcpond_ec2_2_1.cfg b/Pub_Sub/fkplcpond/thingsboard/fkplcpond_ec2_2_1.cfg similarity index 100% rename from Pub_Sub/fkplcpond/thingsboard/v2/fkplcpond_ec2_2_1.cfg rename to Pub_Sub/fkplcpond/thingsboard/fkplcpond_ec2_2_1.cfg diff --git a/Pub_Sub/fkplcpond/thingsboard/v3/fkplcpond_tb_v3.cfg b/Pub_Sub/fkplcpond/thingsboard/fkplcpond_tb_v3.cfg similarity index 100% rename from Pub_Sub/fkplcpond/thingsboard/v3/fkplcpond_tb_v3.cfg rename to Pub_Sub/fkplcpond/thingsboard/fkplcpond_tb_v3.cfg diff --git a/Pub_Sub/fkplcpond/thingsboard/v1/plcpond_tb_v1.cfg b/Pub_Sub/fkplcpond/thingsboard/plcpond_tb_v1.cfg similarity index 100% rename from Pub_Sub/fkplcpond/thingsboard/v1/plcpond_tb_v1.cfg rename to Pub_Sub/fkplcpond/thingsboard/plcpond_tb_v1.cfg diff --git a/Pub_Sub/fkplcpond/thingsboard/v2/plcpond_tb_v2.cfg b/Pub_Sub/fkplcpond/thingsboard/plcpond_tb_v2.cfg similarity index 100% rename from Pub_Sub/fkplcpond/thingsboard/v2/plcpond_tb_v2.cfg rename to Pub_Sub/fkplcpond/thingsboard/plcpond_tb_v2.cfg diff --git a/Pub_Sub/fkplcpond/thingsboard/v3/pub/sendData.py b/Pub_Sub/fkplcpond/thingsboard/pub/sendData.py similarity index 100% rename from Pub_Sub/fkplcpond/thingsboard/v3/pub/sendData.py rename to Pub_Sub/fkplcpond/thingsboard/pub/sendData.py diff --git a/Pub_Sub/fkplcpond/thingsboard/v3/sub/receiveCommand.py b/Pub_Sub/fkplcpond/thingsboard/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/fkplcpond/thingsboard/v3/sub/receiveCommand.py rename to Pub_Sub/fkplcpond/thingsboard/sub/receiveCommand.py diff --git a/Pub_Sub/fkplcpond/thingsboard/v1/pub/sendData.py b/Pub_Sub/fkplcpond/thingsboard/v1/pub/sendData.py deleted file mode 100644 index e6f7d1c..0000000 --- a/Pub_Sub/fkplcpond/thingsboard/v1/pub/sendData.py +++ /dev/null @@ -1,136 +0,0 @@ -# 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(): - #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 - - - - -def sendData(message): - payload = {} - payload["ts"] = (round(dt.timestamp(dt.now())/600)*600)*1000 - payload["values"] = {} - try: - checkCredentialConfig() - except Exception as e: - logger.error(e) - for measure in message["measures"]: - try: - logger.debug(measure) - payload["values"][measure["name"]] = measure["value"] - except Exception as e: - logger.error(e) - publish(__topic__, json.dumps(payload), __qos__) \ No newline at end of file diff --git a/Pub_Sub/fkplcpond/thingsboard/v2/pub/sendData.py b/Pub_Sub/fkplcpond/thingsboard/v2/pub/sendData.py deleted file mode 100644 index e6f7d1c..0000000 --- a/Pub_Sub/fkplcpond/thingsboard/v2/pub/sendData.py +++ /dev/null @@ -1,136 +0,0 @@ -# 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(): - #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 - - - - -def sendData(message): - payload = {} - payload["ts"] = (round(dt.timestamp(dt.now())/600)*600)*1000 - payload["values"] = {} - try: - checkCredentialConfig() - except Exception as e: - logger.error(e) - for measure in message["measures"]: - try: - logger.debug(measure) - payload["values"][measure["name"]] = measure["value"] - except Exception as e: - logger.error(e) - publish(__topic__, json.dumps(payload), __qos__) \ No newline at end of file diff --git a/Pub_Sub/flowmeterskid/mistaway/v1/flowmonitor_ma_v1.cfg b/Pub_Sub/flowmeterskid/mistaway/flowmonitor_ma_v1.cfg similarity index 100% rename from Pub_Sub/flowmeterskid/mistaway/v1/flowmonitor_ma_v1.cfg rename to Pub_Sub/flowmeterskid/mistaway/flowmonitor_ma_v1.cfg diff --git a/Pub_Sub/flowmeterskid/mistaway/v1/pub/sendData.py b/Pub_Sub/flowmeterskid/mistaway/pub/sendData.py similarity index 100% rename from Pub_Sub/flowmeterskid/mistaway/v1/pub/sendData.py rename to Pub_Sub/flowmeterskid/mistaway/pub/sendData.py diff --git a/Pub_Sub/flowmeterskid/thingsboard/v0/flowmeterskid_tb_v0.cfg b/Pub_Sub/flowmeterskid/thingsboard/flowmeterskid_tb_v0.cfg similarity index 100% rename from Pub_Sub/flowmeterskid/thingsboard/v0/flowmeterskid_tb_v0.cfg rename to Pub_Sub/flowmeterskid/thingsboard/flowmeterskid_tb_v0.cfg diff --git a/Pub_Sub/flowmeterskid/thingsboard/v1/flowmeterskid_tb_v1.cfg b/Pub_Sub/flowmeterskid/thingsboard/flowmeterskid_tb_v1.cfg similarity index 100% rename from Pub_Sub/flowmeterskid/thingsboard/v1/flowmeterskid_tb_v1.cfg rename to Pub_Sub/flowmeterskid/thingsboard/flowmeterskid_tb_v1.cfg diff --git a/Pub_Sub/flowmeterskid/thingsboard/v2/flowmeterskid_tb_v2.cfg b/Pub_Sub/flowmeterskid/thingsboard/flowmeterskid_tb_v2.cfg similarity index 100% rename from Pub_Sub/flowmeterskid/thingsboard/v2/flowmeterskid_tb_v2.cfg rename to Pub_Sub/flowmeterskid/thingsboard/flowmeterskid_tb_v2.cfg diff --git a/Pub_Sub/flowmeterskid/thingsboard/v2/pub/sendData.py b/Pub_Sub/flowmeterskid/thingsboard/pub/sendData.py similarity index 100% rename from Pub_Sub/flowmeterskid/thingsboard/v2/pub/sendData.py rename to Pub_Sub/flowmeterskid/thingsboard/pub/sendData.py diff --git a/Pub_Sub/flowmeterskid/thingsboard/v1/sub/receiveCommand.py b/Pub_Sub/flowmeterskid/thingsboard/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/flowmeterskid/thingsboard/v1/sub/receiveCommand.py rename to Pub_Sub/flowmeterskid/thingsboard/sub/receiveCommand.py diff --git a/Pub_Sub/flowmeterskid/thingsboard/v1/pub/sendData.py b/Pub_Sub/flowmeterskid/thingsboard/v1/pub/sendData.py deleted file mode 100644 index f573a3a..0000000 --- a/Pub_Sub/flowmeterskid/thingsboard/v1/pub/sendData.py +++ /dev/null @@ -1,298 +0,0 @@ -import json, os -from datetime import datetime as dt -from common.Logger import logger -from quickfaas.remotebus import publish -from mobiuspi_lib.gps import GPS -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" - try: - if not os.path.exists(path): - logger.debug("no folder making files folder in var/user") - os.makedirs(path) - with open(path + "/" + filename, "a") as f: - json.dump({}, f) - except Exception as e: - logger.error(f"Something went wrong in checkFileExist while making folder: {e}") - - try: - if not os.path.exists(path + "/" + filename): - logger.debug("no creds file making creds file") - with open(path + "/" + filename, "a") as f: - json.dump({}, f) - except Exception as e: - logger.error(f"Something went wrong in checkFileExist wihle making file: {e}") - -def convertDStoJSON(ds): - j = dict() - try: - for x in ds: - j[x["key"]] = x["value"] - except Exception as e: - logger.error(f"Something went wrong in convertDStoJSON: {e}") - return j - -def convertJSONtoDS(j): - d = [] - try: - for key in j.keys(): - d.append({"key": key, "value": j[key]}) - except Exception as e: - logger.error(f"Something went wrong in convertJSONtoDS: {e}") - 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: - try: - 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": - try: - checkFileExist("creds.json") - except Exception as e: - logger.error(f"Error in checkFileExist: {e}") - with open(credspath, "r") as c: - try: - 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() - except Exception as e: - logger.error(f"Error trying to load credentials from file: {e}") - 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) - except Exception as e: - logger.error(f"Somethign went wrong in checkCredentialConfig: {e}") - -def checkParameterConfig(cfg): - try: - 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 - except Exception as e: - logger.error(f"Something went wrong in checkParameterConfig: {e}") - os.system(f'rm {paramspath}') - return cfg - -payload = {} - -def get_totalizers(): - 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, - "week": 0, - "month": 0, - "year": 0, - "lifetime": 0, - "dayHolding": 0, - "weekHolding": 0, - "monthHolding": 0, - "yearHolding": 0 - } - except: - totalizers = { - "day": 0, - "week": 0, - "month": 0, - "year": 0, - "lifetime": 0, - "dayHolding": 0, - "weekHolding": 0, - "monthHolding": 0, - "yearHolding": 0 - } - return totalizers - - - - -def sendData(message,wizard_api): - logger.debug(message) - checkCredentialConfig() - payload = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}} - resetPayload = {"ts": "", "values": {}} - for measure in message["values"]["flowmeter"].keys(): - try: - if measure in ["totalizer_1"]: - payload["values"]["day_volume"], dayReset = totalizeDay(message["values"]["flowmeter"][measure]["raw_data"]) - payload["values"]["week_volume"], weekReset = totalizeWeek(message["values"]["flowmeter"][measure]["raw_data"]) - payload["values"]["month_volume"], monthReset = totalizeMonth(message["values"]["flowmeter"][measure]["raw_data"]) - payload["values"]["year_volume"], yearReset = totalizeYear(message["values"]["flowmeter"][measure]["raw_data"]) - payload["values"][measure] = message["values"]["flowmeter"][measure]["raw_data"] - except Exception as e: - logger.error(e) - try: - payload["values"]["latitude"], payload["values"]["longitude"], payload["values"]["speed"] = getGPS() - except: - logger.error("Could not get GPS coordinates") - publish(__topic__, json.dumps(payload), __qos__) - - if dayReset: - resetPayload["values"]["yesterday_volume"] = payload["values"]["day_volume"] - resetPayload["values"]["day_volume"] = 0 - if weekReset: - resetPayload["values"]["last_week_volume"] = payload["values"]["week_volume"] - resetPayload["values"]["week_volume"] = 0 - if monthReset: - resetPayload["values"]["last_month_volume"] = payload["values"]["month_volume"] - resetPayload["values"]["month_volume"] = 0 - if yearReset: - resetPayload["values"]["last_year_volume"] = payload["values"]["year_volume"] - resetPayload["values"]["year_volume"] = 0 - - if resetPayload["values"]: - resetPayload["ts"] = 1 + (round(dt.timestamp(dt.now())/600)*600)*1000 - publish(__topic__, json.dumps(resetPayload), __qos__) - -def saveTotalizers(totalizers): - try: - with open("/var/user/files/totalizers.json", "w") as t: - json.dump(totalizers,t) - except Exception as e: - logger.error(e) - -def getGPS(): - # Create a gps instance - gps = GPS() - - # Retrieve GPS information - position_status = gps.get_position_status() - logger.debug("position_status: ") - logger.debug(position_status) - latitude = position_status["latitude"].split(" ") - longitude = position_status["longitude"].split(" ") - lat_dec = int(latitude[0][:-1]) + (float(latitude[1][:-1])/60) - lon_dec = int(longitude[0][:-1]) + (float(longitude[1][:-1])/60) - if latitude[2] == "S": - lat_dec = lat_dec * -1 - if longitude[2] == "W": - lon_dec = lon_dec * -1 - #lat_dec = round(lat_dec, 7) - #lon_dec = round(lon_dec, 7) - logger.info("HERE IS THE GPS COORDS") - logger.info(f"LATITUDE: {lat_dec}, LONGITUDE: {lon_dec}") - speedKnots = position_status["speed"].split(" ") - speedMPH = float(speedKnots[0]) * 1.151 - return (f"{lat_dec:.8f}",f"{lon_dec:.8f}",f"{speedMPH:.2f}") - -def totalizeDay(lifetime): - totalizers = get_totalizers() - now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600) - 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(totalizers) - reset = True - return (value,reset) - -def totalizeWeek(lifetime): - totalizers = get_totalizers() - now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600) - reset = False - value = lifetime - totalizers["weekHolding"] - if not now.strftime("%U") == totalizers["week"] and now.strftime("%a") == "Sun": - totalizers["weekHolding"] = lifetime - totalizers["week"] = now.strftime("%U") - saveTotalizers(totalizers) - reset = True - return (value, reset) - -def totalizeMonth(lifetime): - totalizers = get_totalizers() - now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600) - reset = False - value = lifetime - totalizers["monthHolding"] - if not int(now.strftime("%m")) == int(totalizers["month"]): - totalizers["monthHolding"] = lifetime - totalizers["month"] = now.strftime("%m") - saveTotalizers(totalizers) - reset = True - return (value,reset) - -def totalizeYear(lifetime): - totalizers = get_totalizers() - now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600) - reset = False - value = lifetime - totalizers["yearHolding"] - if not int(now.strftime("%Y")) == int(totalizers["year"]): - totalizers["yearHolding"] = lifetime - totalizers["year"] = now.strftime("%Y") - saveTotalizers(totalizers) - reset = True - return (value, reset) \ No newline at end of file diff --git a/Pub_Sub/flowmeterskid/thingsboard/v2/sub/receiveCommand.py b/Pub_Sub/flowmeterskid/thingsboard/v2/sub/receiveCommand.py deleted file mode 100644 index 73ff77f..0000000 --- a/Pub_Sub/flowmeterskid/thingsboard/v2/sub/receiveCommand.py +++ /dev/null @@ -1,97 +0,0 @@ -import json -from datetime import datetime as dt -from common.Logger import logger -from quickfaas.measure import write -from quickfaas.remotebus import publish - - -def get_totalizers(): - 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, - "week": 0, - "month": 0, - "year": 0, - "lifetime": 0, - "dayHolding": 0, - "weekHolding": 0, - "monthHolding": 0, - "yearHolding": 0 - } - except: - totalizers = { - "day": 0, - "week": 0, - "month": 0, - "year": 0, - "lifetime": 0, - "dayHolding": 0, - "weekHolding": 0, - "monthHolding": 0, - "yearHolding": 0 - } - return totalizers - -def saveTotalizers(totalizers): - try: - with open("/var/user/files/totalizers.json", "w") as t: - json.dump(totalizers,t) - except Exception as e: - logger.error(e) - -def resetTotalizers(): - try: - totalizers = get_totalizers() - - totalizers["dayHolding"] = 0 - totalizers["weekHolding"] = 0 - totalizers["monthHolding"] = 0 - totalizers["yearHolding"] = 0 - saveTotalizers(totalizers) - return True - except Exception as e: - logger.error(e) - return e - -def receiveCommand(topic, payload): - logger.debug(topic) - logger.debug(json.loads(payload)) - p = json.loads(payload) - command = p["method"] - if command == "resetTotalizers": - r = resetTotalizers() - - if r == True: - message = [{"name": "flowmeter", "measures":[{"name":"reset_totalizers", "value": 1}]}] - try: - resp = write(message) - payload = { - "ts": (round(dt.timestamp(dt.now())/600)*600)*1000, - "values": { - "day_volume": 0, - "yesterday_volume": 0, - "week_volume": 0, - "last_week_volume": 0, - "month_volume": 0, - "last_month_volume": 0, - "year_volume": 0, - "last_year_volume": 0 - } - } - publish("v1/devices/me/telemetry",json.dumps(payload)) - except Exception as e: - logger.error("Failed to write message") - logger.error(e) - - ack(topic.split("/")[-1], r) - -def ack(msgid, r): - #logger.debug(msgid) - #logger.debug(mac) - #logger.debug(name) - #logger.debug(value) - publish("v1/devices/me/rpc/response/" + str(msgid), json.dumps({"msg": {"time": (round(dt.timestamp(dt.now())/600)*600)*1000, "response": r}, "metadata": "", "msgType": ""})) \ No newline at end of file diff --git a/Pub_Sub/gateway/thingsboard/v1/gateway_tb_v1.cfg b/Pub_Sub/gateway/thingsboard/gateway_tb_v1.cfg similarity index 100% rename from Pub_Sub/gateway/thingsboard/v1/gateway_tb_v1.cfg rename to Pub_Sub/gateway/thingsboard/gateway_tb_v1.cfg diff --git a/Pub_Sub/gateway/thingsboard/v1/pub/sendData.py b/Pub_Sub/gateway/thingsboard/pub/sendData.py similarity index 76% rename from Pub_Sub/gateway/thingsboard/v1/pub/sendData.py rename to Pub_Sub/gateway/thingsboard/pub/sendData.py index 49eccd6..5150983 100644 --- a/Pub_Sub/gateway/thingsboard/v1/pub/sendData.py +++ b/Pub_Sub/gateway/thingsboard/pub/sendData.py @@ -4,6 +4,18 @@ from datetime import datetime as dt from common.Logger import logger from quickfaas.remotebus import publish +def chunk_payload(payload, chunk_size=20): + for controller, data in payload.items(): + for entry in data: + ts = entry['ts'] + values = entry['values'] + chunked_values = list(values.items()) + for i in range(0, len(chunked_values), chunk_size): + yield { + "controller": controller, + "ts": ts, + "values": dict(chunked_values[i:i + chunk_size]) + } def sendData(message): #logger.debug(message) diff --git a/Pub_Sub/hrbooster/thingsboard/v1/hrbooster_tb_v1.cfg b/Pub_Sub/hrbooster/thingsboard/hrbooster_tb_v1.cfg similarity index 100% rename from Pub_Sub/hrbooster/thingsboard/v1/hrbooster_tb_v1.cfg rename to Pub_Sub/hrbooster/thingsboard/hrbooster_tb_v1.cfg diff --git a/Pub_Sub/hrbooster/thingsboard/v1/hrbooster.csv b/Pub_Sub/hrbooster/thingsboard/v1/hrbooster.csv deleted file mode 100644 index b4ebf6e..0000000 --- a/Pub_Sub/hrbooster/thingsboard/v1/hrbooster.csv +++ /dev/null @@ -1,16 +0,0 @@ -MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,bitMap,msecSample -suction,hrbooster,default,periodic,FLOAT,AIn_SuctionPressure.Val,2,,ro,,,none,,,,,,,,,, -discharge,hrbooster,default,periodic,FLOAT,AIn_DischargePressure.Val,2,,ro,,,none,,,,,,,,,, -flowrate,hrbooster,default,periodic,FLOAT,Flow_Rate_MBS,2,,ro,,,none,,,,,,,,,, -today_total,hrbooster,default,periodic,FLOAT,Today_Totalizer.Total,2,,ro,,,none,,,,,,,,,, -month_total,hrbooster,default,periodic,FLOAT,Month_Totalizer.Total,2,,ro,,,none,,,,,,,,,, -output_current,hrbooster,default,periodic,FLOAT,VFD_OutCurrent,2,,ro,,,none,,,,,,,,,, -speed_feedback,hrbooster,default,periodic,FLOAT,VFD_SpeedFdbk,2,,ro,,,none,,,,,,,,,, -running_status,hrbooster,default,periodic,BIT,VFD_753:I.DriveStatus_Running,,,ro,,,none,,,,,,,,,0, -suction_alm,hrbooster,default,periodic,BIT,alarm_SuctionPressure,,,ro,,,none,,,,,,,,,0, -discharge_alm,hrbooster,default,periodic,BIT,alarm_DischargePressure,,,ro,,,none,,,,,,,,,0, -vfd_alm,hrbooster,default,periodic,BIT,alarm_VFD,,,ro,,,none,,,,,,,,,0, -dc_alm,hrbooster,default,periodic,BIT,DC_Alarm,,,ro,,,none,,,,,,,,,0, -ups_alm,hrbooster,default,periodic,BIT,UPS_Alarm,,,ro,,,none,,,,,,,,,0, -ac_alm,hrbooster,default,periodic,BIT,AC_Power_Fail,,,ro,,,none,,,,,,,,,0, -plc_io_alm,hrbooster,default,periodic,BIT,ControllerFault_IO,,,ro,,,none,,,,,,,,,0, \ No newline at end of file diff --git a/Pub_Sub/hrbooster/thingsboard/v1/hrbooster.numbers b/Pub_Sub/hrbooster/thingsboard/v1/hrbooster.numbers deleted file mode 100755 index 240d7cf..0000000 Binary files a/Pub_Sub/hrbooster/thingsboard/v1/hrbooster.numbers and /dev/null differ diff --git a/Pub_Sub/hrbooster/thingsboard/v1/hrbooster2.csv b/Pub_Sub/hrbooster/thingsboard/v1/hrbooster2.csv deleted file mode 100644 index fb02e69..0000000 --- a/Pub_Sub/hrbooster/thingsboard/v1/hrbooster2.csv +++ /dev/null @@ -1,16 +0,0 @@ -MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Address,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,bitMap,msecSample -suction,hrbooster,default,periodic,FLOAT,AIn_SuctionPressureVal,2,1,ro,,,none,,,,,,,,,, -discharge,hrbooster,default,periodic,FLOAT,AIn_DischargePressureVal,2,1,ro,,,none,,,,,,,,,, -flowrate,hrbooster,default,periodic,FLOAT,Flow_Rate_MBS,2,1,ro,,,none,,,,,,,,,, -today_total,hrbooster,default,periodic,FLOAT,Today_Totalizer,2,1,ro,,,none,,,,,,,,,, -month_total,hrbooster,default,periodic,FLOAT,Month_Totalizer,2,1,ro,,,none,,,,,,,,,, -output_current,hrbooster,default,periodic,FLOAT,VFD_OutCurrent,2,1,ro,,,none,,,,,,,,,, -speed_feedback,hrbooster,default,periodic,FLOAT,VFD_SpeedFdbk,2,1,ro,,,none,,,,,,,,,, -running_status,hrbooster,default,periodic,BIT,VFD_753IDriveStatus_Running,2,1,ro,,,none,,,,,,,,,, -suction_alm,hrbooster,default,periodic,BIT,alarm_SuctionPressure,2,1,ro,,,none,,,,,,,,,, -discharge_alm,hrbooster,default,periodic,BIT,alarm_DischargePressure,2,1,ro,,,none,,,,,,,,,, -vfd_alm,hrbooster,default,periodic,BIT,alarm_VFD,2,1,ro,,,none,,,,,,,,,, -dc_alm,hrbooster,default,periodic,BIT,DC_Alarm,2,1,ro,,,none,,,,,,,,,, -ups_alm,hrbooster,default,periodic,BIT,UPS_Alarm,2,1,ro,,,none,,,,,,,,,, -ac_alm,hrbooster,default,periodic,BIT,AC_Power_Fail,2,1,ro,,,none,,,,,,,,,, -plc_io_alm,hrbooster,default,periodic,BIT,ControllerFault_IO,2,1,ro,,,none,,,,,,,,,, \ No newline at end of file diff --git a/Pub_Sub/hrbooster/thingsboard/v1/hrboosterAlarms.csv b/Pub_Sub/hrbooster/thingsboard/v1/hrboosterAlarms.csv deleted file mode 100644 index 3ac4678..0000000 --- a/Pub_Sub/hrbooster/thingsboard/v1/hrboosterAlarms.csv +++ /dev/null @@ -1,8 +0,0 @@ -AlarmName,ControllerName,MeasuringPointName,AlarmLevel,Condition1,Operand1,CombineMethod,Condition2,Operand2,AlarmContent -suction_alm,hrbooster,suction_alm,5,eq,1.0,none,eq,,Suction Pressure Alarm -discharge_alm,hrbooster,discharge_alm,5,eq,1.0,none,eq,,Discharge Pressure Alarm -vfd_alm,hrbooster,vfd_alm,5,eq,1.0,none,eq,,VFD has Alarmed -dc_alm,hrbooster,dc_alm,5,eq,1.0,none,eq,,DC Power Failure -ups_alm,hrbooster,ups_alm,5,eq,1.0,none,eq,,UPS Alarm -ac_alm,hrbooster,ac_alm,5,eq,1.0,none,eq,,AC Power Failure -plc_io_alm,hrbooster,plc_io_alm,5,eq,1.0,none,eq,,Controller IO Failure \ No newline at end of file diff --git a/Pub_Sub/hrswd/thingsboard/v1/hrswd_tb_v1.cfg b/Pub_Sub/hrswd/thingsboard/hrswd_tb_v1.cfg similarity index 100% rename from Pub_Sub/hrswd/thingsboard/v1/hrswd_tb_v1.cfg rename to Pub_Sub/hrswd/thingsboard/hrswd_tb_v1.cfg diff --git a/Pub_Sub/hrswd/thingsboard/v1/pub/sendAlarms.py b/Pub_Sub/hrswd/thingsboard/pub/sendAlarms.py similarity index 100% rename from Pub_Sub/hrswd/thingsboard/v1/pub/sendAlarms.py rename to Pub_Sub/hrswd/thingsboard/pub/sendAlarms.py diff --git a/Pub_Sub/hrswd/thingsboard/v1/pub/sendData.py b/Pub_Sub/hrswd/thingsboard/pub/sendData.py similarity index 100% rename from Pub_Sub/hrswd/thingsboard/v1/pub/sendData.py rename to Pub_Sub/hrswd/thingsboard/pub/sendData.py diff --git a/Pub_Sub/hrswd/thingsboard/v1/sub/receiveCommand.py b/Pub_Sub/hrswd/thingsboard/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/hrswd/thingsboard/v1/sub/receiveCommand.py rename to Pub_Sub/hrswd/thingsboard/sub/receiveCommand.py diff --git a/Pub_Sub/hrswd/thingsboard/v1/hrswd.csv b/Pub_Sub/hrswd/thingsboard/v1/hrswd.csv deleted file mode 100644 index 76c0ccd..0000000 --- a/Pub_Sub/hrswd/thingsboard/v1/hrswd.csv +++ /dev/null @@ -1,76 +0,0 @@ -MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,bitMap,msecSample -plc_io_fault_alm,hrswd,default,periodic,BIT,IO_Fault_Alarm,,,ro,,,none,,,,,,,,,0, -plc_fault,hrswd,default,periodic,BIT,PLC_FAULT,,,ro,,,none,,,,,,,,,0, -plc_fault_code,hrswd,default,periodic,DINT,MAJOR_FAULT_CODE,,,ro,,,none,,,,,,,,,0, -analog_01_alm,hrswd,default,periodic,BIT,Fault_Analog_Mod_01,,,ro,,,none,,,,,,,,,0, -analog_02_alm,hrswd,default,periodic,BIT,Fault_Analog_Mod_02,,,ro,,,none,,,,,,,,,0, -analog_03_alm,hrswd,default,periodic,BIT,Fault_Analog_Mod_03,,,ro,,,none,,,,,,,,,0, -analog_04_alm,hrswd,default,periodic,BIT,Fault_Analog_Mod_04,,,ro,,,none,,,,,,,,,0, -digital_05_alm,hrswd,default,periodic,BIT,Fault_Digital_In_Mod_05,,,ro,,,none,,,,,,,,,0, -containment_high_alm,hrswd,default,periodic,BIT,Contain_Hi_Level.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -dc_power_alm,hrswd,default,periodic,BIT,UPS_DC_OK.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -esd_push_button,hrswd,default,periodic,BIT,ESD_Switch.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -water_run_tank,hrswd,default,periodic,DINT,WT_Selector,,,ro,,,none,,,,,,,,,, -water_01_level,hrswd,default,periodic,FLOAT,WT_1.Val,2,,ro,,,none,,,,,,,,,, -water_01_hihi_alm,hrswd,default,periodic,BIT,WT_1.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_01_hi_alm,hrswd,default,periodic,BIT,WT_1.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_01_tx_alm,hrswd,default,periodic,BIT,WT_1.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_01_hihi_spt,hrswd,default,periodic,FLOAT,WT_1.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_01_hi_spt,hrswd,default,periodic,FLOAT,WT_1.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_01_max_height,hrswd,default,periodic,FLOAT,WT_1.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -water_02_level,hrswd,default,periodic,FLOAT,WT_2.Val,2,,ro,,,none,,,,,,,,,, -water_02_hihi_alm,hrswd,default,periodic,BIT,WT_2.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_02_hi_alm,hrswd,default,periodic,BIT,WT_2.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_02_tx_alm,hrswd,default,periodic,BIT,WT_2.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_02_hihi_spt,hrswd,default,periodic,FLOAT,WT_2.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_02_hi_spt,hrswd,default,periodic,FLOAT,WT_2.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_02_max_height,hrswd,default,periodic,FLOAT,WT_2.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -water_03_level,hrswd,default,periodic,FLOAT,WT_3.Val,2,,ro,,,none,,,,,,,,,, -water_03_hihi_alm,hrswd,default,periodic,BIT,WT_3.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_03_hi_alm,hrswd,default,periodic,BIT,WT_3.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_03_tx_alm,hrswd,default,periodic,BIT,WT_3.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_03_hihi_spt,hrswd,default,periodic,FLOAT,WT_3.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_03_hi_spt,hrswd,default,periodic,FLOAT,WT_3.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_03_max_height,hrswd,default,periodic,FLOAT,WT_3.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -water_04_level,hrswd,default,periodic,FLOAT,WT_4.Val,2,,ro,,,none,,,,,,,,,, -water_04_hihi_alm,hrswd,default,periodic,BIT,WT_4.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_04_hi_alm,hrswd,default,periodic,BIT,WT_4.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_04_tx_alm,hrswd,default,periodic,BIT,WT_4.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_04_hihi_spt,hrswd,default,periodic,FLOAT,WT_4.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_04_hi_spt,hrswd,default,periodic,FLOAT,WT_4.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_04_max_height,hrswd,default,periodic,FLOAT,WT_4.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -oil_01_level,hrswd,default,periodic,FLOAT,OT_1.Val,2,,ro,,,none,,,,,,,,,, -oil_01_hihi_alm,hrswd,default,periodic,BIT,OT_1.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -oil_01_hi_alm,hrswd,default,periodic,BIT,OT_1.Alm_Hi,,,ro,,,none,,,,,,,,,0, -oil_01_tx_alm,hrswd,default,periodic,BIT,OT_1.Alm_Fail,,,ro,,,none,,,,,,,,,0, -oil_01_hihi_spt,hrswd,default,periodic,FLOAT,OT_1.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -oil_01_hi_spt,hrswd,default,periodic,FLOAT,OT_1.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -oil_01_max_height,hrswd,default,periodic,FLOAT,OT_1.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -pump_01_sts,hrswd,default,periodic,BIT,East_Pump_Motor_01.Sts_Running,,,ro,,,none,,,,,,,,,0, -pump_01_failed_alm,hrswd,default,periodic,BIT,East_Pump_Motor_01.Alm_FailToStart,,,ro,,,none,,,,,,,,,0, -pump_01_suction,hrswd,default,periodic,FLOAT,East_Pump_Suction_PSI.Val,2,,ro,,,none,,,,,,,,,, -pump_01_suction_hihi_alm,hrswd,default,periodic,BIT,East_Pump_Suction_PSI.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -pump_01_suction_lolo_alm,hrswd,default,periodic,BIT,East_Pump_Suction_PSI.Alm_LoLo,,,ro,,,none,,,,,,,,,0, -pump_01_discharge,hrswd,default,periodic,FLOAT,East_Pump_Discharge_PSI.Val,2,,ro,,,none,,,,,,,,,, -pump_01_discharge_hihi_alm,hrswd,default,periodic,BIT,East_Pump_Discharge_PSI.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -pump_01_discharge_lolo_alm,hrswd,default,periodic,BIT,East_Pump_Discharge_PSI.Alm_LoLo,,,ro,,,none,,,,,,,,,0, -pump_01_flow_rate,hrswd,default,periodic,FLOAT,East_Pump_Flow_Meter.Val,2,,ro,,,none,,,,,,,,,, -pump_01_flow_rate_hihi_alm,hrswd,default,periodic,BIT,East_Pump_Flow_Meter.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -pump_01_flow_rate_lolo_alm,hrswd,default,periodic,BIT,East_Pump_Flow_Meter.Alm_LoLo,,,ro,,,none,,,,,,,,,0, -pump_01_oil_level_alm,hrswd,default,periodic,BIT,East_Pump_Oil_Level_Switch.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -pump_01_vibration_alm,hrswd,default,periodic,BIT,East_Pump_Vib_Switch.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -pump_01_fault_alm,hrswd,default,periodic,BIT,East_Pump_Fault.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -pump_02_sts,hrswd,default,periodic,BIT,West_Pump_Motor_02.Sts_Running,,,ro,,,none,,,,,,,,,0, -pump_02_failed_alm,hrswd,default,periodic,BIT,West_Pump_Motor_02.Alm_FailToStart,,,ro,,,none,,,,,,,,,0, -pump_02_suction,hrswd,default,periodic,FLOAT,West_Pump_Suction_PSI.Val,2,,ro,,,none,,,,,,,,,, -pump_02_suction_hihi_alm,hrswd,default,periodic,BIT,West_Pump_Suction_PSI.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -pump_02_suction_lolo_alm,hrswd,default,periodic,BIT,West_Pump_Suction_PSI.Alm_LoLo,,,ro,,,none,,,,,,,,,0, -pump_02_discharge,hrswd,default,periodic,FLOAT,West_Pump_Discharge_PSI.Val,2,,ro,,,none,,,,,,,,,, -pump_02_discharge_hihi_alm,hrswd,default,periodic,BIT,West_Pump_Discharge_PSI.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -pump_02_discharge_lolo_alm,hrswd,default,periodic,BIT,West_Pump_Discharge_PSI.Alm_LoLo,,,ro,,,none,,,,,,,,,0, -pump_02_flow_rate,hrswd,default,periodic,FLOAT,West_Pump_Flow_Meter.Val,2,,ro,,,none,,,,,,,,,, -pump_02_flow_rate_hihi_alm,hrswd,default,periodic,BIT,West_Pump_Flow_Meter.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -pump_02_flow_rate_lolo_alm,hrswd,default,periodic,BIT,West_Pump_Flow_Meter.Alm_LoLo,,,ro,,,none,,,,,,,,,0, -pump_02_oil_level_alm,hrswd,default,periodic,BIT,West_Pump_Oil_Level_Switch.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -pump_02_vibration_alm,hrswd,default,periodic,BIT,West_Pump_Vib_Switch.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -pump_02_fault_alm,hrswd,default,periodic,BIT,West_Pump_Fault.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, \ No newline at end of file diff --git a/Pub_Sub/hrswd/thingsboard/v1/hrswd_alert.csv b/Pub_Sub/hrswd/thingsboard/v1/hrswd_alert.csv deleted file mode 100644 index a23e20a..0000000 --- a/Pub_Sub/hrswd/thingsboard/v1/hrswd_alert.csv +++ /dev/null @@ -1,46 +0,0 @@ -AlarmName,ControllerName,MeasuringPointName,AlarmLevel,Condition1,Operand1,CombineMethod,Condition2,Operand2,AlarmContent,AlarmTag -plc_io_fault_alm,hrswd,plc_io_fault_alm,5,eq,1.0,none,eq,,PLC IO has faulted,default -plc_fault,hrswd,plc_fault,5,eq,1.0,none,eq,,PLC has faulted,default -analog_01_alm,hrswd,analog_01_alm,5,eq,1.0,none,eq,,Analog Module 1 has faulted,default -analog_02_alm,hrswd,analog_02_alm,5,eq,1.0,none,eq,,Analog Module 2 has faulted,default -analog_03_alm,hrswd,analog_03_alm,5,eq,1.0,none,eq,,Analog Module 3 has faulted,default -analog_04_alm,hrswd,analog_04_alm,5,eq,1.0,none,eq,,Analog Module 4 has faulted,default -digital_05_alm,hrswd,digital_05_alm,5,eq,1.0,none,eq,,Analog Module 5 has faulted,default -containment_high_alm,hrswd,containment_high_alm,5,eq,1.0,none,eq,,Containment Level has crossed the Hi threshold.,default -dc_power_alm,hrswd,dc_power_alm,5,eq,1.0,none,eq,,DC Power Fault,default -esd_push_button,hrswd,esd_push_button,5,eq,1.0,none,eq,,ESD Button Pressed,default -water_01_hihi_alm,hrswd,water_01_hihi_alm,5,eq,1.0,none,eq,,Water Tank 1 crossed HiHi threshold,default -water_01_hi_alm,hrswd,water_01_hi_alm,5,eq,1.0,none,eq,,Water Tank 1 crossed Hi threshold,default -water_01_tx_alm,hrswd,water_01_tx_alm,5,eq,1.0,none,eq,,Water Tank 1 transmission error,default -water_02_hihi_alm,hrswd,water_02_hihi_alm,5,eq,1.0,none,eq,,Water Tank 2 crossed HiHi threshold,default -water_02_hi_alm,hrswd,water_02_hi_alm,5,eq,1.0,none,eq,,Water Tank 2 crossed Hi threshold,default -water_02_tx_alm,hrswd,water_02_tx_alm,5,eq,1.0,none,eq,,Water Tank 2 transmission error,default -water_03_hihi_alm,hrswd,water_03_hihi_alm,5,eq,1.0,none,eq,,Water Tank 3 crossed HiHi threshold,default -water_03_hi_alm,hrswd,water_03_hi_alm,5,eq,1.0,none,eq,,Water Tank 3 crossed Hi threshold,default -water_03_tx_alm,hrswd,water_03_tx_alm,5,eq,1.0,none,eq,,Water Tank 3 transmission error,default -water_04_hihi_alm,hrswd,water_04_hihi_alm,5,eq,1.0,none,eq,,Water Tank 4 crossed HiHi threshold,default -water_04_hi_alm,hrswd,water_04_hi_alm,5,eq,1.0,none,eq,,Water Tank 4 crossed Hi threshold,default -water_04_tx_alm,hrswd,water_04_tx_alm,5,eq,1.0,none,eq,,Water Tank 4 transmission error,default -oil_01_hihi_alm,hrswd,oil_01_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 1 crossed HiHi threshold,default -oil_01_hi_alm,hrswd,oil_01_hi_alm,5,eq,1.0,none,eq,,Oil Tank 1 crossed Hi threshold,default -oil_01_tx_alm,hrswd,oil_01_tx_alm,5,eq,1.0,none,eq,,Oil Tank 1 transmission error,default -pump_01_failed_alm,hrswd,pump_01_failed_alm,5,eq,1.0,none,eq,,Pump 1 failed to start,default -pump_01_suction_hihi_alm,hrswd,pump_01_suction_hihi_alm,5,eq,1.0,none,eq,,Pump 1 crossed suction HiHi threshold,default -pump_01_suction_lolo_alm,hrswd,pump_01_suction_lolo_alm,5,eq,1.0,none,eq,,Pump 1 crossed suction LoLo threshold,default -pump_01_discharge_hihi_alm,hrswd,pump_01_discharge_hihi_alm,5,eq,1.0,none,eq,,Pump 1 crossed discharge HiHi threshold,default -pump_01_discharge_lolo_alm,hrswd,pump_01_discharge_lolo_alm,5,eq,1.0,none,eq,,Pump 1 crossed discharge LoLo threshold,default -pump_01_flow_rate_hihi_alm,hrswd,pump_01_flow_rate_hihi_alm,5,eq,1.0,none,eq,,Pump 1 crossed flow rate HiHi threshold,default -pump_01_flow_rate_lolo_alm,hrswd,pump_01_flow_rate_lolo_alm,5,eq,1.0,none,eq,,Pump 1 crossed flow rate LoLo threshold,default -pump_01_oil_level_alm,hrswd,pump_01_oil_level_alm,5,eq,1.0,none,eq,,Pump 1 oil level triggered,default -pump_01_vibration_alm,hrswd,pump_01_vibration_alm,5,eq,1.0,none,eq,,Pump 1 vibration triggered,default -pump_01_fault_alm,hrswd,pump_01_fault_alm,5,eq,1.0,none,eq,,Pump 1 faulted,default -pump_02_failed_alm,hrswd,pump_02_failed_alm,5,eq,1.0,none,eq,,Pump 2 failed to start,default -pump_02_suction_hihi_alm,hrswd,pump_02_suction_hihi_alm,5,eq,1.0,none,eq,,Pump 2 crossed suction HiHi threshold,default -pump_02_suction_lolo_alm,hrswd,pump_02_suction_lolo_alm,5,eq,1.0,none,eq,,Pump 2 crossed suction LoLo threshold,default -pump_02_discharge_hihi_alm,hrswd,pump_02_discharge_hihi_alm,5,eq,1.0,none,eq,,Pump 2 crossed discharge HiHi threshold,default -pump_02_discharge_lolo_alm,hrswd,pump_02_discharge_lolo_alm,5,eq,1.0,none,eq,,Pump 2 crossed discharge LoLo threshold,default -pump_02_flow_rate_hihi_alm,hrswd,pump_02_flow_rate_hihi_alm,5,eq,1.0,none,eq,,Pump 2 crossed flow rate HiHi threshold,default -pump_02_flow_rate_lolo_alm,hrswd,pump_02_flow_rate_lolo_alm,5,eq,1.0,none,eq,,Pump 2 crossed flow rate LoLo threshold,default -pump_02_oil_level_alm,hrswd,pump_02_oil_level_alm,5,eq,1.0,none,eq,,Pump 2 oil level triggered,default -pump_02_vibration_alm,hrswd,pump_02_vibration_alm,5,eq,1.0,none,eq,,Pump 2 vibration triggered,default -pump_02_fault_alm,hrswd,pump_02_fault_alm,5,eq,1.0,none,eq,,Pump 2 faulted,default \ No newline at end of file diff --git a/Pub_Sub/hrtankbattery/thingsboard/v1/hrtankbattery_tb_v1.cfg b/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v1.cfg similarity index 100% rename from Pub_Sub/hrtankbattery/thingsboard/v1/hrtankbattery_tb_v1.cfg rename to Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v1.cfg diff --git a/Pub_Sub/hrtankbattery/thingsboard/v2/hrtankbattery_tb_v2.cfg b/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v2.cfg similarity index 100% rename from Pub_Sub/hrtankbattery/thingsboard/v2/hrtankbattery_tb_v2.cfg rename to Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v2.cfg diff --git a/Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3.cfg b/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v3.cfg similarity index 100% rename from Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3.cfg rename to Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v3.cfg diff --git a/Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3_emma.cfg b/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v3_emma.cfg similarity index 100% rename from Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3_emma.cfg rename to Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v3_emma.cfg diff --git a/Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3_lisa.cfg b/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v3_lisa.cfg similarity index 100% rename from Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3_lisa.cfg rename to Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v3_lisa.cfg diff --git a/Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3_noel.cfg b/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v3_noel.cfg similarity index 100% rename from Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3_noel.cfg rename to Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v3_noel.cfg diff --git a/Pub_Sub/hrtankbattery/thingsboard/v1/pub/sendAlarms.py b/Pub_Sub/hrtankbattery/thingsboard/pub/sendAlarms.py similarity index 100% rename from Pub_Sub/hrtankbattery/thingsboard/v1/pub/sendAlarms.py rename to Pub_Sub/hrtankbattery/thingsboard/pub/sendAlarms.py diff --git a/Pub_Sub/hrtankbattery/thingsboard/v2/pub/sendData.py b/Pub_Sub/hrtankbattery/thingsboard/pub/sendData.py similarity index 100% rename from Pub_Sub/hrtankbattery/thingsboard/v2/pub/sendData.py rename to Pub_Sub/hrtankbattery/thingsboard/pub/sendData.py diff --git a/Pub_Sub/hrtankbattery/thingsboard/v3/pub/sendDataNoel.py b/Pub_Sub/hrtankbattery/thingsboard/pub/sendDataNoel.py similarity index 100% rename from Pub_Sub/hrtankbattery/thingsboard/v3/pub/sendDataNoel.py rename to Pub_Sub/hrtankbattery/thingsboard/pub/sendDataNoel.py diff --git a/Pub_Sub/hrtankbattery/thingsboard/v1/sub/receiveCommand.py b/Pub_Sub/hrtankbattery/thingsboard/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/hrtankbattery/thingsboard/v1/sub/receiveCommand.py rename to Pub_Sub/hrtankbattery/thingsboard/sub/receiveCommand.py diff --git a/Pub_Sub/hrtankbattery/thingsboard/v1/pub/sendData.py b/Pub_Sub/hrtankbattery/thingsboard/v1/pub/sendData.py deleted file mode 100644 index 18542ea..0000000 --- a/Pub_Sub/hrtankbattery/thingsboard/v1/pub/sendData.py +++ /dev/null @@ -1,135 +0,0 @@ -# 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(): - #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 - -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) - 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__) - diff --git a/Pub_Sub/hrtankbattery/thingsboard/v2/pub/sendAlarms.py b/Pub_Sub/hrtankbattery/thingsboard/v2/pub/sendAlarms.py deleted file mode 100644 index 58497ef..0000000 --- a/Pub_Sub/hrtankbattery/thingsboard/v2/pub/sendAlarms.py +++ /dev/null @@ -1,12 +0,0 @@ -# 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__) \ No newline at end of file diff --git a/Pub_Sub/hrtankbattery/thingsboard/v2/sub/receiveCommand.py b/Pub_Sub/hrtankbattery/thingsboard/v2/sub/receiveCommand.py deleted file mode 100644 index 3b7993b..0000000 --- a/Pub_Sub/hrtankbattery/thingsboard/v2/sub/receiveCommand.py +++ /dev/null @@ -1,66 +0,0 @@ -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": , "value": } - 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) - diff --git a/Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3_noel.csv b/Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3_noel.csv deleted file mode 100644 index 3f70500..0000000 --- a/Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3_noel.csv +++ /dev/null @@ -1,306 +0,0 @@ -MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,bitMap,msecSample -plc_io_fault_alm,hrtankbattery,default,periodic,BIT,IO_Fault_Alarm,,,ro,,,none,,,,,,,,,0, -plc_fault,hrtankbattery,default,periodic,BIT,PLC_FAULT,,,ro,,,none,,,,,,,,,0, -analog_01_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_01,,,ro,,,none,,,,,,,,,0, -analog_02_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_02,,,ro,,,none,,,,,,,,,0, -analog_03_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_03,,,ro,,,none,,,,,,,,,0, -analog_04_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_04,,,ro,,,none,,,,,,,,,0, -analog_05_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_05,,,ro,,,none,,,,,,,,,0, -analog_06_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_06,,,ro,,,none,,,,,,,,,0, -ac_power_alm,hrtankbattery,default,periodic,BIT,Alm_AC_Pwr.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -ups_alm,hrtankbattery,default,periodic,BIT,Alm_UPS.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -dc_power_alm,hrtankbattery,default,periodic,BIT,DC_Power_OK.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -three_phase_pwr_alm,hrtankbattery,default,periodic,BIT,Three_Phase_Power_Alarm.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -count_oil_tanks,hrtankbattery,default,periodic,DINT,NUMBER_OF_OIL_TANKS,,,ro,,,none,,,,,,,,,, -count_water_tanks,hrtankbattery,default,periodic,DINT,NUMBER_OF_WTR_TANKS,,,ro,,,none,,,,,,,,,, -count_flow_meters,hrtankbattery,default,periodic,DINT,NUMBER_OF_FLOWMETERS,,,ro,,,none,,,,,,,,,, -count_transfer_pumps,hrtankbattery,default,periodic,DINT,NUMBER_OF_TRANSFER_PUMPS,,,ro,,,none,,,,,,,,,, -count_lacts,hrtankbattery,default,periodic,DINT,NUMBER_OF_LACTS,,,ro,,,none,,,,,,,,,, -water_run_tank,hrtankbattery,default,periodic,DINT,WT_Selector,,,ro,,,none,,,,,,,,,, -water_01_level,hrtankbattery,default,periodic,FLOAT,WT_1.Val,2,,ro,,,none,,,,,,,,,, -water_run_tank_volume,hrtankbattery,default,periodic,FLOAT,Curent_Water_Tank_Volume,2,,ro,,,none,,,,,,,,,, -water_gauge_off_volume,hrtankbattery,default,periodic,FLOAT,Gauge_Off_Water_Tank_Volume,2,,ro,,,none,,,,,,,,,, -water_01_hihi_alm,hrtankbattery,default,periodic,BIT,WT_1.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_01_hi_alm,hrtankbattery,default,periodic,BIT,WT_1.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_01_tx_alm,hrtankbattery,default,periodic,BIT,WT_1.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_01_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_1.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_01_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_1.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_01_max_height,hrtankbattery,default,periodic,FLOAT,WT_1.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -water_02_level,hrtankbattery,default,periodic,FLOAT,WT_2.Val,2,,ro,,,none,,,,,,,,,, -water_02_hihi_alm,hrtankbattery,default,periodic,BIT,WT_2.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_02_hi_alm,hrtankbattery,default,periodic,BIT,WT_2.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_02_tx_alm,hrtankbattery,default,periodic,BIT,WT_2.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_02_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_2.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_02_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_2.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_02_max_height,hrtankbattery,default,periodic,FLOAT,WT_2.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -water_03_level,hrtankbattery,default,periodic,FLOAT,WT_3.Val,2,,ro,,,none,,,,,,,,,, -water_03_hihi_alm,hrtankbattery,default,periodic,BIT,WT_3.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_03_hi_alm,hrtankbattery,default,periodic,BIT,WT_3.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_03_tx_alm,hrtankbattery,default,periodic,BIT,WT_3.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_03_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_3.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_03_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_3.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_03_max_height,hrtankbattery,default,periodic,FLOAT,WT_3.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -water_04_level,hrtankbattery,default,periodic,FLOAT,WT_4.Val,2,,ro,,,none,,,,,,,,,, -water_04_hihi_alm,hrtankbattery,default,periodic,BIT,WT_4.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_04_hi_alm,hrtankbattery,default,periodic,BIT,WT_4.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_04_tx_alm,hrtankbattery,default,periodic,BIT,WT_4.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_04_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_4.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_04_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_4.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_04_max_height,hrtankbattery,default,periodic,FLOAT,WT_4.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -water_05_level,hrtankbattery,default,periodic,FLOAT,WT_5.Val,2,,ro,,,none,,,,,,,,,, -water_05_hihi_alm,hrtankbattery,default,periodic,BIT,WT_5.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_05_hi_alm,hrtankbattery,default,periodic,BIT,WT_5.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_05_tx_alm,hrtankbattery,default,periodic,BIT,WT_5.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_05_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_5.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_05_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_5.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_05_max_height,hrtankbattery,default,periodic,FLOAT,WT_5.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -water_06_level,hrtankbattery,default,periodic,FLOAT,WT_6.Val,2,,ro,,,none,,,,,,,,,, -water_06_hihi_alm,hrtankbattery,default,periodic,BIT,WT_6.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_06_hi_alm,hrtankbattery,default,periodic,BIT,WT_6.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_06_tx_alm,hrtankbattery,default,periodic,BIT,WT_6.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_06_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_6.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_06_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_6.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_06_max_height,hrtankbattery,default,periodic,FLOAT,WT_6.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -water_07_level,hrtankbattery,default,periodic,FLOAT,WT_7.Val,2,,ro,,,none,,,,,,,,,, -water_07_hihi_alm,hrtankbattery,default,periodic,BIT,WT_7.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_07_hi_alm,hrtankbattery,default,periodic,BIT,WT_7.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_07_tx_alm,hrtankbattery,default,periodic,BIT,WT_7.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_07_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_7.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_07_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_7.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_07_max_height,hrtankbattery,default,periodic,FLOAT,WT_7.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -water_08_level,hrtankbattery,default,periodic,FLOAT,WT_8.Val,2,,ro,,,none,,,,,,,,,, -water_08_hihi_alm,hrtankbattery,default,periodic,BIT,WT_8.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_08_hi_alm,hrtankbattery,default,periodic,BIT,WT_8.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_08_tx_alm,hrtankbattery,default,periodic,BIT,WT_8.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_08_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_8.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_08_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_8.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_08_max_height,hrtankbattery,default,periodic,FLOAT,WT_8.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -water_09_level,hrtankbattery,default,periodic,FLOAT,WT_9.Val,2,,ro,,,none,,,,,,,,,, -water_09_hihi_alm,hrtankbattery,default,periodic,BIT,WT_9.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -water_09_hi_alm,hrtankbattery,default,periodic,BIT,WT_9.Alm_Hi,,,ro,,,none,,,,,,,,,0, -water_09_tx_alm,hrtankbattery,default,periodic,BIT,WT_9.Alm_Fail,,,ro,,,none,,,,,,,,,0, -water_09_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_9.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -water_09_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_9.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -water_09_max_height,hrtankbattery,default,periodic,FLOAT,WT_9.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -oil_run_tank,hrtankbattery,default,periodic,DINT,OT_Selector,,,ro,,,none,,,,,,,,,, -oil_run_tank_volume,hrtankbattery,default,periodic,FLOAT,Current_Oil_Tank_Volume,2,,ro,,,none,,,,,,,,,, -oil_gauge_off_volume,hrtankbattery,default,periodic,FLOAT,Gauge_Off_Oil_Tank_Volume,2,,ro,,,none,,,,,,,,,, -oil_01_level,hrtankbattery,default,periodic,FLOAT,OT_1.Val,2,,ro,,,none,,,,,,,,,, -oil_01_hihi_alm,hrtankbattery,default,periodic,BIT,OT_1.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -oil_01_hi_alm,hrtankbattery,default,periodic,BIT,OT_1.Alm_Hi,,,ro,,,none,,,,,,,,,0, -oil_01_tx_alm,hrtankbattery,default,periodic,BIT,OT_1.Alm_Fail,,,ro,,,none,,,,,,,,,0, -oil_01_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_1.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -oil_01_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_1.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -oil_01_max_height,hrtankbattery,default,periodic,FLOAT,OT_1.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -oil_02_level,hrtankbattery,default,periodic,FLOAT,OT_2.Val,2,,ro,,,none,,,,,,,,,, -oil_02_hihi_alm,hrtankbattery,default,periodic,BIT,OT_2.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -oil_02_hi_alm,hrtankbattery,default,periodic,BIT,OT_2.Alm_Hi,,,ro,,,none,,,,,,,,,0, -oil_02_tx_alm,hrtankbattery,default,periodic,BIT,OT_2.Alm_Fail,,,ro,,,none,,,,,,,,,0, -oil_02_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_2.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -oil_02_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_2.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -oil_02_max_height,hrtankbattery,default,periodic,FLOAT,OT_2.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -oil_03_level,hrtankbattery,default,periodic,FLOAT,OT_3.Val,2,,ro,,,none,,,,,,,,,, -oil_03_hihi_alm,hrtankbattery,default,periodic,BIT,OT_3.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -oil_03_hi_alm,hrtankbattery,default,periodic,BIT,OT_3.Alm_Hi,,,ro,,,none,,,,,,,,,0, -oil_03_tx_alm,hrtankbattery,default,periodic,BIT,OT_3.Alm_Fail,,,ro,,,none,,,,,,,,,0, -oil_03_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_3.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -oil_03_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_3.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -oil_03_max_height,hrtankbattery,default,periodic,FLOAT,OT_3.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -oil_04_level,hrtankbattery,default,periodic,FLOAT,OT_4.Val,2,,ro,,,none,,,,,,,,,, -oil_04_hihi_alm,hrtankbattery,default,periodic,BIT,OT_4.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -oil_04_hi_alm,hrtankbattery,default,periodic,BIT,OT_4.Alm_Hi,,,ro,,,none,,,,,,,,,0, -oil_04_tx_alm,hrtankbattery,default,periodic,BIT,OT_4.Alm_Fail,,,ro,,,none,,,,,,,,,0, -oil_04_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_4.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -oil_04_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_4.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -oil_04_max_height,hrtankbattery,default,periodic,FLOAT,OT_4.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -oil_05_level,hrtankbattery,default,periodic,FLOAT,OT_5.Val,2,,ro,,,none,,,,,,,,,, -oil_05_hihi_alm,hrtankbattery,default,periodic,BIT,OT_5.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -oil_05_hi_alm,hrtankbattery,default,periodic,BIT,OT_5.Alm_Hi,,,ro,,,none,,,,,,,,,0, -oil_05_tx_alm,hrtankbattery,default,periodic,BIT,OT_5.Alm_Fail,,,ro,,,none,,,,,,,,,0, -oil_05_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_5.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -oil_05_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_5.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -oil_05_max_height,hrtankbattery,default,periodic,FLOAT,OT_5.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -oil_06_level,hrtankbattery,default,periodic,FLOAT,OT_6.Val,2,,ro,,,none,,,,,,,,,, -oil_06_hihi_alm,hrtankbattery,default,periodic,BIT,OT_6.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -oil_06_hi_alm,hrtankbattery,default,periodic,BIT,OT_6.Alm_Hi,,,ro,,,none,,,,,,,,,0, -oil_06_tx_alm,hrtankbattery,default,periodic,BIT,OT_6.Alm_Fail,,,ro,,,none,,,,,,,,,0, -oil_06_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_6.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -oil_06_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_6.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -oil_06_max_height,hrtankbattery,default,periodic,FLOAT,OT_6.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -oil_07_level,hrtankbattery,default,periodic,FLOAT,OT_7.Val,2,,ro,,,none,,,,,,,,,, -oil_07_hihi_alm,hrtankbattery,default,periodic,BIT,OT_7.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -oil_07_hi_alm,hrtankbattery,default,periodic,BIT,OT_7.Alm_Hi,,,ro,,,none,,,,,,,,,0, -oil_07_tx_alm,hrtankbattery,default,periodic,BIT,OT_7.Alm_Fail,,,ro,,,none,,,,,,,,,0, -oil_07_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_7.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, -oil_07_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_7.PSet_HiLim,2,,ro,,,none,,,,,,,,,, -oil_07_max_height,hrtankbattery,default,periodic,FLOAT,OT_7.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, -transfer_01_sts,hrtankbattery,default,periodic,BIT,XFER_PUMP_Motor_01.Sts_Running,,,ro,,,none,,,,,,,,,0, -transfer_01_alm,hrtankbattery,default,periodic,BIT,XFER_PUMP_Motor_01.Alm_FailToStart,,,ro,,,none,,,,,,,,,0, -transfer_01_discharge,hrtankbattery,default,periodic,FLOAT,XferPump_01_Dis_PSI.Val,2,,ro,,,none,,,,,,,,,, -transfer_01_discharge_hihi_alm,hrtankbattery,default,periodic,BIT,XferPump_01_Dis_PSI.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -transfer_01_discharge_lolo_alm,hrtankbattery,default,periodic,BIT,XferPump_01_Dis_PSI.Alm_LoLo,,,ro,,,none,,,,,,,,,0, -transfer_01_flow_rate,hrtankbattery,default,periodic,FLOAT,XferPump_01_FlowRate.Val,2,,ro,,,none,,,,,,,,,, -transfer_01_flow_rate_hihi_alm,hrtankbattery,default,periodic,BIT,XferPump_01_FlowRate.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -transfer_01_flow_rate_lolo_alm,hrtankbattery,default,periodic,BIT,XferPump_01_FlowRate.Alm_LoLo,,,ro,,,none,,,,,,,,,0, -transfer_01_3_phase_pwr_alm,hrtankbattery,default,periodic,BIT,Transfer_Pump_3_Phase_Power_Alarm.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -transfer_02_sts,hrtankbattery,default,periodic,BIT,XFER_PUMP_Motor_02.Sts_Running,,,ro,,,none,,,,,,,,,0, -transfer_02_alm,hrtankbattery,default,periodic,BIT,XFER_PUMP_Motor_02.Alm_FailToStart,,,ro,,,none,,,,,,,,,0, -transfer_02_discharge,hrtankbattery,default,periodic,FLOAT,XferPump_02_Dis_PSI.Val,2,,ro,,,none,,,,,,,,,, -transfer_02_discharge_hihi_alm,hrtankbattery,default,periodic,BIT,XferPump_02_Dis_PSI.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -transfer_02_discharge_lolo_alm,hrtankbattery,default,periodic,BIT,XferPump_02_Dis_PSI.Alm_LoLo,,,ro,,,none,,,,,,,,,0, -transfer_02_flow_rate,hrtankbattery,default,periodic,FLOAT,XferPump_02_FlowRate.Val,2,,ro,,,none,,,,,,,,,, -transfer_02_flow_rate_hihi_alm,hrtankbattery,default,periodic,BIT,XferPump_02_FlowRate.Alm_HiHi,,,ro,,,none,,,,,,,,,0, -transfer_02_flow_rate_lolo_alm,hrtankbattery,default,periodic,BIT,XferPump_02_FlowRate.Alm_LoLo,,,ro,,,none,,,,,,,,,0, -lact_01_permissive,hrtankbattery,default,periodic,BIT,LACT_01_Permissive,,,ro,,,none,,,,,,,,,0, -lact_01_sts,hrtankbattery,default,periodic,BIT,LACT_01_Run_Status,,,ro,,,none,,,,,,,,,0, -lact_01_alm,hrtankbattery,default,periodic,BIT,LACT_01_Failure,,,ro,,,none,,,,,,,,,0, -lact_01_oil_shutdown,hrtankbattery,default,periodic,BIT,LACT_01_Bad_Oil_Shutdown,,,ro,,,none,,,,,,,,,0, -lact_01_flow_rate,hrtankbattery,default,periodic,FLOAT,Lact_01_Realtime_Flow_Rate,2,,ro,,,none,,,,,,,,,, -lact_01_bs_w,hrtankbattery,default,periodic,FLOAT,Lact_01_BS_and_W_Reading,2,,ro,,,none,,,,,,,,,, -lact_01_daily_volume,hrtankbattery,default,periodic,FLOAT,Lact_01_Current_Daily_Ind_Volume_Total,2,,ro,,,none,,,,,,,,,, -lact_01_prev_day,hrtankbattery,default,periodic,FLOAT,Lact_01_History.Previous_Day_1,2,,ro,,,none,,,,,,,,,, -lact_01_lifetime,hrtankbattery,default,periodic,FLOAT,Lact_01_Cumulative_Ind_Volume,2,,ro,,,none,,,,,,,,,, -lact_02_permissive,hrtankbattery,default,periodic,BIT,LACT_02_Permissive,,,ro,,,none,,,,,,,,,0, -lact_02_sts,hrtankbattery,default,periodic,BIT,LACT_02_Run_Status,,,ro,,,none,,,,,,,,,0, -lact_02_alm,hrtankbattery,default,periodic,BIT,LACT_02_Failure,,,ro,,,none,,,,,,,,,0, -lact_02_oil_shutdown,hrtankbattery,default,periodic,BIT,LACT_02_Bad_Oil_Shutdown,,,ro,,,none,,,,,,,,,0, -lact_02_flow_rate,hrtankbattery,default,periodic,FLOAT,Lact_02_Realtime_Flow_Rate,2,,ro,,,none,,,,,,,,,, -lact_02_bs_w,hrtankbattery,default,periodic,FLOAT,Lact_02_BS_and_W_Reading,2,,ro,,,none,,,,,,,,,, -lact_02_daily_volume,hrtankbattery,default,periodic,FLOAT,Lact_02_Current_Daily_Ind_Volume_Total,2,,ro,,,none,,,,,,,,,, -lact_02_prev_day,hrtankbattery,default,periodic,FLOAT,Lact_02_History.Previous_Day_1,2,,ro,,,none,,,,,,,,,, -lact_02_lifetime,hrtankbattery,default,periodic,FLOAT,Lact_02_Cumulative_Ind_Volume,2,,ro,,,none,,,,,,,,,, -containment_high_alm,hrtankbattery,default,periodic,BIT,Contain_Hi_Level.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -h2s_alm,hrtankbattery,default,periodic,BIT,H2s_Alarm.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, -tf_sales_battery_voltage,hrtankbattery,default,periodic,FLOAT,Val_Sales_TF_Battery_Voltage,2,,ro,,,none,,,,,,,,,, -tf_sales_charger_voltage,hrtankbattery,default,periodic,FLOAT,Val_Sales_TF_Charger_Voltage,2,,ro,,,none,,,,,,,,,, -tf_sales_differential_pressure,hrtankbattery,default,periodic,FLOAT,Val_Sales_TF_Differential_Pressure,2,,ro,,,none,,,,,,,,,, -tf_sales_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Sales_TF_Flow_Rate,2,,ro,,,none,,,,,,,,,, -tf_sales_lifetime,hrtankbattery,default,periodic,FLOAT,Val_Sales_TF_Lifetime,2,,ro,,,none,,,,,,,,,, -tf_sales_static_pressure,hrtankbattery,default,periodic,FLOAT,Val_Sales_TF_Static_Pressure,2,,ro,,,none,,,,,,,,,, -tf_sales_temperature,hrtankbattery,default,periodic,FLOAT,Val_Sales_TF_Temperature,2,,ro,,,none,,,,,,,,,, -tf_sales_yesterday_total,hrtankbattery,default,periodic,FLOAT,Val_Sales_TF_Yesterday_Total,2,,ro,,,none,,,,,,,,,, -tf_v1_battery_voltage,hrtankbattery,default,periodic,FLOAT,Val_V1_TF_Battery_Voltage,2,,ro,,,none,,,,,,,,,, -tf_v1_charger_voltage,hrtankbattery,default,periodic,FLOAT,Val_V1_TF_Charger_Voltage,2,,ro,,,none,,,,,,,,,, -tf_v1_differential_pressure,hrtankbattery,default,periodic,FLOAT,Val_V1_TF_Differential_Pressure,2,,ro,,,none,,,,,,,,,, -tf_v1_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_V1_TF_Flow_Rate,2,,ro,,,none,,,,,,,,,, -tf_v1_lifetime,hrtankbattery,default,periodic,FLOAT,Val_V1_TF_Lifetime,2,,ro,,,none,,,,,,,,,, -tf_v1_static_pressure,hrtankbattery,default,periodic,FLOAT,Val_V1_TF_Static_Pressure,2,,ro,,,none,,,,,,,,,, -tf_v1_temperature,hrtankbattery,default,periodic,FLOAT,Val_V1_TF_Temperature,2,,ro,,,none,,,,,,,,,, -tf_v1_yesterday_total,hrtankbattery,default,periodic,FLOAT,Val_V1_TF_Yesterday_Total,2,,ro,,,none,,,,,,,,,, -tf_v2_battery_voltage,hrtankbattery,default,periodic,FLOAT,Val_V2_TF_Battery_Voltage,2,,ro,,,none,,,,,,,,,, -tf_v2_charger_voltage,hrtankbattery,default,periodic,FLOAT,Val_V2_TF_Charger_Voltage,2,,ro,,,none,,,,,,,,,, -tf_v2_differential_pressure,hrtankbattery,default,periodic,FLOAT,Val_V2_TF_Differential_Pressure,2,,ro,,,none,,,,,,,,,, -tf_v2_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_V2_TF_Flow_Rate,2,,ro,,,none,,,,,,,,,, -tf_v2_lifetime,hrtankbattery,default,periodic,FLOAT,Val_V2_TF_Lifetime,2,,ro,,,none,,,,,,,,,, -tf_v2_static_pressure,hrtankbattery,default,periodic,FLOAT,Val_V2_TF_Static_Pressure,2,,ro,,,none,,,,,,,,,, -tf_v2_temperature,hrtankbattery,default,periodic,FLOAT,Val_V2_TF_Temperature,2,,ro,,,none,,,,,,,,,, -tf_v2_yesterday_total,hrtankbattery,default,periodic,FLOAT,Val_V2_TF_Yesterday_Total,2,,ro,,,none,,,,,,,,,, -tf_v3_battery_voltage,hrtankbattery,default,periodic,FLOAT,Val_V3_TF_Battery_Voltage,2,,ro,,,none,,,,,,,,,, -tf_v3_charger_voltage,hrtankbattery,default,periodic,FLOAT,Val_V3_TF_Charger_Voltage,2,,ro,,,none,,,,,,,,,, -tf_v3_differential_pressure,hrtankbattery,default,periodic,FLOAT,Val_V3_TF_Differential_Pressure,2,,ro,,,none,,,,,,,,,, -tf_v3_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_V3_TF_Flow_Rate,2,,ro,,,none,,,,,,,,,, -tf_v3_lifetime,hrtankbattery,default,periodic,FLOAT,Val_V3_TF_Lifetime,2,,ro,,,none,,,,,,,,,, -tf_v3_static_pressure,hrtankbattery,default,periodic,FLOAT,Val_V3_TF_Static_Pressure,2,,ro,,,none,,,,,,,,,, -tf_v3_temperature,hrtankbattery,default,periodic,FLOAT,Val_V3_TF_Temperature,2,,ro,,,none,,,,,,,,,, -tf_v3_yesterday_total,hrtankbattery,default,periodic,FLOAT,Val_V3_TF_Yesterday_Total,2,,ro,,,none,,,,,,,,,, -tf_v4_battery_voltage,hrtankbattery,default,periodic,FLOAT,Val_V4_TF_Battery_Voltage,2,,ro,,,none,,,,,,,,,, -tf_v4_charger_voltage,hrtankbattery,default,periodic,FLOAT,Val_V4_TF_Charger_Voltage,2,,ro,,,none,,,,,,,,,, -tf_v4_differential_pressure,hrtankbattery,default,periodic,FLOAT,Val_V4_TF_Differential_Pressure,2,,ro,,,none,,,,,,,,,, -tf_v4_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_V4_TF_Flow_Rate,2,,ro,,,none,,,,,,,,,, -tf_v4_lifetime,hrtankbattery,default,periodic,FLOAT,Val_V4_TF_Lifetime,2,,ro,,,none,,,,,,,,,, -tf_v4_static_pressure,hrtankbattery,default,periodic,FLOAT,Val_V4_TF_Static_Pressure,2,,ro,,,none,,,,,,,,,, -tf_v4_temperature,hrtankbattery,default,periodic,FLOAT,Val_V4_TF_Temperature,2,,ro,,,none,,,,,,,,,, -tf_v4_yesterday_total,hrtankbattery,default,periodic,FLOAT,Val_V4_TF_Yesterday_Total,2,,ro,,,none,,,,,,,,,, -tf_v5_battery_voltage,hrtankbattery,default,periodic,FLOAT,Val_V5_TF_Battery_Voltage,2,,ro,,,none,,,,,,,,,, -tf_v5_charger_voltage,hrtankbattery,default,periodic,FLOAT,Val_V5_TF_Charger_Voltage,2,,ro,,,none,,,,,,,,,, -tf_v5_differential_pressure,hrtankbattery,default,periodic,FLOAT,Val_V5_TF_Differential_Pressure,2,,ro,,,none,,,,,,,,,, -tf_v5_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_V5_TF_Flow_Rate,2,,ro,,,none,,,,,,,,,, -tf_v5_lifetime,hrtankbattery,default,periodic,FLOAT,Val_V5_TF_Lifetime,2,,ro,,,none,,,,,,,,,, -tf_v5_static_pressure,hrtankbattery,default,periodic,FLOAT,Val_V5_TF_Static_Pressure,2,,ro,,,none,,,,,,,,,, -tf_v5_temperature,hrtankbattery,default,periodic,FLOAT,Val_V5_TF_Temperature,2,,ro,,,none,,,,,,,,,, -tf_v5_yesterday_total,hrtankbattery,default,periodic,FLOAT,Val_V5_TF_Yesterday_Total,2,,ro,,,none,,,,,,,,,, -vessel_1_gas_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Gas_FR,2,,ro,,,none,,,,,,,,,, -vessel_1_oil_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Oil_FR,2,,ro,,,none,,,,,,,,,, -vessel_1_oil_last_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_OIL_LastMonth_Accum,2,,ro,,,none,,,,,,,,,, -vessel_1_oil_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_OIL_Month_Accum,2,,ro,,,none,,,,,,,,,, -vessel_1_oil_lifetime,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Oil_T1,2,,ro,,,none,,,,,,,,,, -vessel_1_oil_temperature,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Oil_Temp,2,,ro,,,none,,,,,,,,,, -vessel_1_oil_today,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Oil_Todays_Accum,2,,ro,,,none,,,,,,,,,, -vessel_1_oil_yesterday,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Oil_Yest_Accum,2,,ro,,,none,,,,,,,,,, -vessel_1_water_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Water_FR,2,,ro,,,none,,,,,,,,,, -vessel_1_water_last_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Water_LastMonth_Accum,2,,ro,,,none,,,,,,,,,, -vessel_1_water_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Water_Month_Accum,2,,ro,,,none,,,,,,,,,, -vessel_1_water_lifetime,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Water_T1,2,,ro,,,none,,,,,,,,,, -vessel_1_water_temperature,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Water_Temp,2,,ro,,,none,,,,,,,,,, -vessel_1_water_today,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Water_Todays_Accum,2,,ro,,,none,,,,,,,,,, -vessel_1_water_yesterday,hrtankbattery,default,periodic,FLOAT,Val_Vessel_1_Water_Yest_Accum,2,,ro,,,none,,,,,,,,,, -vessel_2_gas_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_Gas_FR,2,,ro,,,none,,,,,,,,,, -vessel_2_oil_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_Oil_FR,2,,ro,,,none,,,,,,,,,, -vessel_2_oil_last_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_OIL_LastMonth_Accum,2,,ro,,,none,,,,,,,,,, -vessel_2_oil_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_OIL_Month_Accum,2,,ro,,,none,,,,,,,,,, -vessel_2_oil_lifetime,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_Oil_T1,2,,ro,,,none,,,,,,,,,, -vessel_2_oil_temperature,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_Oil_Temp,2,,ro,,,none,,,,,,,,,, -vessel_2_oil_today,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_Oil_Todays_Accum,2,,ro,,,none,,,,,,,,,, -vessel_2_oil_yesterday,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_OIL_Yest_Accum,2,,ro,,,none,,,,,,,,,, -vessel_2_water_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_Water_FR,2,,ro,,,none,,,,,,,,,, -vessel_2_water_last_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_Water_LastMonth_Accum,2,,ro,,,none,,,,,,,,,, -vessel_2_water_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_Water_Month_Accum,2,,ro,,,none,,,,,,,,,, -vessel_2_water_lifetime,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_Water_T1,2,,ro,,,none,,,,,,,,,, -vessel_2_water_temperature,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_Water_Temp,2,,ro,,,none,,,,,,,,,, -vessel_2_water_today,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_Water_Todays_Accum,2,,ro,,,none,,,,,,,,,, -vessel_2_water_yesterday,hrtankbattery,default,periodic,FLOAT,Val_Vessel_2_Water_Yest_Accum,2,,ro,,,none,,,,,,,,,, -vessel_3_gas_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_Gas_FR,2,,ro,,,none,,,,,,,,,, -vessel_3_oil_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_Oil_FR,2,,ro,,,none,,,,,,,,,, -vessel_3_oil_last_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_OIL_LastMonth_Accum,2,,ro,,,none,,,,,,,,,, -vessel_3_oil_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_OIL_Month_Accum,2,,ro,,,none,,,,,,,,,, -vessel_3_oil_lifetime,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_Oil_T1,2,,ro,,,none,,,,,,,,,, -vessel_3_oil_temperature,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_Oil_Temp,2,,ro,,,none,,,,,,,,,, -vessel_3_oil_today,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_Oil_Todays_Accum,2,,ro,,,none,,,,,,,,,, -vessel_3_oil_yesterday,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_OIL_Yest_Accum,2,,ro,,,none,,,,,,,,,, -vessel_3_water_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_Water_FR,2,,ro,,,none,,,,,,,,,, -vessel_3_water_last_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_Water_LastMonth_Accum,2,,ro,,,none,,,,,,,,,, -vessel_3_water_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_Water_Month_Accum,2,,ro,,,none,,,,,,,,,, -vessel_3_water_lifetime,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_Water_T1,2,,ro,,,none,,,,,,,,,, -vessel_3_water_temperature,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_Water_Temp,2,,ro,,,none,,,,,,,,,, -vessel_3_water_today,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_Water_Todays_Accum,2,,ro,,,none,,,,,,,,,, -vessel_3_water_yesterday,hrtankbattery,default,periodic,FLOAT,Val_Vessel_3_Water_Yest_Accum,2,,ro,,,none,,,,,,,,,, -vessel_4_gas_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_Gas_FR,2,,ro,,,none,,,,,,,,,, -vessel_4_oil_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_Oil_FR,2,,ro,,,none,,,,,,,,,, -vessel_4_oil_last_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_OIL_LastMonth_Accum,2,,ro,,,none,,,,,,,,,, -vessel_4_oil_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_OIL_Month_Accum,2,,ro,,,none,,,,,,,,,, -vessel_4_oil_lifetime,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_Oil_T1,2,,ro,,,none,,,,,,,,,, -vessel_4_oil_temperature,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_Oil_Temp,2,,ro,,,none,,,,,,,,,, -vessel_4_oil_today,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_Oil_Todays_Accum,2,,ro,,,none,,,,,,,,,, -vessel_4_oil_yesterday,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_OIL_Yest_Accum,2,,ro,,,none,,,,,,,,,, -vessel_4_water_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_Water_FR,2,,ro,,,none,,,,,,,,,, -vessel_4_water_last_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_Water_LastMonth_Accum,2,,ro,,,none,,,,,,,,,, -vessel_4_water_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_Water_Month_Accum,2,,ro,,,none,,,,,,,,,, -vessel_4_water_lifetime,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_Water_T1,2,,ro,,,none,,,,,,,,,, -vessel_4_water_temperature,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_Water_Temp,2,,ro,,,none,,,,,,,,,, -vessel_4_water_today,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_Water_Todays_Accum,2,,ro,,,none,,,,,,,,,, -vessel_4_water_yesterday,hrtankbattery,default,periodic,FLOAT,Val_Vessel_4_Water_Yest_Accum,2,,ro,,,none,,,,,,,,,, -vessel_5_gas_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_Gas_FR,2,,ro,,,none,,,,,,,,,, -vessel_5_oil_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_Oil_FR,2,,ro,,,none,,,,,,,,,, -vessel_5_oil_last_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_OIL_LastMonth_Accum,2,,ro,,,none,,,,,,,,,, -vessel_5_oil_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_OIL_Month_Accum,2,,ro,,,none,,,,,,,,,, -vessel_5_oil_lifetime,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_Oil_T1,2,,ro,,,none,,,,,,,,,, -vessel_5_oil_temperature,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_Oil_Temp,2,,ro,,,none,,,,,,,,,, -vessel_5_oil_today,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_Oil_Todays_Accum,2,,ro,,,none,,,,,,,,,, -vessel_5_oil_yesterday,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_OIL_Yest_Accum,2,,ro,,,none,,,,,,,,,, -vessel_5_water_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_Water_FR,2,,ro,,,none,,,,,,,,,, -vessel_5_water_last_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_Water_LastMonth_Accum,2,,ro,,,none,,,,,,,,,, -vessel_5_water_month,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_Water_Month_Accum,2,,ro,,,none,,,,,,,,,, -vessel_5_water_lifetime,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_Water_T1,2,,ro,,,none,,,,,,,,,, -vessel_5_water_temperature,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_Water_Temp,2,,ro,,,none,,,,,,,,,, -vessel_5_water_today,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_Water_Todays_Accum,2,,ro,,,none,,,,,,,,,, -vessel_5_water_yesterday,hrtankbattery,default,periodic,FLOAT,Val_Vessel_5_Water_Yest_Accum,2,,ro,,,none,,,,,,,,,, -wtp_1_flow_rate,hrtankbattery,default,periodic,FLOAT,Val_WTP_FM_FR_MBS,2,,ro,,,none,,,,,,,,,, -wtp_1_last_month,hrtankbattery,default,periodic,FLOAT,Val_WTP_FM_LastMonth_Accum,2,,ro,,,none,,,,,,,,,, -wtp_1_month,hrtankbattery,default,periodic,FLOAT,Val_WTP_FM_Month_Accum,2,,ro,,,none,,,,,,,,,, -wtp_1_net_volume,hrtankbattery,default,periodic,FLOAT,Val_WTP_FM_T1_MBS,2,,ro,,,none,,,,,,,,,, -wtp_1_forward_volume,hrtankbattery,default,periodic,FLOAT,Val_WTP_FM_T2_MBS,2,,ro,,,none,,,,,,,,,, -wtp_1_reverse_volume,hrtankbattery,default,periodic,FLOAT,Val_WTP_FM_T3_MBS,2,,ro,,,none,,,,,,,,,, -wtp_1_today,hrtankbattery,default,periodic,FLOAT,Val_WTP_FM_Todays_Accum,2,,ro,,,none,,,,,,,,,, -wtp_1_yesterday,hrtankbattery,default,periodic,FLOAT,Val_WTP_FM_Yest_Accum,2,,ro,,,none,,,,,,,,,, -air_compressor_disharge,hrtankbattery,default,periodic,FLOAT,Val_Air_Compressor_Discharge_PSI_Scaled,2,,ro,,,none,,,,,,,,,, -air_compressor_low_discharge_alm,hrtankbattery,default,periodic,BIT,AL0_Air_Compressor_Low_Discharge,,,ro,,,none,,,,,,,,,0, diff --git a/Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3_noel_alarms.csv b/Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3_noel_alarms.csv deleted file mode 100644 index e65810c..0000000 --- a/Pub_Sub/hrtankbattery/thingsboard/v3/hrtankbattery_tb_v3_noel_alarms.csv +++ /dev/null @@ -1,79 +0,0 @@ -AlarmName,ControllerName,MeasuringPointName,AlarmLevel,Condition1,Operand1,CombineMethod,Condition2,Operand2,AlarmContent,AlarmTag -plc_io_fault_alm,hrtankbattery,plc_io_fault_alm,5,eq,1.0,none,eq,,PLC IO has faulted,default -plc_fault,hrtankbattery,plc_fault,5,eq,1.0,none,eq,,PLC has faulted,default -analog_01_alm,hrtankbattery,analog_01_alm,5,eq,1.0,none,eq,,Analog Module 1 has faulted,default -analog_02_alm,hrtankbattery,analog_02_alm,5,eq,1.0,none,eq,,Analog Module 2 has faulted,default -analog_03_alm,hrtankbattery,analog_03_alm,5,eq,1.0,none,eq,,Analog Module 3 has faulted,default -analog_04_alm,hrtankbattery,analog_04_alm,5,eq,1.0,none,eq,,Analog Module 4 has faulted,default -analog_05_alm,hrtankbattery,analog_05_alm,5,eq,1.0,none,eq,,Analog Module 5 has faulted,default -analog_06_alm,hrtankbattery,analog_06_alm,5,eq,1.0,none,eq,,Analog Module 6 has faulted,default -ac_power_alm,hrtankbattery,ac_power_alm,5,eq,1.0,none,eq,,AC Power Fault,default -ups_alm,hrtankbattery,ups_alm,5,eq,1.0,none,eq,,UPS Fault,default -dc_power_alm,hrtankbattery,dc_power_alm,5,eq,1.0,none,eq,,DC Power Fault,default -three_phase_pwr_alm,hrtankbattery,three_phase_pwr_alm,5,eq,1.0,none,eq,,Three Phase Power Fault,default -water_01_hihi_alm,hrtankbattery,water_01_hihi_alm,5,eq,1.0,none,eq,,Water Tank 1 crossed HiHi threshold,default -water_01_hi_alm,hrtankbattery,water_01_hi_alm,5,eq,1.0,none,eq,,Water Tank 1 crossed Hi threshold,default -water_01_tx_alm,hrtankbattery,water_01_tx_alm,5,eq,1.0,none,eq,,Water Tank 1 transmission error,default -water_02_hihi_alm,hrtankbattery,water_02_hihi_alm,5,eq,1.0,none,eq,,Water Tank 2 crossed HiHi threshold,default -water_02_hi_alm,hrtankbattery,water_02_hi_alm,5,eq,1.0,none,eq,,Water Tank 2 crossed Hi threshold,default -water_02_tx_alm,hrtankbattery,water_02_tx_alm,5,eq,1.0,none,eq,,Water Tank 2 transmission error,default -water_03_hihi_alm,hrtankbattery,water_03_hihi_alm,5,eq,1.0,none,eq,,Water Tank 3 crossed HiHi threshold,default -water_03_hi_alm,hrtankbattery,water_03_hi_alm,5,eq,1.0,none,eq,,Water Tank 3 crossed Hi threshold,default -water_03_tx_alm,hrtankbattery,water_03_tx_alm,5,eq,1.0,none,eq,,Water Tank 3 transmission error,default -water_04_hihi_alm,hrtankbattery,water_04_hihi_alm,5,eq,1.0,none,eq,,Water Tank 4 crossed HiHi threshold,default -water_04_hi_alm,hrtankbattery,water_04_hi_alm,5,eq,1.0,none,eq,,Water Tank 4 crossed Hi threshold,default -water_04_tx_alm,hrtankbattery,water_04_tx_alm,5,eq,1.0,none,eq,,Water Tank 4 transmission error,default -water_05_hihi_alm,hrtankbattery,water_05_hihi_alm,5,eq,1.0,none,eq,,Water Tank 5 crossed HiHi threshold,default -water_05_hi_alm,hrtankbattery,water_05_hi_alm,5,eq,1.0,none,eq,,Water Tank 5 crossed Hi threshold,default -water_05_tx_alm,hrtankbattery,water_05_tx_alm,5,eq,1.0,none,eq,,Water Tank 5 transmission error,default -water_06_hihi_alm,hrtankbattery,water_06_hihi_alm,5,eq,1.0,none,eq,,Water Tank 6 crossed HiHi threshold,default -water_06_hi_alm,hrtankbattery,water_06_hi_alm,5,eq,1.0,none,eq,,Water Tank 6 crossed Hi threshold,default -water_06_tx_alm,hrtankbattery,water_06_tx_alm,5,eq,1.0,none,eq,,Water Tank 6 transmission error,default -water_07_hihi_alm,hrtankbattery,water_07_hihi_alm,5,eq,1.0,none,eq,,Water Tank 7 crossed HiHi threshold,default -water_07_hi_alm,hrtankbattery,water_07_hi_alm,5,eq,1.0,none,eq,,Water Tank 7 crossed Hi threshold,default -water_07_tx_alm,hrtankbattery,water_07_tx_alm,5,eq,1.0,none,eq,,Water Tank 7 transmission error,default -water_08_hihi_alm,hrtankbattery,water_08_hihi_alm,5,eq,1.0,none,eq,,Water Tank 8 crossed HiHi threshold,default -water_08_hi_alm,hrtankbattery,water_08_hi_alm,5,eq,1.0,none,eq,,Water Tank 8 crossed Hi threshold,default -water_08_tx_alm,hrtankbattery,water_08_tx_alm,5,eq,1.0,none,eq,,Water Tank 8 transmission error,default -water_09_hihi_alm,hrtankbattery,water_09_hihi_alm,5,eq,1.0,none,eq,,Water Tank 9 crossed HiHi threshold,default -water_09_hi_alm,hrtankbattery,water_09_hi_alm,5,eq,1.0,none,eq,,Water Tank 9 crossed Hi threshold,default -water_09_tx_alm,hrtankbattery,water_09_tx_alm,5,eq,1.0,none,eq,,Water Tank 9 transmission error,default -oil_01_hihi_alm,hrtankbattery,oil_01_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 1 crossed HiHi threshold,default -oil_01_hi_alm,hrtankbattery,oil_01_hi_alm,5,eq,1.0,none,eq,,Oil Tank 1 crossed Hi threshold,default -oil_01_tx_alm,hrtankbattery,oil_01_tx_alm,5,eq,1.0,none,eq,,Oil Tank 1 transmission error,default -oil_02_hihi_alm,hrtankbattery,oil_02_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 2 crossed HiHi threshold,default -oil_02_hi_alm,hrtankbattery,oil_02_hi_alm,5,eq,1.0,none,eq,,Oil Tank 2 crossed Hi threshold,default -oil_02_tx_alm,hrtankbattery,oil_02_tx_alm,5,eq,1.0,none,eq,,Oil Tank 2 transmission error,default -oil_03_hihi_alm,hrtankbattery,oil_03_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 3 crossed HiHi threshold,default -oil_03_hi_alm,hrtankbattery,oil_03_hi_alm,5,eq,1.0,none,eq,,Oil Tank 3 crossed Hi threshold,default -oil_03_tx_alm,hrtankbattery,oil_03_tx_alm,5,eq,1.0,none,eq,,Oil Tank 3 transmission error,default -oil_04_hihi_alm,hrtankbattery,oil_04_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 4 crossed HiHi threshold,default -oil_04_hi_alm,hrtankbattery,oil_04_hi_alm,5,eq,1.0,none,eq,,Oil Tank 4 crossed Hi threshold,default -oil_04_tx_alm,hrtankbattery,oil_04_tx_alm,5,eq,1.0,none,eq,,Oil Tank 4 transmission error,default -oil_05_hihi_alm,hrtankbattery,oil_05_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 5 crossed HiHi threshold,default -oil_05_hi_alm,hrtankbattery,oil_05_hi_alm,5,eq,1.0,none,eq,,Oil Tank 5 crossed Hi threshold,default -oil_05_tx_alm,hrtankbattery,oil_05_tx_alm,5,eq,1.0,none,eq,,Oil Tank 5 transmission error,default -oil_06_hihi_alm,hrtankbattery,oil_06_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 6 crossed HiHi threshold,default -oil_06_hi_alm,hrtankbattery,oil_06_hi_alm,5,eq,1.0,none,eq,,Oil Tank 6 crossed Hi threshold,default -oil_06_tx_alm,hrtankbattery,oil_06_tx_alm,5,eq,1.0,none,eq,,Oil Tank 6 transmission error,default -oil_07_hihi_alm,hrtankbattery,oil_07_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 7 crossed HiHi threshold,default -oil_07_hi_alm,hrtankbattery,oil_07_hi_alm,5,eq,1.0,none,eq,,Oil Tank 7 crossed Hi threshold,default -oil_07_tx_alm,hrtankbattery,oil_07_tx_alm,5,eq,1.0,none,eq,,Oil Tank 7 transmission error,default -transfer_01_alm,hrtankbattery,transfer_01_alm,5,eq,1.0,none,eq,,Transfer 1 Faulted,default -transfer_01_discharge_hihi_alm,hrtankbattery,transfer_01_discharge_hihi_alm,5,eq,1.0,none,eq,,Transfer 1 Discharge crossed HiHi threshold,default -transfer_01_discharge_lolo_alm,hrtankbattery,transfer_01_discharge_lolo_alm,5,eq,1.0,none,eq,,Transfer 1 Discharge crossed LoLo threshold,default -transfer_01_flow_rate_hihi_alm,hrtankbattery,transfer_01_flow_rate_hihi_alm,5,eq,1.0,none,eq,,Transfer 1 Flow Rate crossed HiHi threshold,default -transfer_01_flow_rate_lolo_alm,hrtankbattery,transfer_01_flow_rate_lolo_alm,5,eq,1.0,none,eq,,Transfer 1 Flow Rate crossed LoLo threshold,default -transfer_01_3_phase_pwr_alm,hrtankbattery,transfer_01_3_phase_pwr_alm,5,eq,1.0,none,eq,,Transfer 1 3 Phase Power Failure,default -transfer_02_alm,hrtankbattery,transfer_02_alm,5,eq,1.0,none,eq,,Transfer 2 Faulted,default -transfer_02_discharge_hihi_alm,hrtankbattery,transfer_02_discharge_hihi_alm,5,eq,1.0,none,eq,,Transfer 2 Discharge crossed HiHi threshold,default -transfer_02_discharge_lolo_alm,hrtankbattery,transfer_02_discharge_lolo_alm,5,eq,1.0,none,eq,,Transfer 2 Discharge crossed LoLo threshold,default -transfer_02_flow_rate_hihi_alm,hrtankbattery,transfer_02_flow_rate_hihi_alm,5,eq,1.0,none,eq,,Transfer 2 Flow Rate crossed HiHi threshold,default -transfer_02_flow_rate_lolo_alm,hrtankbattery,transfer_02_flow_rate_lolo_alm,5,eq,1.0,none,eq,,Transfer 2 Flow Rate crossed LoLo threshold,default -lact_01_alm,hrtankbattery,lact_01_alm,5,eq,1.0,none,eq,,LACT 1 Meter Failure,default -lact_01_oil_shutdown,hrtankbattery,lact_01_oil_shutdown,5,eq,1.0,none,eq,,LACT 1 Bad Oil,default -lact_02_alm,hrtankbattery,lact_02_alm,5,eq,1.0,none,eq,,LACT 2 Meter Failure,default -lact_02_oil_shutdown,hrtankbattery,lact_02_oil_shutdown,5,eq,1.0,none,eq,,LACT 2 Bad Oil,default -containment_high_alm,hrtankbattery,containment_high_alm,5,eq,1.0,none,eq,,Containment Level has crossed the Hi threshold.,default -h2s_alm,hrtankbattery,h2s_alm,5,eq,1.0,none,eq,,H2S Detected,default -air_compressor_low_discharge_alm,hrtankbattery,air_compressor_low_discharge_alm,5,eq,1,none,eq,,air compressor low discharge alarm,default diff --git a/Pub_Sub/hrtankbattery/thingsboard/v3/pub/sendAlarms.py b/Pub_Sub/hrtankbattery/thingsboard/v3/pub/sendAlarms.py deleted file mode 100644 index 58497ef..0000000 --- a/Pub_Sub/hrtankbattery/thingsboard/v3/pub/sendAlarms.py +++ /dev/null @@ -1,12 +0,0 @@ -# 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__) \ No newline at end of file diff --git a/Pub_Sub/hrtankbattery/thingsboard/v3/pub/sendData.py b/Pub_Sub/hrtankbattery/thingsboard/v3/pub/sendData.py deleted file mode 100644 index 53026f6..0000000 --- a/Pub_Sub/hrtankbattery/thingsboard/v3/pub/sendData.py +++ /dev/null @@ -1,145 +0,0 @@ -# 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": {}} - run_tanks = {} - - 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"])) - if measure["name"] in ["oil_run_tank","water_run_tank"]: - run_tanks[measure["name"]] = measure["value"] - if "_level" in measure["name"]: - run_tanks[measure["name"]] = measure["value"] - payload["values"][measure["name"]] = measure["value"] - except Exception as e: - logger.error(e) - payload["values"]["oil_run_tank_level"] = run_tanks["oil_0" + str(run_tanks["oil_run_tank"]) + "_level"] - payload["values"]["water_run_tank_level"] = run_tanks["water_0" + str(run_tanks["water_run_tank"]) + "_level"] - publish(__topic__, json.dumps(payload), __qos__) - publish("v1/devices/me/attributes", json.dumps({"latestReportTime": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__) - diff --git a/Pub_Sub/hrtankbattery/thingsboard/v3/sub/receiveCommand.py b/Pub_Sub/hrtankbattery/thingsboard/v3/sub/receiveCommand.py deleted file mode 100644 index 3b7993b..0000000 --- a/Pub_Sub/hrtankbattery/thingsboard/v3/sub/receiveCommand.py +++ /dev/null @@ -1,66 +0,0 @@ -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": , "value": } - 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) - diff --git a/Pub_Sub/hrvalvecontroller/thingsboard/v1/hrvalvecontroller_tb_v1.cfg b/Pub_Sub/hrvalvecontroller/thingsboard/hrvalvecontroller_tb_v1.cfg similarity index 100% rename from Pub_Sub/hrvalvecontroller/thingsboard/v1/hrvalvecontroller_tb_v1.cfg rename to Pub_Sub/hrvalvecontroller/thingsboard/hrvalvecontroller_tb_v1.cfg diff --git a/Pub_Sub/hrvalvecontroller/thingsboard/v1/pub/sendData.py b/Pub_Sub/hrvalvecontroller/thingsboard/pub/sendData.py similarity index 100% rename from Pub_Sub/hrvalvecontroller/thingsboard/v1/pub/sendData.py rename to Pub_Sub/hrvalvecontroller/thingsboard/pub/sendData.py diff --git a/Pub_Sub/plcfreshwater/mistaway/v1/plcfreshwater_ma_v1.cfg b/Pub_Sub/plcfreshwater/mistaway/plcfreshwater_ma_v1.cfg similarity index 100% rename from Pub_Sub/plcfreshwater/mistaway/v1/plcfreshwater_ma_v1.cfg rename to Pub_Sub/plcfreshwater/mistaway/plcfreshwater_ma_v1.cfg diff --git a/Pub_Sub/plcfreshwater/mistaway/v1/plcfreshwater_ma_v2-dawn-to-terri.cfg b/Pub_Sub/plcfreshwater/mistaway/plcfreshwater_ma_v2-dawn-to-terri.cfg similarity index 100% rename from Pub_Sub/plcfreshwater/mistaway/v1/plcfreshwater_ma_v2-dawn-to-terri.cfg rename to Pub_Sub/plcfreshwater/mistaway/plcfreshwater_ma_v2-dawn-to-terri.cfg diff --git a/Pub_Sub/plcfreshwater/mistaway/v1/pub/sendData.py b/Pub_Sub/plcfreshwater/mistaway/pub/sendData.py similarity index 100% rename from Pub_Sub/plcfreshwater/mistaway/v1/pub/sendData.py rename to Pub_Sub/plcfreshwater/mistaway/pub/sendData.py diff --git a/Pub_Sub/plcfreshwater/mistaway/v1/pub/sendDatav2.py b/Pub_Sub/plcfreshwater/mistaway/pub/sendDatav2.py similarity index 100% rename from Pub_Sub/plcfreshwater/mistaway/v1/pub/sendDatav2.py rename to Pub_Sub/plcfreshwater/mistaway/pub/sendDatav2.py diff --git a/Pub_Sub/plcfreshwater/mistaway/v1/sub/receiveCommand.py b/Pub_Sub/plcfreshwater/mistaway/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/plcfreshwater/mistaway/v1/sub/receiveCommand.py rename to Pub_Sub/plcfreshwater/mistaway/sub/receiveCommand.py diff --git a/Pub_Sub/plcfreshwater/mistaway/v1/sub/receiveCommandv2.py b/Pub_Sub/plcfreshwater/mistaway/sub/receiveCommandv2.py similarity index 100% rename from Pub_Sub/plcfreshwater/mistaway/v1/sub/receiveCommandv2.py rename to Pub_Sub/plcfreshwater/mistaway/sub/receiveCommandv2.py diff --git a/Pub_Sub/plcfreshwater/mistaway/v1/cloud.json b/Pub_Sub/plcfreshwater/mistaway/v1/cloud.json deleted file mode 100644 index 88fd4d9..0000000 --- a/Pub_Sub/plcfreshwater/mistaway/v1/cloud.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "cloud": { - "cacheSize": 100, - "enable": 1, - "type": "Standard MQTT", - "args": { - "host": "mq194.imistaway.net", - "port": 1883, - "clientId": "client-id", - "auth": 1, - "tls": 0, - "cleanSession": 0, - "mqttVersion": "v3.1.1", - "keepalive": 60, - "key": "", - "cert": "", - "rootCA": "", - "verifyServer": 0, - "verifyClient": 0, - "username": "admin", - "passwd": "columbus", - "authType": 1 - } - }, - "quickfaas": { - "uploadFuncs": [ - { - "name": "Send Data", - "trigger": "measure_event", - "topic": "meshify/db/194/_/plcfreshwater/${MAC_LOWER}", - "qos": 1, - "groups": [ - "default" - ], - "funcName": "sendData", - "script": "# Enter your python code.\nimport json\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nimport re, uuid\nfrom paho.mqtt import client\nimport os\n\nlwtData = {\n \"init\":False,\n \"client\": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport=\"tcp\")\n}\ndef lwt(mac):\n try:\n #if not lwtData[\"connected\"]:\n if not lwtData[\"init\"]:\n logger.info(\"INITIALIZING LWT CLIENT\")\n lwtData[\"client\"].username_pw_set(username=\"admin\", password=\"columbus\")\n lwtData[\"client\"].will_set(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\",json.dumps({\"value\":False}))\n lwtData[\"init\"] = True\n logger.info(\"Connecting to MQTT Broker for LWT purposes!!!!!!!\")\n lwtData[\"client\"].connect(\"mq194.imistaway.net\",1883, 600)\n lwtData[\"client\"].publish(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\", json.dumps({\"value\":True}))\n except Exception as e:\n logger.error(\"LWT DID NOT DO THE THING\")\n logger.error(e)\n\ndef sendData(message):\n #logger.debug(message)\n mac = __topic__.split(\"/\")[-1] #':'.join(re.findall('..', '%012x' % uuid.getnode()))\n lwt(mac)\n plc_ping = os.system(\"ping -c 1 192.168.1.101 > /dev/null 2>&1\")\n if plc_ping == 0:\n publish(__topic__ + \":01:99/\" + \"plc_ping\", json.dumps({\"value\": \"OK\"}), __qos__)\n else:\n publish(__topic__ + \":01:99/\" + \"plc_ping\", json.dumps({\"value\": \"Comms Error to PLC\"}), __qos__)\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n if measure[\"name\"] in [\"raw_hand_input\", \"raw_auto_input\", \"raw_run_status\", \"raw_local_start\",\"raw_overload_status\"]:\n logger.debug(\"Converting DINT/BOOL to STRING\")\n value = convert_int(measure[\"name\"], measure[\"value\"])\n logger.debug(\"Converted {} to {}\".format(measure[\"value\"], value))\n publish(__topic__ + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": value}), __qos__)\n else:\n publish(__topic__ + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": measure[\"value\"]}), __qos__)\n except Exception as e:\n logger.error(e)\n \n #publish(__topic__, json.dumps({measure[\"name\"]: measure[\"value\"]}), __qos__)\n\ndef convert_int(plc_tag, value):\n input_codes = {\n 0: \"Off\",\n 1: \"On\"\n }\n\n run_status_codes = {\n 0: \"Stopped\",\n 1: \"Running\"\n }\n\n overload_codes = {\n 0: \"Good\",\n 1: \"Down on Overload Tripped\"\n }\n \n plc_tags = {\n \"raw_hand_input\": input_codes.get(value, \"Invalid Code\"),\n \"raw_auto_input\": input_codes.get(value, \"Invalid Code\"),\n \"raw_run_status\": run_status_codes.get(value, \"Invalid Code\"),\n \"raw_overload_status\": overload_codes.get(value, \"Invalid Code\")\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")\n\n ", - "msgType": 0 - } - ], - "downloadFuncs": [ - { - "name": "Commands", - "topic": "meshify/sets/194/${MAC_UPPER}:01:99", - "qos": 1, - "funcName": "receiveCommand", - "payload_type": "Plaintext", - "script": "# Enter your python code.\nimport json\nimport os\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(mac,value, wizard_api):\n #get new values and send\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.info(data)\n plc_ping = os.system(\"ping -c 1 192.168.1.101 > /dev/null 2>&1\")\n if plc_ping == 0:\n publish(__topic__ + \":01:99/\" + \"plc_ping\", json.dumps({\"value\": \"OK\"}), __qos__)\n else:\n publish(__topic__ + \":01:99/\" + \"plc_ping\", json.dumps({\"value\": \"Comms Error to PLC\"}), __qos__)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n topic = \"meshify/db/194/_/plcfreshwater/\" + mac + \"/\" + measure[\"name\"]\n if measure[\"name\"] in [\"raw_hand_input\", \"raw_auto_input\", \"raw_run_status\", \"raw_local_start\",\"raw_overload_status\"]:\n payload = [{\"value\": convert_int(measure[\"name\"], measure[\"value\"])}]\n else:\n payload = [{\"value\": measure[\"value\"]}]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n wizard_api.mqtt_publish(topic, json.dumps(payload))\ndef writeplctag(mac, value, wizard_api):\n try:\n value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"plcfreshwater\":{value[\"tag\"]: value[\"val\"]}}\n wizard_api.write_plc_values(message)\n except Exception as e:\n logger.debug(e)\n \ndef receiveCommand(topic, payload, wizard_api):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)[0]\n command = p[\"payload\"][\"name\"].split(\".\")[1]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n }\n commands[command](p[\"mac\"].lower(),p[\"payload\"][\"value\"], wizard_api)\n #logger.debug(command)\n ack(p[\"msgId\"], p[\"mac\"], command, p[\"payload\"][\"name\"].split(\".\")[1], p[\"payload\"][\"value\"], wizard_api)\n\ndef ack(msgid, mac, name, command, value, wizard_api):\n #logger.debug(mac)\n macsquish = \"\".join(mac.split(\":\")[:-2])\n maclower = \":\".join(mac.split(\":\")[:-2])\n maclower = maclower.lower()\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"meshify/responses/\" + str(msgid), json.dumps([{\"value\": \"{} Success Setting: {} To: {}\".format(macsquish,name, value), \"msgid\": str(msgid)}]))\n wizard_api.mqtt_publish(\"meshify/db/194/_/mainMeshify/\" + maclower + \":00:00/commands\", json.dumps([{\"value\": {\"status\": \"success\", \"value\": str(value), \"channel\": command}, \"msgid\": str(msgid)}]))\n\ndef convert_int(plc_tag, value):\n input_codes = {\n 0: \"Off\",\n 1: \"On\"\n }\n\n run_status_codes = {\n 0: \"Stopped\",\n 1: \"Running\"\n }\n\n overload_codes = {\n 0: \"Good\",\n 1: \"Down on Overload Tripped\"\n }\n \n plc_tags = {\n \"raw_hand_input\": input_codes.get(value, \"Invalid Code\"),\n \"raw_auto_input\": input_codes.get(value, \"Invalid Code\"),\n \"raw_run_status\": run_status_codes.get(value, \"Invalid Code\"),\n \"raw_overload_status\": overload_codes.get(value, \"Invalid Code\")\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")\n", - "msgType": 0, - "trigger": "command_event" - } - ] - } -} \ No newline at end of file diff --git a/Pub_Sub/plcfreshwater/mistaway/v1/measure.csv b/Pub_Sub/plcfreshwater/mistaway/v1/measure.csv deleted file mode 100644 index 1ea527b..0000000 --- a/Pub_Sub/plcfreshwater/mistaway/v1/measure.csv +++ /dev/null @@ -1,11 +0,0 @@ -MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit -scaled_flow_meter,plcfreshwater,default,periodic,FLOAT,Scaled_Flow_Meter,2,1,ro,,,none,,,,,,,, -scaled_pressure_transducer,plcfreshwater,default,periodic,FLOAT,Scaled_Pressure_Transducer,2,1,ro,,,none,,,,,,,, -raw_hand_input,plcfreshwater,default,periodic,BIT,Raw_Hand_Input,2,1,ro,,,none,,,,,,,, -raw_auto_input,plcfreshwater,default,periodic,BIT,Raw_Auto_Input,2,1,ro,,,none,,,,,,,, -raw_run_status,plcfreshwater,default,periodic,BIT,Raw_Run_Status,2,1,ro,,,none,,,,,,,, -raw_local_start,plcfreshwater,default,periodic,BIT,Raw_Local_Start,2,1,ro,,,none,,,,,,,, -lifetime_flow_meter_gal,plcfreshwater,default,periodic,FLOAT,Lifetime_Flow_Meter_Gal,2,1,ro,,,none,,,,,,,, -spt_flow_meter_unit,plcfreshwater,default,periodic,BIT,SPT_Flow_Meter_Unit,2,1,ro,,,none,,,,,,,, -raw_overload_status,plcfreshwater,default,periodic,BIT,Raw_Overload_Status,2,1,ro,,,none,,,,,,,, -CMD_Cloud_Control,plcfreshwater,default,periodic,BIT,CMD_Cloud_Control,2,1,rw,,,none,,,,,,,, diff --git a/Pub_Sub/plcfreshwater/mistaway/v1/plcfreshv2.csv b/Pub_Sub/plcfreshwater/mistaway/v1/plcfreshv2.csv deleted file mode 100644 index 581e85b..0000000 --- a/Pub_Sub/plcfreshwater/mistaway/v1/plcfreshv2.csv +++ /dev/null @@ -1,19 +0,0 @@ -MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit -scaled_flow_meter,plcfreshwater,default,periodic,FLOAT,Scaled_Flow_Meter,2,1,ro,,,none,,,,,,,, -scaled_pressure_transducer,plcfreshwater,default,periodic,FLOAT,Scaled_Pressure_Transducer,2,1,ro,,,none,,,,,,,, -raw_hand_input,plcfreshwater,default,periodic,BIT,Raw_Hand_Input,2,1,ro,,,none,,,,,,,, -raw_auto_input,plcfreshwater,default,periodic,BIT,Raw_Auto_Input,2,1,ro,,,none,,,,,,,, -raw_run_status,plcfreshwater,default,periodic,BIT,Raw_Run_Status,2,1,ro,,,none,,,,,,,, -raw_local_start,plcfreshwater,default,periodic,BIT,Raw_Local_Start,2,1,ro,,,none,,,,,,,, -lifetime_flow_meter_gal,plcfreshwater,default,periodic,FLOAT,Lifetime_Flow_Meter_Gal,2,1,ro,,,none,,,,,,,, -spt_flow_meter_unit,plcfreshwater,default,periodic,BIT,SPT_Flow_Meter_Unit,2,1,ro,,,none,,,,,,,, -raw_overload_status,plcfreshwater,default,periodic,BIT,Raw_Overload_Status,2,1,ro,,,none,,,,,,,, -CMD_Cloud_Control,plcfreshwater,default,periodic,BIT,CMD_Cloud_Control,2,1,ro,,,none,,,,,,,, -total_fm_yesterday_gal,plcfreshwater,default,periodic,FLOAT,Totalizer_FM_Yesterday_Total_Gal,2,1,ro,,,none,,,,,,,, -total_fm_day_gal,plcfreshwater,default,periodic,FLOAT,Totalizer_FM_Current_Day_Total_Gal,2,1,ro,,,none,,,,,,,, -total_fm_last_month_gal,plcfreshwater,default,periodic,FLOAT,Totalizer_FM_Last_Month_Gal,2,1,ro,,,none,,,,,,,, -total_fm_month_gal,plcfreshwater,default,periodic,FLOAT,Totalizer_FM_Current_Month_Gal,2,1,ro,,,none,,,,,,,, -total_fm_yesterday_bbls,plcfreshwater,default,periodic,FLOAT,Totalizer_FM_Yesterday_Total_BBLs,2,1,ro,,,none,,,,,,,, -total_fm_day_bbls,plcfreshwater,default,periodic,FLOAT,Totalizer_FM_Current_Day_Total_BBLs,2,1,ro,,,none,,,,,,,, -total_fm_last_month_bbls,plcfreshwater,default,periodic,FLOAT,Totalizer_FM_Last_Month_BBLs,2,1,ro,,,none,,,,,,,, -total_fm_month_bbls,plcfreshwater,default,periodic,FLOAT,Totalizer_FM_Current_Month_BBLs,2,1,ro,,,none,,,,,,,, \ No newline at end of file diff --git a/Pub_Sub/plcfreshwater/mistaway/v1/plcfreshv21.csv b/Pub_Sub/plcfreshwater/mistaway/v1/plcfreshv21.csv deleted file mode 100644 index 7499ddb..0000000 --- a/Pub_Sub/plcfreshwater/mistaway/v1/plcfreshv21.csv +++ /dev/null @@ -1,6 +0,0 @@ -MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit -flowrate,plcfreshwater,default,periodic,FLOAT,Scaled_Flow_Meter,2,1,ro,,,none,,,,,,,, -tubingpressure,plcfreshwater,default,periodic,FLOAT,Scaled_Pressure_Transducer,2,1,ro,,,none,,,,,,,, -flowtotalyesterday,plcfreshwater,default,periodic,FLOAT,Totalizer_FM_Yesterday_Total_BBLs,2,1,ro,,,none,,,,,,,, -flowtotal,plcfreshwater,default,periodic,FLOAT,Totalizer_FM_Current_Day_Total_BBLs,2,1,ro,,,none,,,,,,,, -wellstatus,plcfreshwater,default,periodic,BIT,Raw_Run_Status,2,1,ro,,,none,,,,,,,, \ No newline at end of file diff --git a/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v1/plcfreshwater_advvfdipp_tb_v1.cfg b/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/plcfreshwater_advvfdipp_tb_v1.cfg similarity index 100% rename from Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v1/plcfreshwater_advvfdipp_tb_v1.cfg rename to Pub_Sub/plcfreshwater_advvfdipp/thingsboard/plcfreshwater_advvfdipp_tb_v1.cfg diff --git a/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/plcfreshwater_advvfdipp_tb_v2.cfg b/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/plcfreshwater_advvfdipp_tb_v2.cfg similarity index 100% rename from Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/plcfreshwater_advvfdipp_tb_v2.cfg rename to Pub_Sub/plcfreshwater_advvfdipp/thingsboard/plcfreshwater_advvfdipp_tb_v2.cfg diff --git a/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/pub/sendData.py b/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/pub/sendData.py similarity index 100% rename from Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/pub/sendData.py rename to Pub_Sub/plcfreshwater_advvfdipp/thingsboard/pub/sendData.py diff --git a/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/sub/receiveCommand.py b/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/sub/receiveCommand.py rename to Pub_Sub/plcfreshwater_advvfdipp/thingsboard/sub/receiveCommand.py diff --git a/Pub_Sub/promagmbs/v1/device_supervisor_promagmbsv1.cfg b/Pub_Sub/promagmbs/mistaway/device_supervisor_promagmbsv1.cfg similarity index 100% rename from Pub_Sub/promagmbs/v1/device_supervisor_promagmbsv1.cfg rename to Pub_Sub/promagmbs/mistaway/device_supervisor_promagmbsv1.cfg diff --git a/Pub_Sub/promagmbs/v1/pub/sendData.py b/Pub_Sub/promagmbs/mistaway/pub/sendData.py similarity index 100% rename from Pub_Sub/promagmbs/v1/pub/sendData.py rename to Pub_Sub/promagmbs/mistaway/pub/sendData.py diff --git a/Pub_Sub/promagmbs/v1/sub/receiveCommand.py b/Pub_Sub/promagmbs/mistaway/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/promagmbs/v1/sub/receiveCommand.py rename to Pub_Sub/promagmbs/mistaway/sub/receiveCommand.py diff --git a/Pub_Sub/recycle_train/.DS_Store b/Pub_Sub/recycle_train/.DS_Store deleted file mode 100644 index 626503c..0000000 Binary files a/Pub_Sub/recycle_train/.DS_Store and /dev/null differ diff --git a/Pub_Sub/recycle_train/mistaway/v1/device_supervisor_recycle_trainv1.cfg b/Pub_Sub/recycle_train/mistaway/v1/device_supervisor_recycle_trainv1.cfg deleted file mode 100644 index ed2f710..0000000 --- a/Pub_Sub/recycle_train/mistaway/v1/device_supervisor_recycle_trainv1.cfg +++ /dev/null @@ -1,790 +0,0 @@ -{ - "controllers": [ - { - "protocol": "EtherNet/IP", - "name": "recycle_train", - "samplePeriod": 10, - "expired": 10000, - "endpoint": "192.168.1.10:44818", - "args": {} - } - ], - "measures": [ - { - "name": "clearwell_level", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rLIT_201", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "clearwell_pressure", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rPIT_201", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_disconnect", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bDS041", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_running", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bMA041", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_start", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bMS041", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_faulted", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bXA041", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_flow", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rFIT_201", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_speed_demand_percent", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rSC041", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_frequency", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rST041", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_speed_percent", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rST041pct", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_comm", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "Alarm_Comm_Fail_Remote_Pod_1_Loss", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_ast_0", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Remote_1_Data[0]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_ast_1", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Remote_1_Data[1]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_ast_2", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Remote_1_Data[2]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_ast_3", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Remote_1_Data[3]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_ast_4", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Remote_1_Data[4]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_enabled", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "Remote_Pod_1_Enable", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "outlet_flow_eu_max", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_EU_Max", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "outlet_flow_eu_min", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_EU_Min", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_flow_rate_bpd", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_FR", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_flow_rate_gpm", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_FR_GPM", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_flow_pressure", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_PV", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_flow_life_net_bpd", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_TA", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_life_fwd_bpd", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_TB", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_life_rvs_bpd", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_TC", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_ready", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bEffluentReady", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_shutdown", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bShutdownEffluentPump", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_faulted", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bXA042", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_speed_demand_percent", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rSC042", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_frequency", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rST042", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_speed_percent", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rST042pct", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_today_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Influent_Totalizer.Today_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_yesterday_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Influent_Totalizer.Yesterdays_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_month_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Influent_Totalizer.Monthlys_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_prevmonth_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Influent_Totalizer.PrevMonthlys_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_today_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Effluent_Totalizer.Today_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_yesterday_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Effluent_Totalizer.Yesterdays_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_month_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Effluent_Totalizer.Monthlys_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_prevmonth_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Effluent_Totalizer.PrevMonthlys_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "train_1_ast_level", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[0]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "train_2_ast_level", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[1]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "wtf_inlet_flow_rate", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[2]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "wtf_totalizer", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[3]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "wtf_today_totalizer", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[5]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "wtf_yesterday_totalizer", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[6]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "wtf_month_totalizer", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[7]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "wtf_prev_month_totalizer", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[8]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - } - ], - "alarmLables": [ - "default" - ], - "alarms": [], - "groups": [ - { - "name": "default", - "uploadInterval": 600, - "reference": 44 - } - ], - "misc": { - "maxAlarmRecordSz": 2000, - "logLvl": "DEBUG", - "coms": [ - { - "name": "rs232", - "baud": 9600, - "bits": 8, - "stopbits": 1, - "parityChk": "n" - }, - { - "name": "rs485", - "baud": 19200, - "bits": 8, - "stopbits": 1, - "parityChk": "n" - } - ] - }, - "clouds": [ - { - "cacheSize": 100, - "enable": 1, - "type": "Standard MQTT", - "args": { - "host": "mq194.imistaway.net", - "port": 1883, - "clientId": "sv-inhand-demo", - "auth": 1, - "tls": 0, - "cleanSession": 1, - "mqttVersion": "v3.1.1", - "keepalive": 120, - "key": "", - "cert": "", - "rootCA": "", - "verifyServer": 0, - "verifyClient": 0, - "username": "admin", - "passwd": "columbus", - "authType": 1 - }, - "name": "default" - } - ], - "quickfaas": { - "genericFuncs": [], - "uploadFuncs": [ - { - "name": "Send Data", - "trigger": "measure_event", - "topic": "meshify/db/194/_/recycle_train/${MAC_LOWER}", - "qos": 1, - "groups": [ - "default" - ], - "funcName": "sendData", - "script": "# Enter your python code.\nimport json\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nimport re, uuid\n\n\ndef sendData(message):\n #logger.debug(message)\n mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n publish(__topic__ + mac + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": measure[\"value\"]}), __qos__)\n except Exception as e:\n logger.error(e)\n \n #publish(__topic__, json.dumps({measure[\"name\"]: measure[\"value\"]}), __qos__)\n\n\n ", - "cloudName": "default", - "msgType": 0 - } - ], - "downloadFuncs": [ - { - "name": "Commands", - "topic": "meshify/sets/194/${MAC_UPPER}:01:99", - "qos": 1, - "funcName": "receiveCommand", - "payload_type": "Plaintext", - "script": "# Enter your python code.\nimport json\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(mac,value, wizard_api):\n #get new values and send\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.info(data)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n topic = \"meshify/db/194/_/rigpump/\" + mac + \"/\" + measure[\"name\"]\n payload = [{\"value\": measure[\"value\"]}]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n wizard_api.mqtt_publish(topic, json.dumps(payload))\ndef writeplctag(mac, value, wizard_api):\n try:\n value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"rigpump\":{value[\"tag\"]: value[\"val\"]}}\n wizard_api.write_plc_values(message)\n except Exception as e:\n logger.debug(e)\n \ndef receiveCommand(topic, payload, wizard_api):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)[0]\n command = p[\"payload\"][\"name\"].split(\".\")[1]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n }\n commands[command](p[\"mac\"].lower(),p[\"payload\"][\"value\"], wizard_api)\n #logger.debug(command)\n ack(p[\"msgId\"], p[\"mac\"], p[\"payload\"][\"name\"].split(\".\")[1], p[\"payload\"][\"value\"], wizard_api)\n\ndef ack(msgid, mac, name, value, wizard_api):\n #logger.debug(mac)\n mac = \"\".join(mac.split(\":\")[:-2])\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"meshify/responses/\" + str(msgid), json.dumps([{\"value\": \"{} Success Setting: {} To: {}\".format(mac,name, value), \"msgid\": str(msgid)}]))", - "msgType": 0, - "trigger": "command_event", - "cloudName": "default" - } - ] - }, - "labels": [ - { - "key": "SN", - "value": "GF5022137006251" - }, - { - "key": "MAC", - "value": "00:18:05:1a:e5:36" - }, - { - "key": "MAC_UPPER", - "value": "00:18:05:1A:E5:37" - }, - { - "key": "MAC_LOWER", - "value": "00:18:05:1a:e5:37" - } - ], - "modbusSlave": { - "enable": 0, - "protocol": "Modbus-TCP", - "port": 502, - "slaveAddr": 1, - "int16Ord": "ab", - "int32Ord": "abcd", - "float32Ord": "abcd", - "maxConnection": 5, - "mapping_table": [] - }, - "iec104Server": { - "enable": 0, - "cotSize": 2, - "port": 2404, - "serverList": [ - { - "asduAddr": 1 - } - ], - "kValue": 12, - "wValue": 8, - "t0": 15, - "t1": 15, - "t2": 10, - "t3": 20, - "maximumLink": 5, - "timeSet": 1, - "byteOrder": "abcd", - "mapping_table": [] - }, - "opcuaServer": { - "enable": 0, - "port": 4840, - "maximumLink": 5, - "securityMode": 0, - "identifierType": "String", - "mapping_table": [] - }, - "southMetadata": {}, - "bindMetadata": { - "version": "", - "timestamp": "" - }, - "bindConfig": { - "enable": 0, - "bind": { - "modelId": "", - "modelName": "", - "srcId": "", - "srcName": "", - "devId": "", - "devName": "" - }, - "varGroups": [], - "variables": [], - "alerts": [] - }, - "version": "2.2.1" -} \ No newline at end of file diff --git a/Pub_Sub/recycle_train/mistaway/v1/pub/sendData.py b/Pub_Sub/recycle_train/mistaway/v1/pub/sendData.py deleted file mode 100644 index a047098..0000000 --- a/Pub_Sub/recycle_train/mistaway/v1/pub/sendData.py +++ /dev/null @@ -1,21 +0,0 @@ -# Enter your python code. -import json -from common.Logger import logger -from quickfaas.remotebus import publish -import re, uuid - - -def sendData(message): - #logger.debug(message) - mac = ':'.join(re.findall('..', '%012x' % uuid.getnode())) - for measure in message["measures"]: - try: - logger.debug(measure) - publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__) - except Exception as e: - logger.error(e) - - #publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__) - - - \ No newline at end of file diff --git a/Pub_Sub/recycle_train/mistaway/v1/sub/receiveCommand.py b/Pub_Sub/recycle_train/mistaway/v1/sub/receiveCommand.py deleted file mode 100644 index 0dc36c6..0000000 --- a/Pub_Sub/recycle_train/mistaway/v1/sub/receiveCommand.py +++ /dev/null @@ -1,50 +0,0 @@ -# Enter your python code. -import json -from quickfaas.measure import recall -from common.Logger import logger - -def sync(mac,value, wizard_api): - #get new values and send - try: - data = recall()#json.loads(recall().decode("utf-8")) - except Exception as e: - logger.error(e) - logger.info(data) - for controller in data: - for measure in controller["measures"]: - #publish measure - topic = "meshify/db/194/_/rigpump/" + mac + "/" + measure["name"] - payload = [{"value": measure["value"]}] - logger.debug("Sending on topic: {}".format(topic)) - logger.debug("Sending value: {}".format(payload)) - wizard_api.mqtt_publish(topic, json.dumps(payload)) -def writeplctag(mac, value, wizard_api): - try: - value = json.loads(value.replace("'",'"')) - logger.debug(value) - message = {"rigpump":{value["tag"]: value["val"]}} - wizard_api.write_plc_values(message) - except Exception as e: - logger.debug(e) - -def receiveCommand(topic, payload, wizard_api): - logger.debug(topic) - logger.debug(json.loads(payload)) - p = json.loads(payload)[0] - command = p["payload"]["name"].split(".")[1] - commands = { - "sync": sync, - "writeplctag": writeplctag, - } - commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api) - #logger.debug(command) - ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api) - -def ack(msgid, mac, name, value, wizard_api): - #logger.debug(mac) - mac = "".join(mac.split(":")[:-2]) - #logger.debug(msgid) - #logger.debug(mac) - #logger.debug(name) - #logger.debug(value) - wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}])) \ No newline at end of file diff --git a/Pub_Sub/recycle_train/mistaway/v2/pub/sendData.py b/Pub_Sub/recycle_train/mistaway/v2/pub/sendData.py deleted file mode 100644 index 3ac25a9..0000000 --- a/Pub_Sub/recycle_train/mistaway/v2/pub/sendData.py +++ /dev/null @@ -1,152 +0,0 @@ -import json, os, uuid -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 - -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): - #logger.debug(message) - mac = __topic__.split("/")[-1] #':'.join(re.findall('..', '%012x' % uuid.getnode())) - lwt(mac) - checkCredentialConfig() - for measure in message["measures"]: - try: - logger.debug(measure) - publish(__topic__ + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__) - except Exception as e: - logger.error(e) - - - \ No newline at end of file diff --git a/Pub_Sub/recycle_train/mistaway/v2/recycletrain_ma_v2.cfg b/Pub_Sub/recycle_train/mistaway/v2/recycletrain_ma_v2.cfg deleted file mode 100644 index 02add51..0000000 --- a/Pub_Sub/recycle_train/mistaway/v2/recycletrain_ma_v2.cfg +++ /dev/null @@ -1,782 +0,0 @@ -{ - "controllers": [ - { - "protocol": "EtherNet/IP", - "name": "recycle_train", - "samplePeriod": 10, - "expired": 10000, - "endpoint": "192.168.1.10:44818", - "args": {} - } - ], - "measures": [ - { - "name": "clearwell_level", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rLIT_201", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "clearwell_pressure", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rPIT_201", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_disconnect", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bDS041", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_running", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bMA041", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_start", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bMS041", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_faulted", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bXA041", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_flow", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rFIT_201", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_speed_demand_percent", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rSC041", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_frequency", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rST041", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_speed_percent", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rST041pct", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_comm", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "Alarm_Comm_Fail_Remote_Pod_1_Loss", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_ast_0", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Remote_1_Data[0]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_ast_1", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Remote_1_Data[1]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_ast_2", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Remote_1_Data[2]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_ast_3", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Remote_1_Data[3]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_ast_4", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Remote_1_Data[4]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "remote_enabled", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "Remote_Pod_1_Enable", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "outlet_flow_eu_max", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_EU_Max", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "outlet_flow_eu_min", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_EU_Min", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_flow_rate_bpd", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_FR", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_flow_rate_gpm", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_FR_GPM", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_flow_pressure", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_PV", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_flow_life_net_bpd", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_TA", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_life_fwd_bpd", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_TB", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_life_rvs_bpd", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Outlet_Flow_Meter_TC", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_ready", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bEffluentReady", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_shutdown", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bShutdownEffluentPump", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_faulted", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "BIT", - "addr": "bXA042", - "bitMap": 0, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_speed_demand_percent", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rSC042", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_frequency", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rST042", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_speed_percent", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "rST042pct", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_today_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Influent_Totalizer.Today_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_yesterday_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Influent_Totalizer.Yesterdays_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_month_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Influent_Totalizer.Monthlys_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "influent_prevmonth_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Influent_Totalizer.PrevMonthlys_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_today_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Effluent_Totalizer.Today_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_yesterday_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Effluent_Totalizer.Yesterdays_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_month_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Effluent_Totalizer.Monthlys_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "effluent_prevmonth_total", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Effluent_Totalizer.PrevMonthlys_TotalFlow", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "train_1_ast_level", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[0]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "train_2_ast_level", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[1]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "wtf_inlet_flow_rate", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[2]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "wtf_totalizer", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[3]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "wtf_today_totalizer", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[5]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "wtf_yesterday_totalizer", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[6]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "wtf_month_totalizer", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[7]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - }, - { - "name": "wtf_prev_month_totalizer", - "ctrlName": "recycle_train", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "Pod_1_Data[8]", - "decimal": 2, - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0 - } - ], - "alarmLables": [ - "default" - ], - "alarms": [], - "groups": [ - { - "name": "default", - "uploadInterval": 600, - "reference": 44 - } - ], - "misc": { - "maxAlarmRecordSz": 2000, - "logLvl": "INFO", - "coms": [ - { - "name": "rs232", - "baud": 9600, - "bits": 8, - "stopbits": 1, - "parityChk": "n" - }, - { - "name": "rs485", - "baud": 19200, - "bits": 8, - "stopbits": 1, - "parityChk": "n" - } - ] - }, - "clouds": [ - { - "cacheSize": 100, - "enable": 1, - "type": "Standard MQTT", - "args": { - "host": "mq194.imistaway.net", - "port": 1883, - "clientId": "unknown", - "auth": 1, - "tls": 0, - "cleanSession": 1, - "mqttVersion": "v3.1.1", - "keepalive": 120, - "key": "", - "cert": "", - "rootCA": "", - "verifyServer": 0, - "verifyClient": 0, - "username": "unknown", - "passwd": "unknown", - "authType": 1 - }, - "name": "default" - } - ], - "quickfaas": { - "genericFuncs": [], - "uploadFuncs": [ - { - "name": "Send Data", - "trigger": "measure_event", - "topic": "meshify/db/194/_/recycle_train/${MAC_LOWER}", - "qos": 1, - "groups": [ - "default" - ], - "funcName": "sendData", - "script": "# Enter your python code.\nimport json\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nimport re, uuid\nfrom paho.mqtt import client\n\nlwtData = {\n \"init\":False,\n \"client\": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport=\"tcp\")\n}\ndef lwt(mac):\n try:\n #if not lwtData[\"connected\"]:\n if not lwtData[\"init\"]:\n logger.info(\"INITIALIZING LWT CLIENT\")\n lwtData[\"client\"].username_pw_set(username=\"admin\", password=\"columbus\")\n lwtData[\"client\"].will_set(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\",json.dumps({\"value\":False}))\n lwtData[\"init\"] = True\n logger.info(\"Connecting to MQTT Broker for LWT purposes!!!!!!!\")\n lwtData[\"client\"].connect(\"mq194.imistaway.net\",1883, 600)\n lwtData[\"client\"].publish(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\", json.dumps({\"value\":True}))\n except Exception as e:\n logger.error(\"LWT DID NOT DO THE THING\")\n logger.error(e)\n\ndef sendData(message):\n #logger.debug(message)\n mac = __topic__.split(\"/\")[-1] #':'.join(re.findall('..', '%012x' % uuid.getnode()))\n lwt(mac)\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n publish(__topic__ + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": measure[\"value\"]}), __qos__)\n except Exception as e:\n logger.error(e)\n \n #publish(__topic__, json.dumps({measure[\"name\"]: measure[\"value\"]}), __qos__)\n\n\n ", - "cloudName": "default", - "msgType": 0 - } - ], - "downloadFuncs": [ - { - "name": "Commands", - "topic": "meshify/sets/194/${MAC_UPPER}:01:99", - "qos": 1, - "funcName": "receiveCommand", - "payload_type": "Plaintext", - "script": "# Enter your python code.\nimport json\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(mac,value, wizard_api):\n #get new values and send\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.info(data)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n topic = \"meshify/db/194/_/recycle_train/\" + mac + \"/\" + measure[\"name\"]\n payload = [{\"value\": measure[\"value\"]}]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n wizard_api.mqtt_publish(topic, json.dumps(payload))\ndef writeplctag(mac, value, wizard_api):\n try:\n value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"recycle_train\":{value[\"tag\"]: value[\"val\"]}}\n wizard_api.write_plc_values(message)\n except Exception as e:\n logger.debug(e)\n \ndef receiveCommand(topic, payload, wizard_api):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)[0]\n command = p[\"payload\"][\"name\"].split(\".\")[1]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n }\n commands[command](p[\"mac\"].lower(),p[\"payload\"][\"value\"], wizard_api)\n #logger.debug(command)\n ack(p[\"msgId\"], p[\"mac\"], p[\"payload\"][\"name\"].split(\".\")[1], p[\"payload\"][\"value\"], wizard_api)\n\ndef ack(msgid, mac, name, value, wizard_api):\n #logger.debug(mac)\n mac = \"\".join(mac.split(\":\")[:-2])\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"meshify/responses/\" + str(msgid), json.dumps([{\"value\": \"{} Success Setting: {} To: {}\".format(mac,name, value), \"msgid\": str(msgid)}]))", - "msgType": 0, - "trigger": "command_event", - "cloudName": "default" - } - ] - }, - "labels": [ - { - "key": "SN", - "value": "GF5022137006251" - }, - { - "key": "MAC", - "value": "00:18:05:1a:e5:36" - } - ], - "modbusSlave": { - "enable": 0, - "protocol": "Modbus-TCP", - "port": 502, - "slaveAddr": 1, - "int16Ord": "ab", - "int32Ord": "abcd", - "float32Ord": "abcd", - "maxConnection": 5, - "mapping_table": [] - }, - "iec104Server": { - "enable": 0, - "cotSize": 2, - "port": 2404, - "serverList": [ - { - "asduAddr": 1 - } - ], - "kValue": 12, - "wValue": 8, - "t0": 15, - "t1": 15, - "t2": 10, - "t3": 20, - "maximumLink": 5, - "timeSet": 1, - "byteOrder": "abcd", - "mapping_table": [] - }, - "opcuaServer": { - "enable": 0, - "port": 4840, - "maximumLink": 5, - "securityMode": 0, - "identifierType": "String", - "mapping_table": [] - }, - "southMetadata": {}, - "bindMetadata": { - "version": "", - "timestamp": "" - }, - "bindConfig": { - "enable": 0, - "bind": { - "modelId": "", - "modelName": "", - "srcId": "", - "srcName": "", - "devId": "", - "devName": "" - }, - "varGroups": [], - "variables": [], - "alerts": [] - }, - "version": "2.2.1" -} \ No newline at end of file diff --git a/Pub_Sub/recycle_train/mistaway/v2/sub/receiveCommand.py b/Pub_Sub/recycle_train/mistaway/v2/sub/receiveCommand.py deleted file mode 100644 index 5927fa6..0000000 --- a/Pub_Sub/recycle_train/mistaway/v2/sub/receiveCommand.py +++ /dev/null @@ -1,50 +0,0 @@ -# Enter your python code. -import json -from quickfaas.measure import recall -from common.Logger import logger - -def sync(mac,value, wizard_api): - #get new values and send - try: - data = recall()#json.loads(recall().decode("utf-8")) - except Exception as e: - logger.error(e) - logger.info(data) - for controller in data: - for measure in controller["measures"]: - #publish measure - topic = "meshify/db/194/_/recycle_train/" + mac + "/" + measure["name"] - payload = [{"value": measure["value"]}] - logger.debug("Sending on topic: {}".format(topic)) - logger.debug("Sending value: {}".format(payload)) - wizard_api.mqtt_publish(topic, json.dumps(payload)) -def writeplctag(mac, value, wizard_api): - try: - value = json.loads(value.replace("'",'"')) - logger.debug(value) - message = {"recycle_train":{value["tag"]: value["val"]}} - wizard_api.write_plc_values(message) - except Exception as e: - logger.debug(e) - -def receiveCommand(topic, payload, wizard_api): - logger.debug(topic) - logger.debug(json.loads(payload)) - p = json.loads(payload)[0] - command = p["payload"]["name"].split(".")[1] - commands = { - "sync": sync, - "writeplctag": writeplctag, - } - commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api) - #logger.debug(command) - ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api) - -def ack(msgid, mac, name, value, wizard_api): - #logger.debug(mac) - mac = "".join(mac.split(":")[:-2]) - #logger.debug(msgid) - #logger.debug(mac) - #logger.debug(name) - #logger.debug(value) - wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}])) \ No newline at end of file diff --git a/Pub_Sub/rigpump/.DS_Store b/Pub_Sub/rigpump/.DS_Store index 3495147..39e1d91 100644 Binary files a/Pub_Sub/rigpump/.DS_Store and b/Pub_Sub/rigpump/.DS_Store differ diff --git a/Pub_Sub/rigpump/mistaway/v3/device_supervisor_rigpumpv3.cfg b/Pub_Sub/rigpump/mistaway/device_supervisor_rigpumpv3.cfg similarity index 100% rename from Pub_Sub/rigpump/mistaway/v3/device_supervisor_rigpumpv3.cfg rename to Pub_Sub/rigpump/mistaway/device_supervisor_rigpumpv3.cfg diff --git a/Pub_Sub/rigpump/mistaway/v4/pub/sendData.py b/Pub_Sub/rigpump/mistaway/pub/sendData.py similarity index 100% rename from Pub_Sub/rigpump/mistaway/v4/pub/sendData.py rename to Pub_Sub/rigpump/mistaway/pub/sendData.py diff --git a/Pub_Sub/rigpump/mistaway/v4/rigpump_ma_v4.cfg b/Pub_Sub/rigpump/mistaway/rigpump_ma_v4.cfg similarity index 100% rename from Pub_Sub/rigpump/mistaway/v4/rigpump_ma_v4.cfg rename to Pub_Sub/rigpump/mistaway/rigpump_ma_v4.cfg diff --git a/Pub_Sub/rigpump/mistaway/v4/sub/receiveCommand.py b/Pub_Sub/rigpump/mistaway/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/rigpump/mistaway/v4/sub/receiveCommand.py rename to Pub_Sub/rigpump/mistaway/sub/receiveCommand.py diff --git a/Pub_Sub/rigpump/mistaway/v3/pub/sendData.py b/Pub_Sub/rigpump/mistaway/v3/pub/sendData.py deleted file mode 100644 index 9b5155a..0000000 --- a/Pub_Sub/rigpump/mistaway/v3/pub/sendData.py +++ /dev/null @@ -1,54 +0,0 @@ -# Enter your python code. -import json -from common.Logger import logger -from quickfaas.remotebus import publish -import re, uuid - - -def sendData(message): - #logger.debug(message) - mac = ':'.join(re.findall('..', '%012x' % uuid.getnode())) - for measure in message["measures"]: - try: - logger.debug(measure) - if measure["name"] in ["auto_manual", "auto_control_mode", "device_status"]: - logger.debug("Converting DINT/BOOL to STRING") - value = convert_int(measure["name"], measure["value"]) - logger.debug("Converted {} to {}".format(measure["value"], value)) - publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": value}), __qos__) - else: - publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__) - except Exception as e: - logger.error(e) - - #publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__) - -def convert_int(plc_tag, value): - auto_manual = { - 0: "Manual", - 1: "Auto" - } - - auto_control_mode = { - 0: "Pressure", - 1: "Flow" - } - - device_status = { - 1: "Running", - 64: "Idle", - 128: "Overpressure", - 1024: "Faulted" - } - - p - - plc_tags = { - "auto_manual": auto_manual.get(value, "Invalid Code"), - "auto_control_mode": auto_control_mode.get(value, "Invalid Code"), - "device_status": device_status.get(value, "Invalid Code"), - } - - return plc_tags.get(plc_tag, "Invalid Tag") - - \ No newline at end of file diff --git a/Pub_Sub/rigpump/mistaway/v3/sub/receiveCommand.py b/Pub_Sub/rigpump/mistaway/v3/sub/receiveCommand.py deleted file mode 100644 index 0dc36c6..0000000 --- a/Pub_Sub/rigpump/mistaway/v3/sub/receiveCommand.py +++ /dev/null @@ -1,50 +0,0 @@ -# Enter your python code. -import json -from quickfaas.measure import recall -from common.Logger import logger - -def sync(mac,value, wizard_api): - #get new values and send - try: - data = recall()#json.loads(recall().decode("utf-8")) - except Exception as e: - logger.error(e) - logger.info(data) - for controller in data: - for measure in controller["measures"]: - #publish measure - topic = "meshify/db/194/_/rigpump/" + mac + "/" + measure["name"] - payload = [{"value": measure["value"]}] - logger.debug("Sending on topic: {}".format(topic)) - logger.debug("Sending value: {}".format(payload)) - wizard_api.mqtt_publish(topic, json.dumps(payload)) -def writeplctag(mac, value, wizard_api): - try: - value = json.loads(value.replace("'",'"')) - logger.debug(value) - message = {"rigpump":{value["tag"]: value["val"]}} - wizard_api.write_plc_values(message) - except Exception as e: - logger.debug(e) - -def receiveCommand(topic, payload, wizard_api): - logger.debug(topic) - logger.debug(json.loads(payload)) - p = json.loads(payload)[0] - command = p["payload"]["name"].split(".")[1] - commands = { - "sync": sync, - "writeplctag": writeplctag, - } - commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api) - #logger.debug(command) - ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api) - -def ack(msgid, mac, name, value, wizard_api): - #logger.debug(mac) - mac = "".join(mac.split(":")[:-2]) - #logger.debug(msgid) - #logger.debug(mac) - #logger.debug(name) - #logger.debug(value) - wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}])) \ No newline at end of file diff --git a/Pub_Sub/tankalarms/thingsboard/v1/tankalarms_tb_v1.cfg b/Pub_Sub/tankalarms/thingsboard/tankalarms_tb_v1.cfg similarity index 100% rename from Pub_Sub/tankalarms/thingsboard/v1/tankalarms_tb_v1.cfg rename to Pub_Sub/tankalarms/thingsboard/tankalarms_tb_v1.cfg diff --git a/Pub_Sub/tankalarms/thingsboard/v1/tankalarmAlarms.csv b/Pub_Sub/tankalarms/thingsboard/v1/tankalarmAlarms.csv deleted file mode 100644 index bda0d8b..0000000 --- a/Pub_Sub/tankalarms/thingsboard/v1/tankalarmAlarms.csv +++ /dev/null @@ -1,9 +0,0 @@ -AlarmName,ControllerName,MeasuringPointName,AlarmLevel,Condition1,Operand1,CombineMethod,Condition2,Operand2,AlarmContent -water_hihi_alm,tankalarms,water_hihi_alm,5,eq,1.0,none,eq,,Water Tank HiHi -water_hi_alm,tankalarms,water_hi_alm,5,eq,1.0,none,eq,,Water Tank Hi -water_batt_lolo_alm,tankalarms,water_batt_lolo_alm,5,eq,1.0,none,eq,,Water Tank Battery LoLo -water_comm_fail_alm,tankalarms,water_comm_fail_alm,5,eq,1.0,none,eq,,Water Tank Comms Fail -oil_hihi_alm,tankalarms,oil_hihi_alm,5,eq,1.0,none,eq,,Oil Tank HiHi -oil_hi_alm,tankalarms,oil_hi_alm,5,eq,1.0,none,eq,,Oil Tank Hi -oil_batt_lolo_alm,tankalarms,oil_batt_lolo_alm,5,eq,1.0,none,eq,,Oil Tank Battery LoLo -oil_comm_fail_alm,tankalarms,oil_comm_fail_alm,5,eq,1.0,none,eq,,Oil Tank Comms Fail \ No newline at end of file diff --git a/Pub_Sub/tankalarms/thingsboard/v1/tankalarms.csv b/Pub_Sub/tankalarms/thingsboard/v1/tankalarms.csv deleted file mode 100644 index d518115..0000000 --- a/Pub_Sub/tankalarms/thingsboard/v1/tankalarms.csv +++ /dev/null @@ -1,20 +0,0 @@ -MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit -water_level,tankalarms,default,periodic,FLOAT,WaterTxLevel,2,1,ro,,,none,,,,,,,, -water_batt_volts,tankalarms,default,periodic,FLOAT,WaterTxBatVolts,2,1,ro,,,none,,,,,,,, -water_rssi,tankalarms,default,periodic,FLOAT,WaterTxRSSI,2,1,ro,,,none,,,,,,,, -water_hihi_spt,tankalarms,default,periodic,FLOAT,WaterTx_HHSP,2,1,rw,,,none,,,,,,,, -water_hi_spt,tankalarms,default,periodic,FLOAT,WaterTx_HSp,2,1,rw,,,none,,,,,,,, -water_hihi_alm,tankalarms,default,periodic,BIT,WaterTx_HHAlrm,2,1,ro,,,none,,,,,,,, -water_hi_alm,tankalarms,default,periodic,BIT,WaterTx_HAlrm,2,1,ro,,,none,,,,,,,, -water_batt_lolo_alm,tankalarms,default,periodic,BIT,WaterTxBatVolts_LLAlrm,2,1,ro,,,none,,,,,,,, -water_comm_fail_alm,tankalarms,default,periodic,BIT,WaterTx_RF_CommFail,2,1,ro,,,none,,,,,,,, -oil_level,tankalarms,default,periodic,FLOAT,OilTxLevel,2,1,ro,,,none,,,,,,,, -oil_batt_volts,tankalarms,default,periodic,FLOAT,OilTxBatVolts,2,1,ro,,,none,,,,,,,, -oil_rssi,tankalarms,default,periodic,FLOAT,OilTxRSSI,2,1,ro,,,none,,,,,,,, -oil_hihi_spt,tankalarms,default,periodic,FLOAT,OilTx_HHSP,2,1,rw,,,none,,,,,,,, -oil_hi_spt,tankalarms,default,periodic,FLOAT,OilTx_HSp,2,1,rw,,,none,,,,,,,, -oil_hihi_alm,tankalarms,default,periodic,BIT,OilTx_HHAlrm,2,1,ro,,,none,,,,,,,, -oil_hi_alm,tankalarms,default,periodic,BIT,OilTx_HAlrm,2,1,ro,,,none,,,,,,,, -oil_batt_lolo_alm,tankalarms,default,periodic,BIT,OilTxBatVolts_LLAlrm,2,1,ro,,,none,,,,,,,, -oil_comm_fail_alm,tankalarms,default,periodic,BIT,OilTx_RF_CommFail,2,1,ro,,,none,,,,,,,, -alarmreset,tankalarms,default,periodic,BIT,Reset,2,1,rw,,,none,,,,,,,, \ No newline at end of file diff --git a/Pub_Sub/transferlite/v1/device_supervisor_transferlitev1.cfg b/Pub_Sub/transferlite/mistaway/device_supervisor_transferlitev1.cfg similarity index 100% rename from Pub_Sub/transferlite/v1/device_supervisor_transferlitev1.cfg rename to Pub_Sub/transferlite/mistaway/device_supervisor_transferlitev1.cfg diff --git a/Pub_Sub/transferlite/v1/pub/sendData.py b/Pub_Sub/transferlite/mistaway/pub/sendData.py similarity index 100% rename from Pub_Sub/transferlite/v1/pub/sendData.py rename to Pub_Sub/transferlite/mistaway/pub/sendData.py diff --git a/Pub_Sub/transferlite/v1/sub/receiveCommand.py b/Pub_Sub/transferlite/mistaway/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/transferlite/v1/sub/receiveCommand.py rename to Pub_Sub/transferlite/mistaway/sub/receiveCommand.py diff --git a/Pub_Sub/valvecontroller/thingsboard/v2/pub/sendData.py b/Pub_Sub/valvecontroller/thingsboard/pub/sendData.py similarity index 100% rename from Pub_Sub/valvecontroller/thingsboard/v2/pub/sendData.py rename to Pub_Sub/valvecontroller/thingsboard/pub/sendData.py diff --git a/Pub_Sub/valvecontroller/thingsboard/v2/sub/receiveCommand.py b/Pub_Sub/valvecontroller/thingsboard/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/valvecontroller/thingsboard/v2/sub/receiveCommand.py rename to Pub_Sub/valvecontroller/thingsboard/sub/receiveCommand.py diff --git a/Pub_Sub/valvecontroller/thingsboard/v1/valvecontroller_tb_v1.cfg b/Pub_Sub/valvecontroller/thingsboard/valvecontroller_tb_v1.cfg similarity index 100% rename from Pub_Sub/valvecontroller/thingsboard/v1/valvecontroller_tb_v1.cfg rename to Pub_Sub/valvecontroller/thingsboard/valvecontroller_tb_v1.cfg diff --git a/Pub_Sub/valvecontroller/thingsboard/v2/valvecontroller_tb_v2.cfg b/Pub_Sub/valvecontroller/thingsboard/valvecontroller_tb_v2.cfg similarity index 100% rename from Pub_Sub/valvecontroller/thingsboard/v2/valvecontroller_tb_v2.cfg rename to Pub_Sub/valvecontroller/thingsboard/valvecontroller_tb_v2.cfg diff --git a/code snippets/restructure pub_sub.ipynb b/code snippets/restructure pub_sub.ipynb new file mode 100644 index 0000000..09f5ab1 --- /dev/null +++ b/code snippets/restructure pub_sub.ipynb @@ -0,0 +1,194 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Working on rigpump\n", + "Working on rigpump .DS_Store\n", + "Working on rigpump mistaway\n", + "['v4', 'v3']\n", + "Working on tankalarms\n", + "Working on tankalarms .DS_Store\n", + "Working on tankalarms thingsboard\n", + "['v1']\n", + "Working on cameratrailer_hk\n", + "Working on cameratrailer_hk .DS_Store\n", + "Working on cameratrailer_hk thingsboard\n", + "['v5']\n", + "Working on cameratrailer_hk hikvision_config.cnf\n", + "Working on .DS_Store\n", + "Working on config_manager.ipynb\n", + "Working on advvfdipp_sru\n", + "Working on advvfdipp_sru .DS_Store\n", + "Working on advvfdipp_sru thingsboard\n", + "['v1', 'v2']\n", + "Working on hrtankbattery\n", + "Working on hrtankbattery .DS_Store\n", + "Working on hrtankbattery thingsboard\n", + "['v1', 'v2', 'v3']\n", + "Working on hrtankbattery hrtankbattery_tags.json\n", + "Working on flowmeterskid\n", + "Working on flowmeterskid .DS_Store\n", + "Working on flowmeterskid flowmeterskid_ethernetip_baseline.py\n", + "Working on flowmeterskid thingsboard\n", + "['v1', 'v0', 'v2']\n", + "Working on flowmeterskid mistaway\n", + "['v1']\n", + "Working on dual_flowmeter\n", + "Working on dual_flowmeter .DS_Store\n", + "Working on dual_flowmeter thingsboard\n", + "['v1']\n", + "Working on dual_flowmeter mistaway\n", + "['v1', 'v0']\n", + "Working on plcfreshwater_advvfdipp\n", + "Working on plcfreshwater_advvfdipp .DS_Store\n", + "Working on plcfreshwater_advvfdipp thingsboard\n", + "['v1', 'v2']\n", + "Working on hrswd\n", + "Working on hrswd .DS_Store\n", + "Working on hrswd thingsboard\n", + "['v1']\n", + "Working on advvfdipp_wo_downhole\n", + "Working on advvfdipp_wo_downhole .DS_Store\n", + "Working on advvfdipp_wo_downhole thingsboard\n", + "['v1']\n", + "Working on transferlite\n", + "Working on transferlite .DS_Store\n", + "Working on transferlite mistaway\n", + "['v1']\n", + "Working on __pycache__\n", + "Working on __pycache__ convert_config.cpython-310.pyc\n", + "Working on __pycache__ convert_config.cpython-39.pyc\n", + "Working on hrvalvecontroller\n", + "Working on hrvalvecontroller .DS_Store\n", + "Working on hrvalvecontroller thingsboard\n", + "['v1']\n", + "Working on receiveAttributeResponse.py\n", + "Working on convert_config.py\n", + "Working on advvfdipp\n", + "Working on advvfdipp advvfdipp.csv\n", + "Working on advvfdipp .DS_Store\n", + "Working on advvfdipp thingsboard\n", + "['v1', 'v2', 'v4', 'v3']\n", + "Working on advvfdipp mistaway\n", + "['v1', 'v2', 'v4', 'v3']\n", + "Working on advvfdipp advvfdipp_tags.json\n", + "Working on receiveAttributeUpdate.py\n", + "Working on valvecontroller\n", + "Working on valvecontroller .DS_Store\n", + "Working on valvecontroller thingsboard\n", + "['v1', 'v2']\n", + "Working on hrbooster\n", + "Working on hrbooster .DS_Store\n", + "Working on hrbooster thingsboard\n", + "['v1']\n", + "Working on .ipynb_checkpoints\n", + "Working on fkplcpond\n", + "Working on fkplcpond .DS_Store\n", + "Working on fkplcpond thingsboard\n", + "['v1', 'v2', 'v3']\n", + "Working on abbflow\n", + "Working on abbflow .DS_Store\n", + "Working on abbflow thingsboard\n", + "['v1', 'v2']\n", + "Working on cameratrailer\n", + "Working on cameratrailer .DS_Store\n", + "Working on cameratrailer thingsboard\n", + "['v1', 'v2', 'v4', 'v3']\n", + "Working on base.py\n", + "Working on plcfreshwater\n", + "Working on plcfreshwater .DS_Store\n", + "Working on plcfreshwater thingsboard\n", + "['v1']\n", + "Working on plcfreshwater mistaway\n", + "['v1']\n", + "Working on gateway\n", + "Working on gateway .DS_Store\n", + "Working on gateway thingsboard\n", + "['v1']\n", + "Working on gateway a_pond.cfg\n", + "Working on gateway 1701.cfg\n", + "Working on gateway tree.cfg\n", + "Working on gateway measure_gateway.csv\n", + "Working on promagmbs\n", + "Working on promagmbs .DS_Store\n", + "Working on promagmbs mistaway\n", + "['v1']\n" + ] + } + ], + "source": [ + "import os\n", + "import shutil\n", + "import re\n", + "\n", + "def convert_structure(root):\n", + " for devicetype in os.listdir(root):\n", + " print(f\"Working on {devicetype}\")\n", + " devicetype_path = os.path.join(root, devicetype)\n", + " #print(devicetype_path)\n", + " if os.path.isdir(devicetype_path):\n", + " for platform in os.listdir(devicetype_path):\n", + " print(f\"Working on {devicetype} {platform}\")\n", + " platform_path = os.path.join(devicetype_path, platform)\n", + " if os.path.isdir(platform_path):\n", + " versions = [d for d in os.listdir(platform_path) if re.match(r'v\\d+', d)]\n", + " print(versions)\n", + " versions_sorted = sorted(versions, key=lambda x: int(re.search(r'v(\\d+)', x).group(1)))\n", + "\n", + " # Move configuration files from all versions\n", + " for version in versions_sorted:\n", + " version_path = os.path.join(platform_path, version)\n", + " for file in os.listdir(version_path):\n", + " if file.endswith('.cfg'):\n", + " shutil.move(os.path.join(version_path, file), platform_path)\n", + "\n", + " # Move pub and sub folders from the latest version\n", + " latest_version_path = os.path.join(platform_path, versions_sorted[-1])\n", + " for folder in ['pub', 'sub']:\n", + " folder_path = os.path.join(latest_version_path, folder)\n", + " if os.path.isdir(folder_path):\n", + " new_folder_path = os.path.join(platform_path, folder)\n", + " if os.path.exists(new_folder_path):\n", + " shutil.rmtree(new_folder_path)\n", + " shutil.move(folder_path, platform_path)\n", + "\n", + " # Remove old version folders\n", + " for version in versions_sorted:\n", + " version_path = os.path.join(platform_path, version)\n", + " shutil.rmtree(version_path)\n", + "\n", + "# Example usage\n", + "root = \"/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub\"\n", + "convert_structure(root)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "tbDataCollector", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}