diff --git a/Pub_Sub/.DS_Store b/Pub_Sub/.DS_Store index cde3881..ca3ded3 100644 Binary files a/Pub_Sub/.DS_Store and b/Pub_Sub/.DS_Store differ diff --git a/Pub_Sub/flowmeterskid/thingsboard/v1/flowmeterskid_tb_v1.cfg b/Pub_Sub/flowmeterskid/thingsboard/v1/flowmeterskid_tb_v1.cfg index 7ad4fdf..2f6a4ef 100644 --- a/Pub_Sub/flowmeterskid/thingsboard/v1/flowmeterskid_tb_v1.cfg +++ b/Pub_Sub/flowmeterskid/thingsboard/v1/flowmeterskid_tb_v1.cfg @@ -1,330 +1,345 @@ { - "controllers": [ - { - "protocol": "Modbus-RTU", - "name": "flowmeter", - "endpoint": "rs485", - "args": { - "slaveAddr": 247, - "int16Ord": "ab", - "int32Ord": "cdab", - "float32Ord": "cdab", - "int64Ord": "ghefcdab", - "enableMsecSample": 0, - "continuousAcquisition": 1, - "maxContinuousNumber": 64, - "communicationInterval": 3, - "msecSamplePeriod": 500, - "msecPackage": 20 - }, - "samplePeriod": 10, - "expired": 10000 - } - ], - "measures": [ - { - "name": "flowrate", - "ctrlName": "flowmeter", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "43874", - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "decimal": 2, - "gain": "1.0", - "offset": "0.0", - "msecSample": 0 - }, - { - "name": "totalizer_1", - "ctrlName": "flowmeter", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "42610", - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "decimal": 2, - "gain": "1.0", - "offset": "0.0", - "msecSample": 0 - }, - { - "name": "totalizer_2", - "ctrlName": "flowmeter", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "42810", - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "decimal": 2, - "gain": "1.0", - "offset": "0.0", - "msecSample": 0 - }, - { - "name": "totalizer_3", - "ctrlName": "flowmeter", - "group": "default", - "uploadType": "periodic", - "dataType": "FLOAT", - "addr": "43010", - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "decimal": 2, - "gain": "1.0", - "offset": "0.0", - "msecSample": 0 - }, - { - "name": "flow_unit", - "ctrlName": "flowmeter", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "42103", - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "msecSample": 0 - }, - { - "name": "totalizer_1_unit", - "ctrlName": "flowmeter", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "44604", - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "msecSample": 0 - }, - { - "name": "totalizer_2_unit", - "ctrlName": "flowmeter", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "44605", - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "msecSample": 0 - }, - { - "name": "totalizer_3_unit", - "ctrlName": "flowmeter", - "group": "default", - "uploadType": "periodic", - "dataType": "INT", - "addr": "44606", - "readWrite": "ro", - "unit": "", - "desc": "", - "transformType": 0, - "gain": "1.0", - "offset": "0.0", - "msecSample": 0 - } - ], - "alarmLables": [ - "default" - ], - "alarms": [], + "controllers": [ + { + "protocol": "Modbus-RTU", + "name": "flowmeter", + "endpoint": "rs485", + "args": { + "slaveAddr": 247, + "int16Ord": "ab", + "int32Ord": "cdab", + "float32Ord": "cdab", + "int64Ord": "ghefcdab", + "enableMsecSample": 0, + "continuousAcquisition": 1, + "maxContinuousNumber": 64, + "communicationInterval": 3, + "msecSamplePeriod": 500, + "msecPackage": 20 + }, + "samplePeriod": 10, + "expired": 10000 + } + ], + "measures": [ + { + "name": "flowrate", + "ctrlName": "flowmeter", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "43874", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "decimal": 2, + "gain": "1.0", + "offset": "0.0", + "msecSample": 0 + }, + { + "name": "totalizer_1", + "ctrlName": "flowmeter", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "42610", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "decimal": 2, + "gain": "1.0", + "offset": "0.0", + "msecSample": 0 + }, + { + "name": "totalizer_2", + "ctrlName": "flowmeter", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "42810", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "decimal": 2, + "gain": "1.0", + "offset": "0.0", + "msecSample": 0 + }, + { + "name": "totalizer_3", + "ctrlName": "flowmeter", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "43010", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "decimal": 2, + "gain": "1.0", + "offset": "0.0", + "msecSample": 0 + }, + { + "name": "flow_unit", + "ctrlName": "flowmeter", + "group": "default", + "uploadType": "periodic", + "dataType": "INT", + "addr": "42103", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "msecSample": 0 + }, + { + "name": "totalizer_1_unit", + "ctrlName": "flowmeter", + "group": "default", + "uploadType": "periodic", + "dataType": "INT", + "addr": "44604", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "msecSample": 0 + }, + { + "name": "totalizer_2_unit", + "ctrlName": "flowmeter", + "group": "default", + "uploadType": "periodic", + "dataType": "INT", + "addr": "44605", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "msecSample": 0 + }, + { + "name": "totalizer_3_unit", + "ctrlName": "flowmeter", + "group": "default", + "uploadType": "periodic", + "dataType": "INT", + "addr": "44606", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "msecSample": 0 + }, + { + "name": "reset_totalizers", + "ctrlName": "flowmeter", + "group": "default", + "uploadType": "periodic", + "dataType": "INT", + "addr": "42609", + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "gain": "1.0", + "offset": "0.0", + "msecSample": 0 + } + ], + "alarmLables": [ + "default" + ], + "alarms": [], + "groups": [ + { + "name": "default", + "uploadInterval": 600 + } + ], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "DEBUG", + "coms": [ + { + "name": "rs232", + "baud": 9600, + "bits": 8, + "parityChk": "n", + "stopbits": 1 + }, + { + "name": "rs485", + "baud": 19200, + "bits": 8, + "parityChk": "n", + "stopbits": 1 + } + ] + }, + "clouds": [ + { + "cacheSize": 10000, + "enable": 1, + "name": "default", + "type": "Standard MQTT", + "args": { + "host": "hp.henrypump.cloud", + "port": 1883, + "clientId": "unknown", + "auth": 1, + "tls": 0, + "cleanSession": 0, + "mqttVersion": "v3.1.1", + "keepalive": 60, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "unknown", + "passwd": "unknown" + } + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "qos": 1, + "funcName": "sendData", + "script": "import json, os\nfrom datetime import datetime as dt\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom mobiuspi_lib.gps import GPS\nfrom quickfaas.global_dict import get as get_params\nfrom quickfaas.global_dict import _set_global_args\n\ndef reboot():\n #basic = Basic()\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\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.info(\"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.info(\"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.info(\"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.info(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.info(\"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.info(\"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.info(\"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.info(\"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.info(\"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.info(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n \n return cfg\n\npayload = {}\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.info(\"-----INITIALIZING TOTALIZERS-----\")\n totalizers = {\n \"day\": 0,\n \"week\": 0,\n \"month\": 0,\n \"year\": 0,\n \"lifetime\": 0,\n \"dayHolding\": 0,\n \"weekHolding\": 0,\n \"monthHolding\": 0,\n \"yearHolding\": 0\n }\n except:\n totalizers = {\n \"day\": 0,\n \"week\": 0,\n \"month\": 0,\n \"year\": 0,\n \"lifetime\": 0,\n \"dayHolding\": 0,\n \"weekHolding\": 0,\n \"monthHolding\": 0,\n \"yearHolding\": 0\n }\n return totalizers\n\n\n\n\ndef sendData(message,wizard_api):\n logger.debug(message)\n checkCredentialConfig()\n payload = {\"ts\": (round(dt.timestamp(dt.now())/600)*600)*1000, \"values\": {}}\n resetPayload = {\"ts\": \"\", \"values\": {}}\n for measure in message[\"values\"][\"flowmeter\"].keys():\n try:\n if measure in [\"totalizer_1\"]:\n payload[\"values\"][\"day_volume\"], dayReset = totalizeDay(message[\"values\"][\"flowmeter\"][measure][\"raw_data\"])\n payload[\"values\"][\"week_volume\"], weekReset = totalizeWeek(message[\"values\"][\"flowmeter\"][measure][\"raw_data\"])\n payload[\"values\"][\"month_volume\"], monthReset = totalizeMonth(message[\"values\"][\"flowmeter\"][measure][\"raw_data\"])\n payload[\"values\"][\"year_volume\"], yearReset = totalizeYear(message[\"values\"][\"flowmeter\"][measure][\"raw_data\"])\n payload[\"values\"][measure] = message[\"values\"][\"flowmeter\"][measure][\"raw_data\"]\n except Exception as e:\n logger.error(e)\n try:\n payload[\"values\"][\"latitude\"], payload[\"values\"][\"longitude\"], payload[\"values\"][\"speed\"] = getGPS()\n except:\n logger.error(\"Could not get GPS coordinates\")\n publish(__topic__, json.dumps(payload), __qos__)\n\n if dayReset:\n resetPayload[\"values\"][\"yesterday_volume\"] = payload[\"values\"][\"day_volume\"]\n resetPayload[\"values\"][\"day_volume\"] = 0\n if weekReset:\n resetPayload[\"values\"][\"last_week_volume\"] = payload[\"values\"][\"week_volume\"]\n resetPayload[\"values\"][\"week_volume\"] = 0\n if monthReset:\n resetPayload[\"values\"][\"last_month_volume\"] = payload[\"values\"][\"month_volume\"]\n resetPayload[\"values\"][\"month_volume\"] = 0\n if yearReset:\n resetPayload[\"values\"][\"last_year_volume\"] = payload[\"values\"][\"year_volume\"]\n resetPayload[\"values\"][\"year_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\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 getGPS():\n # Create a gps instance\n gps = GPS()\n\n # Retrieve GPS information\n position_status = gps.get_position_status()\n logger.debug(\"position_status: \")\n logger.debug(position_status)\n latitude = position_status[\"latitude\"].split(\" \")\n longitude = position_status[\"longitude\"].split(\" \")\n lat_dec = int(latitude[0][:-1]) + (float(latitude[1][:-1])/60)\n lon_dec = int(longitude[0][:-1]) + (float(longitude[1][:-1])/60)\n if latitude[2] == \"S\":\n lat_dec = lat_dec * -1\n if longitude[2] == \"W\":\n lon_dec = lon_dec * -1\n #lat_dec = round(lat_dec, 7)\n #lon_dec = round(lon_dec, 7)\n logger.info(\"HERE IS THE GPS COORDS\")\n logger.info(f\"LATITUDE: {lat_dec}, LONGITUDE: {lon_dec}\")\n speedKnots = position_status[\"speed\"].split(\" \")\n speedMPH = float(speedKnots[0]) * 1.151\n return (f\"{lat_dec:.8f}\",f\"{lon_dec:.8f}\",f\"{speedMPH:.2f}\")\n\ndef totalizeDay(lifetime):\n totalizers = get_totalizers()\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n reset = False\n value = lifetime - totalizers[\"dayHolding\"]\n if not int(now.strftime(\"%d\")) == int(totalizers[\"day\"]):\n totalizers[\"dayHolding\"] = lifetime\n totalizers[\"day\"] = int(now.strftime(\"%d\"))\n saveTotalizers(totalizers)\n reset = True\n return (value,reset)\n\ndef totalizeWeek(lifetime):\n totalizers = get_totalizers()\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n reset = False\n value = lifetime - totalizers[\"weekHolding\"]\n if not now.strftime(\"%U\") == totalizers[\"week\"] and now.strftime(\"%a\") == \"Sun\":\n totalizers[\"weekHolding\"] = lifetime\n totalizers[\"week\"] = now.strftime(\"%U\")\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 reset = False\n value = lifetime - totalizers[\"monthHolding\"]\n if not int(now.strftime(\"%m\")) == int(totalizers[\"month\"]):\n totalizers[\"monthHolding\"] = lifetime\n totalizers[\"month\"] = now.strftime(\"%m\")\n saveTotalizers(totalizers)\n reset = True\n return (value,reset)\n\ndef totalizeYear(lifetime):\n totalizers = get_totalizers()\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n reset = False\n value = lifetime - totalizers[\"yearHolding\"]\n if not int(now.strftime(\"%Y\")) == int(totalizers[\"year\"]):\n totalizers[\"yearHolding\"] = lifetime\n totalizers[\"year\"] = now.strftime(\"%Y\")\n saveTotalizers(totalizers)\n reset = True\n return (value, reset)", + "name": "sendData", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "cloudName": "default", "groups": [ - { - "name": "default", - "uploadInterval": 600 - } + "default" ], - "misc": { - "maxAlarmRecordSz": 2000, - "logLvl": "INFO", - "coms": [ - { - "name": "rs232", - "baud": 9600, - "bits": 8, - "parityChk": "n", - "stopbits": 1 - }, - { - "name": "rs485", - "baud": 19200, - "bits": 8, - "parityChk": "n", - "stopbits": 1 - } - ] - }, - "clouds": [ - { - "cacheSize": 10000, - "enable": 1, - "name": "default", - "type": "Standard MQTT", - "args": { - "host": "hp.henrypump.cloud", - "port": 1883, - "clientId": "unknown", - "auth": 1, - "tls": 0, - "cleanSession": 0, - "mqttVersion": "v3.1.1", - "keepalive": 60, - "key": "", - "cert": "", - "rootCA": "", - "verifyServer": 0, - "verifyClient": 0, - "username": "unknown", - "passwd": "unknown" - } - } - ], - "quickfaas": { - "genericFuncs": [], - "uploadFuncs": [ - { - "qos": 1, - "funcName": "sendData", - "script": "import json, os\nfrom datetime import datetime as dt\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom mobiuspi_lib.gps import GPS\nfrom quickfaas.global_dict import get as get_params\nfrom quickfaas.global_dict import _set_global_args\n\ndef reboot():\n #basic = Basic()\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\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.info(\"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.info(\"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.info(\"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.info(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.info(\"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.info(\"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.info(\"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.info(\"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.info(\"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.info(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n \n return cfg\n\npayload = {}\n\ntry:\n with open(\"/var/user/files/totalizers.json\", \"r\") as t:\n totalizers = json.load(t)\n if not totalizers:\n logger.info(\"-----INITIALIZING TOTALIZERS-----\")\n totalizers = {\n \"day\": 0,\n \"week\": 0,\n \"month\": 0,\n \"year\": 0,\n \"lifetime\": 0,\n \"dayHolding\": 0,\n \"weekHolding\": 0,\n \"monthHolding\": 0,\n \"yearHolding\": 0\n }\nexcept:\n totalizers = {\n \"day\": 0,\n \"week\": 0,\n \"month\": 0,\n \"year\": 0,\n \"lifetime\": 0,\n \"dayHolding\": 0,\n \"weekHolding\": 0,\n \"monthHolding\": 0,\n \"yearHolding\": 0\n }\n\n\n\n\ndef sendData(message,wizard_api):\n logger.debug(message)\n checkCredentialConfig()\n payload = {\"ts\": (round(dt.timestamp(dt.now())/600)*600)*1000, \"values\": {}}\n resetPayload = {\"ts\": \"\", \"values\": {}}\n for measure in message[\"values\"][\"flowmeter\"].keys():\n try:\n if measure in [\"totalizer_1\"]:\n payload[\"values\"][\"day_volume\"], dayReset = totalizeDay(message[\"values\"][\"flowmeter\"][measure][\"raw_data\"])\n payload[\"values\"][\"week_volume\"], weekReset = totalizeWeek(message[\"values\"][\"flowmeter\"][measure][\"raw_data\"])\n payload[\"values\"][\"month_volume\"], monthReset = totalizeMonth(message[\"values\"][\"flowmeter\"][measure][\"raw_data\"])\n payload[\"values\"][\"year_volume\"], yearReset = totalizeYear(message[\"values\"][\"flowmeter\"][measure][\"raw_data\"])\n payload[\"values\"][measure] = message[\"values\"][\"flowmeter\"][measure][\"raw_data\"]\n except Exception as e:\n logger.error(e)\n try:\n payload[\"values\"][\"latitude\"], payload[\"values\"][\"longitude\"], payload[\"values\"][\"speed\"] = getGPS()\n except:\n logger.error(\"Could not get GPS coordinates\")\n publish(__topic__, json.dumps(payload), __qos__)\n\n if dayReset:\n resetPayload[\"values\"][\"day_volume\"] = 0\n if weekReset:\n resetPayload[\"values\"][\"week_volume\"] = 0\n if monthReset:\n resetPayload[\"values\"][\"month_volume\"] = 0\n if yearReset:\n resetPayload[\"values\"][\"year_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\ndef saveTotalizers():\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 getGPS():\n # Create a gps instance\n gps = GPS()\n\n # Retrieve GPS information\n position_status = gps.get_position_status()\n logger.debug(\"position_status: \")\n logger.debug(position_status)\n latitude = position_status[\"latitude\"].split(\" \")\n longitude = position_status[\"longitude\"].split(\" \")\n lat_dec = int(latitude[0][:-1]) + (float(latitude[1][:-1])/60)\n lon_dec = int(longitude[0][:-1]) + (float(longitude[1][:-1])/60)\n if latitude[2] == \"S\":\n lat_dec = lat_dec * -1\n if longitude[2] == \"W\":\n lon_dec = lon_dec * -1\n #lat_dec = round(lat_dec, 7)\n #lon_dec = round(lon_dec, 7)\n logger.info(\"HERE IS THE GPS COORDS\")\n logger.info(f\"LATITUDE: {lat_dec}, LONGITUDE: {lon_dec}\")\n speedKnots = position_status[\"speed\"].split(\" \")\n speedMPH = float(speedKnots[0]) * 1.151\n return (f\"{lat_dec:.8f}\",f\"{lon_dec:.8f}\",f\"{speedMPH:.2f}\")\n\ndef totalizeDay(lifetime):\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n reset = False\n value = lifetime - totalizers[\"dayHolding\"]\n if not int(now.strftime(\"%d\")) == int(totalizers[\"day\"]):\n totalizers[\"dayHolding\"] = lifetime\n totalizers[\"day\"] = int(now.strftime(\"%d\"))\n saveTotalizers()\n reset = True\n return (value,reset)\n\ndef totalizeWeek(lifetime):\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n reset = False\n value = lifetime - totalizers[\"weekHolding\"]\n if not now.strftime(\"%U\") == totalizers[\"week\"] and now.strftime(\"%a\") == \"Sun\":\n totalizers[\"weekHolding\"] = lifetime\n totalizers[\"week\"] = now.strftime(\"%U\")\n saveTotalizers()\n reset = True\n return (value, reset)\n\ndef totalizeMonth(lifetime):\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n reset = False\n value = lifetime - totalizers[\"monthHolding\"]\n if not int(now.strftime(\"%m\")) == int(totalizers[\"month\"]):\n totalizers[\"monthHolding\"] = lifetime\n totalizers[\"month\"] = now.strftime(\"%m\")\n saveTotalizers()\n reset = True\n return (value,reset)\n\ndef totalizeYear(lifetime):\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n reset = False\n value = lifetime - totalizers[\"yearHolding\"]\n if not int(now.strftime(\"%Y\")) == int(totalizers[\"year\"]):\n totalizers[\"yearHolding\"] = lifetime\n totalizers[\"year\"] = now.strftime(\"%Y\")\n saveTotalizers()\n reset = True\n return (value, reset)", - "name": "sendData", - "trigger": "measure_event", - "topic": "v1/devices/me/telemetry", - "cloudName": "default", - "groups": [ - "default" - ], - "msgType": 0 - } - ], - "downloadFuncs": [ - { - "name": "Receive Command", - "topic": "v1/devices/me/rpc/request/+", - "qos": 1, - "funcName": "receiveCommand", - "payload_type": "JSON", - "script": "import json\nimport time\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\n\ndef resetTotalizers():\n with open(\"/var/user/files/totalizers.json\", \"r+\") as t:\n totalizers = json.load(t)\n if totalizers:\n totalizers[\"dayHolding\"] = 0\n totalizers[\"weekHolding\"] = 0\n totalizers[\"MonthHolding\"] = 0\n totalizers[\"yearHolding\"] = 0\n json.dump(totalizers,t)\n\ndef receiveCommand(topic, payload):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)\n command = p[\"method\"]\n if command == \"resetTotalizers\":\n resetTotalizers()\n publish(topic, json.dumps({\"msg\": {\"time\": time.time()}, \"metadata\": \"\", \"msgType\": \"\"}))\n", - "msgType": 0, - "cloudName": "default", - "trigger": "command_event" - } - ] - }, - "labels": [ - { - "key": "SN", - "value": "GF5022223016129" - }, - { - "key": "MAC", - "value": "00:18:05:21:b3:3f" - } - ], - "modbusSlave": { - "enable": 0, - "protocol": "Modbus-TCP", - "port": 502, - "slaveAddr": 1, - "int16Ord": "ab", - "int32Ord": "abcd", - "float32Ord": "abcd", - "maxConnection": 5, - "mapping_table": [] - }, - "modbusRTUSlave": { - "enable": 0, - "protocol": "Modbus-RTU", - "coms": "rs485", - "slaveAddr": 1, - "int16Ord": "ab", - "int32Ord": "abcd", - "float32Ord": "abcd", - "mapping_table": [] - }, - "iec104Server": { - "enable": 0, - "cotSize": 2, - "port": 2404, - "serverList": [ - { - "asduAddr": 1 - } - ], - "kValue": 12, - "wValue": 8, - "t0": 30, - "t1": 15, - "t2": 10, - "t3": 20, - "maximumLink": 5, - "timeSet": 1, - "byteOrder": "abcd", - "mapping_table": [] - }, - "iec104Client": { - "enable": 0, - "connectType": 2, - "serverAddr": "ipower.inhandcloud.cn", - "serverPort": 2404, - "communicationCode": "", - "protocol": 1, - "asduAddr": 1, - "tls": 0, - "mapping_table": { - "YX": [], - "YC": [], - "YK": [] - } - }, - "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.3.1" + "msgType": 0 + } + ], + "downloadFuncs": [ + { + "name": "Receive Command", + "topic": "v1/devices/me/rpc/request/+", + "qos": 1, + "funcName": "receiveCommand", + "payload_type": "JSON", + "script": "import json\nfrom datetime import datetime as dt\nfrom common.Logger import logger\nfrom quickfaas.measure import write\nfrom quickfaas.remotebus import publish\n\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.info(\"-----INITIALIZING TOTALIZERS-----\")\n totalizers = {\n \"day\": 0,\n \"week\": 0,\n \"month\": 0,\n \"year\": 0,\n \"lifetime\": 0,\n \"dayHolding\": 0,\n \"weekHolding\": 0,\n \"monthHolding\": 0,\n \"yearHolding\": 0\n }\n except:\n totalizers = {\n \"day\": 0,\n \"week\": 0,\n \"month\": 0,\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 resetTotalizers():\n try:\n totalizers = get_totalizers()\n \n totalizers[\"dayHolding\"] = 0\n totalizers[\"weekHolding\"] = 0\n totalizers[\"MonthHolding\"] = 0\n totalizers[\"yearHolding\"] = 0\n saveTotalizers(totalizers) \n return True\n except Exception as e:\n logger.error(e)\n return e\n\ndef receiveCommand(topic, payload):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)\n command = p[\"method\"]\n if command == \"resetTotalizers\":\n r = resetTotalizers()\n \n if r == True:\n message = [{\"name\": \"flowmeter\", \"measures\":[{\"name\":\"reset_totalizers\", \"value\": 1}]}]\n try:\n resp = write(message)\n payload = {\n \"ts\": (round(dt.timestamp(dt.now())/600)*600)*1000,\n \"values\": {\n \"day_volume\": 0,\n \"yesterday_volume\": 0,\n \"week_volume\": 0,\n \"last_week_volume\": 0,\n \"month_volume\": 0,\n \"last_month_volume\": 0,\n \"year_volume\": 0,\n \"last_year_volume\": 0\n }\n }\n publish(\"v1/devices/me/telemetry\",json.dumps(payload))\n except Exception as e:\n logger.error(\"Failed to write message\")\n logger.error(e)\n \n ack(topic.split(\"/\")[-1], r)\n\ndef ack(msgid, r):\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\": (round(dt.timestamp(dt.now())/600)*600)*1000, \"response\": r}, \"metadata\": \"\", \"msgType\": \"\"}))", + "msgType": 0, + "cloudName": "default", + "trigger": "command_event" + } + ] + }, + "labels": [ + { + "key": "SN", + "value": "GF5022223016129" + }, + { + "key": "MAC", + "value": "00:18:05:21:b3:3f" + } + ], + "modbusSlave": { + "enable": 0, + "protocol": "Modbus-TCP", + "port": 502, + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "maxConnection": 5, + "mapping_table": [] + }, + "modbusRTUSlave": { + "enable": 0, + "protocol": "Modbus-RTU", + "coms": "rs485", + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "mapping_table": [] + }, + "iec104Server": { + "enable": 0, + "cotSize": 2, + "port": 2404, + "serverList": [ + { + "asduAddr": 1 + } + ], + "kValue": 12, + "wValue": 8, + "t0": 30, + "t1": 15, + "t2": 10, + "t3": 20, + "maximumLink": 5, + "timeSet": 1, + "byteOrder": "abcd", + "mapping_table": [] + }, + "iec104Client": { + "enable": 0, + "connectType": 2, + "serverAddr": "ipower.inhandcloud.cn", + "serverPort": 2404, + "communicationCode": "", + "protocol": 1, + "asduAddr": 1, + "tls": 0, + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "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.3.1" } \ No newline at end of file diff --git a/Pub_Sub/flowmeterskid/thingsboard/v1/sub/receiveCommand.py b/Pub_Sub/flowmeterskid/thingsboard/v1/sub/receiveCommand.py index c8a3376..6d9a4f6 100644 --- a/Pub_Sub/flowmeterskid/thingsboard/v1/sub/receiveCommand.py +++ b/Pub_Sub/flowmeterskid/thingsboard/v1/sub/receiveCommand.py @@ -69,12 +69,9 @@ def receiveCommand(topic, payload): message = [{"name": "flowmeter", "measures":[{"name":"reset_totalizers", "value": 1}]}] try: resp = write(message) - except Exception as e: - logger.error("Failed to write message") - logger.error(e) - payload = { - "ts": (round(dt.timestamp(dt.now())/600)*600)*1000, - "values": { + payload = { + "ts": (round(dt.timestamp(dt.now())/600)*600)*1000, + "values": { "day_volume": 0, "yesterday_volume": 0, "week_volume": 0, @@ -83,9 +80,13 @@ def receiveCommand(topic, payload): "last_month_volume": 0, "year_volume": 0, "last_year_volume": 0 + } } - } - publish("v1/devices/me/telemetry",json.dumps(payload)) + 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): diff --git a/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v1.cfg b/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v1.cfg index b6ef89f..9db5db5 100644 --- a/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v1.cfg +++ b/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery_tb_v1.cfg @@ -205,6 +205,26 @@ "gain": "", "offset": "" }, + { + "name": "water_run_tank", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "DINT", + "addr": "WT_Selector", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "water_01_level", "ctrlName": "hrtankbattery", @@ -285,6 +305,66 @@ "gain": "", "offset": "" }, + { + "name": "water_01_hihi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_1.PSet_HiHiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_01_hi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_1.PSet_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_01_max_height", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_1.Cfg_PVEUMax", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "water_02_level", "ctrlName": "hrtankbattery", @@ -365,6 +445,66 @@ "gain": "", "offset": "" }, + { + "name": "water_02_hihi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_2.PSet_HiHiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_02_hi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_2.PSet_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_02_max_height", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_2.Cfg_PVEUMax", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "water_03_level", "ctrlName": "hrtankbattery", @@ -445,6 +585,66 @@ "gain": "", "offset": "" }, + { + "name": "water_03_hihi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_3.PSet_HiHiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_03_hi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_3.PSet_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_03_max_height", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_3.Cfg_PVEUMax", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "water_04_level", "ctrlName": "hrtankbattery", @@ -525,6 +725,66 @@ "gain": "", "offset": "" }, + { + "name": "water_04_hihi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_4.PSet_HiHiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_04_hi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_4.PSet_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_04_max_height", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_4.Cfg_PVEUMax", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "water_05_level", "ctrlName": "hrtankbattery", @@ -605,6 +865,66 @@ "gain": "", "offset": "" }, + { + "name": "water_05_hihi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_5.PSet_HiHiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_05_hi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_5.PSet_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_05_max_height", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_5.Cfg_PVEUMax", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "water_06_level", "ctrlName": "hrtankbattery", @@ -685,6 +1005,86 @@ "gain": "", "offset": "" }, + { + "name": "water_06_hihi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_6.PSet_HiHiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_06_hi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_6.PSet_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_06_max_height", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WT_6.Cfg_PVEUMax", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_run_tank", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "DINT", + "addr": "OT_Selector", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "oil_01_level", "ctrlName": "hrtankbattery", @@ -765,6 +1165,66 @@ "gain": "", "offset": "" }, + { + "name": "oil_01_hihi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_1.PSet_HiHiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_01_hi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_1.PSet_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_01_max_height", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_1.Cfg_PVEUMax", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "oil_02_level", "ctrlName": "hrtankbattery", @@ -845,6 +1305,66 @@ "gain": "", "offset": "" }, + { + "name": "oil_02_hihi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_2.PSet_HiHiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_02_hi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_2.PSet_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_02_max_height", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_2.Cfg_PVEUMax", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "oil_03_level", "ctrlName": "hrtankbattery", @@ -925,6 +1445,66 @@ "gain": "", "offset": "" }, + { + "name": "oil_03_hihi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_3.PSet_HiHiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_03_hi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_3.PSet_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_03_max_height", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_3.Cfg_PVEUMax", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "oil_04_level", "ctrlName": "hrtankbattery", @@ -1005,6 +1585,66 @@ "gain": "", "offset": "" }, + { + "name": "oil_04_hihi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_4.PSet_HiHiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_04_hi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_4.PSet_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_04_max_height", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_4.Cfg_PVEUMax", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "oil_05_level", "ctrlName": "hrtankbattery", @@ -1085,6 +1725,66 @@ "gain": "", "offset": "" }, + { + "name": "oil_05_hihi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_5.PSet_HiHiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_05_hi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_5.PSet_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_05_max_height", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_5.Cfg_PVEUMax", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "oil_06_level", "ctrlName": "hrtankbattery", @@ -1165,6 +1865,66 @@ "gain": "", "offset": "" }, + { + "name": "oil_06_hihi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_6.PSet_HiHiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_06_hi_spt", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_6.PSet_HiLim", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_06_max_height", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OT_6.Cfg_PVEUMax", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "transfer_01_sts", "ctrlName": "hrtankbattery", @@ -1265,6 +2025,66 @@ "gain": "", "offset": "" }, + { + "name": "transfer_01_flow_rate", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "XferPump_01_FlowRate.Val", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "transfer_01_flow_rate_hihi_alm", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "XferPump_01_FlowRate.Alm_HiHi", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "transfer_01_flow_rate_lolo_alm", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "XferPump_01_FlowRate.Alm_LoLo", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, { "name": "transfer_02_sts", "ctrlName": "hrtankbattery", @@ -1364,6 +2184,386 @@ "minScaleValue": "", "gain": "", "offset": "" + }, + { + "name": "transfer_02_flow_rate", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "XferPump_02_FlowRate.Val", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "transfer_02_flow_rate_hihi_alm", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "XferPump_02_FlowRate.Alm_HiHi", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "transfer_02_flow_rate_lolo_alm", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "XferPump_02_FlowRate.Alm_LoLo", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_01_permissive", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "LACT_01_Permissive", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_01_sts", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "LACT_01_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_01_alm", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "LACT_01_Failure", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_01_oil_shutdown", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "LACT_01_Bad_Oil_Shutdown", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_01_flow_rate", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lact_01_Realtime_Flow_Rate", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_01_bs_w", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lact_01_BS_and_W_Reading", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_01_daily_volume", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lact_01_Current_Daily_Ind_Volume_Total", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_01_prev_day", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lact_01_History.Previous_Day_1", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_02_permissive", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "LACT_02_Permissive", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_02_sts", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "LACT_02_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_02_alm", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "LACT_02_Failure", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_02_oil_shutdown", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "LACT_02_Bad_Oil_Shutdown", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_02_flow_rate", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lact_02_Realtime_Flow_Rate", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_02_bs_w", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lact_02_BS_and_W_Reading", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_02_daily_volume", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lact_02_Current_Daily_Ind_Volume_Total", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lact_02_prev_day", + "ctrlName": "hrtankbattery", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lact_02_History.Previous_Day_1", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" } ], "alarms": [ @@ -2135,6 +3335,38 @@ }, "content": "Transfer 1 Discharge crossed LoLo threshold" }, + { + "name": "transfer_01_flow_rate_hihi_alm", + "ctrlName": "hrtankbattery", + "measureName": "transfer_01_flow_rate_hihi_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Transfer 1 Flow Rate crossed HiHi threshold" + }, + { + "name": "transfer_01_flow_rate_lolo_alm", + "ctrlName": "hrtankbattery", + "measureName": "transfer_01_flow_rate_lolo_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Transfer 1 Flow Rate crossed LoLo threshold" + }, { "name": "transfer_02_alm", "ctrlName": "hrtankbattery", @@ -2182,6 +3414,102 @@ "value": "" }, "content": "Transfer 2 Discharge crossed LoLo threshold" + }, + { + "name": "transfer_02_flow_rate_hihi_alm", + "ctrlName": "hrtankbattery", + "measureName": "transfer_02_flow_rate_hihi_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Transfer 2 Flow Rate crossed HiHi threshold" + }, + { + "name": "transfer_02_flow_rate_lolo_alm", + "ctrlName": "hrtankbattery", + "measureName": "transfer_02_flow_rate_lolo_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Transfer 2 Flow Rate crossed LoLo threshold" + }, + { + "name": "lact_01_alm", + "ctrlName": "hrtankbattery", + "measureName": "lact_01_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "LACT 1 Meter Failure" + }, + { + "name": "lact_01_oil_shutdown", + "ctrlName": "hrtankbattery", + "measureName": "lact_01_oil_shutdown", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "LACT 1 Bad Oil" + }, + { + "name": "lact_02_alm", + "ctrlName": "hrtankbattery", + "measureName": "lact_02_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "LACT 2 Meter Failure" + }, + { + "name": "lact_02_oil_shutdown", + "ctrlName": "hrtankbattery", + "measureName": "lact_02_oil_shutdown", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "LACT 2 Bad Oil" } ], "misc": { @@ -2312,9 +3640,17 @@ "transfer_01_alm", "transfer_01_discharge_hihi_alm", "transfer_01_discharge_lolo_alm", + "transfer_01_flow_rate_hihi_alm", + "transfer_01_flow_rate_lolo_alm", "transfer_02_alm", "transfer_02_discharge_hihi_alm", - "transfer_02_discharge_lolo_alm" + "transfer_02_discharge_lolo_alm", + "transfer_02_flow_rate_hihi_alm", + "transfer_02_flow_rate_lolo_alm", + "lact_01_alm", + "lact_01_oil_shutdown", + "lact_02_alm", + "lact_02_oil_shutdown" ], "msgType": 0, "cloudName": "default" @@ -2335,7 +3671,7 @@ ] }, "modbusSlave": { - "enable": 0, + "enable": 1, "protocol": "Modbus-TCP", "port": 502, "slaveAddr": 1,