From c25bca478f3b634d450b3978a36cf018d51736f5 Mon Sep 17 00:00:00 2001 From: Nico Melone Date: Tue, 1 Aug 2023 15:31:31 -0500 Subject: [PATCH] added several drivers --- .DS_Store | Bin 10244 -> 10244 bytes Pub_Sub/.DS_Store | Bin 22532 -> 22532 bytes .../convert_config.cpython-310.pyc | Bin 2432 -> 2810 bytes Pub_Sub/config_manager.ipynb | 38 +- Pub_Sub/convert_config.py | 7 + .../thingsboard/dual_flowmeter_measures.csv | 21 + .../flowmeterskid_ethernetip_baseline.py | 335 +- Pub_Sub/gateway/ratliff_gateway.cfg | 6643 +++++++++++++++++ .../hrflowskid/thingsboard/v1/hrflowskid.cfg | 336 + .../hrflowskid/thingsboard/v1/hrflowskid.csv | 5 + .../{ => mistaway}/v1/cloud.json | 0 .../{ => mistaway}/v1/measure.csv | 0 .../{ => mistaway}/v1/plcfreshv2.csv | 0 .../{ => mistaway}/v1/plcfreshv21.csv | 0 .../{ => mistaway}/v1/plcfreshwater_ma_v1.cfg | 0 .../{ => mistaway}/v1/pub/sendData.py | 0 .../{ => mistaway}/v1/sub/receiveCommand.py | 0 .../thingsboard/conocophillips.csv | 11 + .../v1/plcfreshwater_advvfdipp_tb_v1.cfg | 235 + .../v2/plcfreshwater_advvfdipp_tb_v2.cfg | 235 + .../thingsboard/v2/pub/sendData.py | 161 + Pub_Sub/rigpump/.DS_Store | Bin 6148 -> 6148 bytes 22 files changed, 7928 insertions(+), 99 deletions(-) create mode 100644 Pub_Sub/dual_flowmeter/thingsboard/dual_flowmeter_measures.csv create mode 100644 Pub_Sub/gateway/ratliff_gateway.cfg create mode 100644 Pub_Sub/hrflowskid/thingsboard/v1/hrflowskid.cfg create mode 100644 Pub_Sub/hrflowskid/thingsboard/v1/hrflowskid.csv rename Pub_Sub/plcfreshwater/{ => mistaway}/v1/cloud.json (100%) rename Pub_Sub/plcfreshwater/{ => mistaway}/v1/measure.csv (100%) rename Pub_Sub/plcfreshwater/{ => mistaway}/v1/plcfreshv2.csv (100%) rename Pub_Sub/plcfreshwater/{ => mistaway}/v1/plcfreshv21.csv (100%) rename Pub_Sub/plcfreshwater/{ => mistaway}/v1/plcfreshwater_ma_v1.cfg (100%) rename Pub_Sub/plcfreshwater/{ => mistaway}/v1/pub/sendData.py (100%) rename Pub_Sub/plcfreshwater/{ => mistaway}/v1/sub/receiveCommand.py (100%) create mode 100644 Pub_Sub/plcfreshwater/thingsboard/conocophillips.csv create mode 100644 Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v1/plcfreshwater_advvfdipp_tb_v1.cfg create mode 100644 Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/plcfreshwater_advvfdipp_tb_v2.cfg create mode 100644 Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/pub/sendData.py diff --git a/.DS_Store b/.DS_Store index b8433b2eea8d9a9bdd359696d45dd758bea47879..92b1bbc81acc4413632fee86e8b3cb8fdbbc7f42 100644 GIT binary patch delta 822 zcmcK2&r8#B7{Kx8{aNKk7GwU{`XPO7Nf47Z4Rs08j~xml*Q{tnZPUKOaBjNqT+kX? z7!_$zyF@>PPDT+}izqu*hEZKAB8U!B5?u;{P96G|`UeF0T;A{;p2Lf0FgO?->vAw& zNH}_TEYIa?eLio4N2~WX<~>@@U+48`8|oYKd7HJuy}mgV=}L4bQ$zB1V5YKUwsRRS zt|{B5oZ-@l-I0y!M_PL_@l?{-r>70Gg-KUu?f!U2D%lo4sz>bhK0^=biC89{)dR7N zZj{g6nJqf+3()$o!Q&ODpgV^0of^0NlQ+K<&s>Nd-7B!dc+Lx6@``s%@rln&^G%_YvZzv3shrBCs?}=cRyC?g`PEj{qV}k;YA@)nu(RdA z*+iF>{Hx7-nUXK2%`ektDP_1=iH~bHS9kV%m%_O3e*!a*NyC=K&8H=P^&1;2D#q)oVVOMql|+^sRWapje_=78a}( Nk@@+OgY)_&zX2vp!y5nq delta 726 zcmciAK}gea7{>AU`{pd!sIj@+TA~z4hr;P3Ej$d2$}%t&Q!7N`KbuY^oEnO#IEu8B zzv^lfL3If0-yx{XqPj#xARQzn>`-**)MX0M--7NH^c>#9b9+BL>DqMdOs9_rCh0rl z4h{{KmzV7$U2vWLqlH zZ|!SKS-mEb8_3xni^$K|{>}Yp!XtYkqweBMN%O#X^^<|$e3J|X}K?t zWmaCxJ6V#?@>MdjBCGP9b$AGnN01QPD5iu`qEvE_Y7S9P6D=I)1Qs16>7ttfh8ba$ zF(#;<;u4p+!ZbIz#cgb!@thaDf6uXRLu_keqYh33BcbMTW_jt%7W_iL>$L1CDj>$3~?Pz#D U%XSsIT*ebP`EM&||4%FU0SlI`qW}N^ diff --git a/Pub_Sub/.DS_Store b/Pub_Sub/.DS_Store index 0e19c82446fba45fcee880270cb4d3ac5aeff1b0..e0056e9c5b1a9e5a345488d2c4cc444ea0027019 100644 GIT binary patch delta 685 zcmd6lO)mps5XWa$t3_$W%Ti6dv|cK0vbEK%XsJXZ4w5EZB;uv2G?r~p;^rW6k_zFY(YRz+S5ps}+707LludQnO>LRaT9yVC5@M30? zP>sxDHCeHlW*tqmJaR+xj)n>j)eI^aS>|&*)?gR2Nx?Eow23U~owiXO`V09m#>s&a z3&^5CAF_v1Jw?&NMdx4x7GR6V?UF+ZDqeRbEOA>I&_L(aby(&W(!Ii1Z$DQ)je@BArH^^)SQb(y+;2hQ}6z{P1j#|UIay|6B zd(iK;{gu!9f2fAUfxnf#M32j8vb(>u$9i@ZyAvpmA!bh?nv5aYTOwXgXHoJ07?sJA ctmAjcTuGk^fnv56nwmI4B)hMHJqRBgaG;W5&*j0p^nx7#k)Vgs@EPR-JrWpNElk@*^ihMz+auf)bo5 z#mPBI`T02vlcx!UO@8GpzgdWpiET4G2MY(II7r22CBc_`KokBks&D2|&}C+1ob0G1 zwmCpKj%Tt6V=SZH#0d(UbqvIrCKnpXPfjvAKiS7veshm;Cle#Xn@!A?Fp3#k znw#k;0LfY%g=#|s0|OleGeeWfiCU(USjbW0x+~ge= n3kjPUIhj2`7#LieWdc-yz6NS-0OH9WAsaVKc-S)GvSlU!m``X> diff --git a/Pub_Sub/__pycache__/convert_config.cpython-310.pyc b/Pub_Sub/__pycache__/convert_config.cpython-310.pyc index 38ad979b57a09e4c36e1f614490e7b995704f706..299d45d32febc62e43cb808940fd99773bb6f14d 100644 GIT binary patch delta 1017 zcmaJ=&rcIU6y7(x-QB{r3bnvOk(FRz3B(Wq6Jiu1G4WtyVxp38shw38NlRwO)YK9* z#IrGTro7(|trk45+gV)Cz7(rtVXNz&uH@Jl} zgVXkn`$p)Ln*-I2sQN6fJq@-iawCXd#EDFn0yV>?hr>)Kvn}G96gJ)~90Hdhs~)i% zPU4~Mf!b$Nkf<-PJ|fQJPAA9fjoMbd!f!vXRTBa9MZY>^GeiAoCPc~w4@aqcfr&v} zzDtMIO;hi*3EI0ce zidaU$tvZi_dq{aH=s+X1L;+7%53H49fQC-e1D8>n<6Tku^xk?6#bI=5j-rn&q9X>> zvb_(!`f78SR4dK`%&LYnx_f|5$~MIorHo@v99#5;`9>Rb%gjwH&7AFTL$ZqBnrC}| zw%$zf#IkYLs>ol8q4HIltvGctyqf7RKi|_j(s9M zwcyT;Ea65%)h$7Q<09m>Ui!g0RxjPL-Dz}5V-r%8JyI%2tkfwbBeiH3G!;#Um7BS{ z6)o~7^(`KWF!TFjaTO2KnTdI_7722vKxz~d2&*^~QojdxJWR+s*4v@iu^(5GXmMUJ n3e|-4PjZfyMFNtz@Cix;vjqB&no!Hxgv;7g1zIkDYB28GvNX!jx)3YFN==- z>e%igcp3tHk`$1pwMt7(ri0W_+K<#;xdxhvT#SiCM!866EMJ6=WiAVu(}e6N-CFAG zp~}xKL?W(>SPn|siyhlkSEG~M#jm>r=yIwu%kS^0r_?%uoT-&HnMDkX_NRVB9sAl# z=(Mf8{{C5{hXnXNn0tr~M7jgW#5NT&p~A^U;U-X(h(tb4W>D z%s!tvzkivv27ndnQixq>l3N*##6Q;f>}qRWkiX+yM+d4?7P-sCbfFg Rvma*rbK2Lw?<+qFykE7kgNFbB diff --git a/Pub_Sub/config_manager.ipynb b/Pub_Sub/config_manager.ipynb index cc6d407..f88e089 100644 --- a/Pub_Sub/config_manager.ipynb +++ b/Pub_Sub/config_manager.ipynb @@ -17,29 +17,51 @@ "outputs": [], "source": [ "root = \"/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub\"\n", - "devicetype = \"advvfdipp\"\n", + "devicetype = \"plcfreshwater_advvfdipp\"\n", "platform = \"thingsboard\" #\"mistaway\"\n", "platform_short = \"tb\" if platform == \"thingsboard\" else \"ma\" \n", - "startversion = 2\n", + "startversion = 1\n", "deviceconfig = devicetype + \"_\" + platform_short + \"_\" +\"v\" + str(startversion) + \".cfg\"\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "checking path exists: /Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v1/plcfreshwater_advvfdipp_tb_v1.cfg\n", + "/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v1\n", + "Write Code Path: /Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v1/pub/sendData.py\n", + "/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v1/pub\n", + "Path didn't exist creating path: /Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v1/pub\n" + ] + } + ], "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) + \"/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" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v1\n", + "/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2\n", + "/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/pub\n" + ] + } + ], "source": [ "\n", "convert_config.write_config(root + \"/\" + devicetype + \"/\" + platform + \"/v\" + str(startversion + 1) + \"/\" + devicetype + \"_\" + platform_short + \"_v\" + str(startversion + 1) + \".cfg\", \n", @@ -65,7 +87,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5 | packaged by conda-forge | (main, Jun 14 2022, 07:05:37) [Clang 13.0.1 ]" + "version": "3.10.5" }, "orig_nbformat": 4, "vscode": { diff --git a/Pub_Sub/convert_config.py b/Pub_Sub/convert_config.py index 8a8ea36..05f5f4d 100644 --- a/Pub_Sub/convert_config.py +++ b/Pub_Sub/convert_config.py @@ -9,6 +9,7 @@ def get_config(path): return json.load(f) def get_config_pub(path): + print("checking path exists: " + path) checkFileExist(path) with open(path, "r") as f: codeString = json.load(f) @@ -29,6 +30,8 @@ def code_to_string(path): return False def write_code(path, codestr): + print("Write Code Path: " + path) + #print(codestr) checkFileExist(path) with open(path, "w") as f: f.write(codestr) @@ -53,12 +56,16 @@ def write_config(path, config, pubDir, subDir): json.dump(config, f, indent=4) def checkFileExist(path): + print("/".join(path.split("/")[:-1])) if not os.path.exists("/".join(path.split("/")[:-1])): + print("Path didn't exist creating path: " + "/".join(path.split("/")[:-1])) os.makedirs("/".join(path.split("/")[:-1])) open(path, "a").close() if not os.path.exists(path): + print("Path did not exist creating path: " + path) open(path, "a").close() def checkFolderExist(path): if not os.path.exists(path): + print("Making folder" + path) os.makedirs(path) \ No newline at end of file diff --git a/Pub_Sub/dual_flowmeter/thingsboard/dual_flowmeter_measures.csv b/Pub_Sub/dual_flowmeter/thingsboard/dual_flowmeter_measures.csv new file mode 100644 index 0000000..6915ff8 --- /dev/null +++ b/Pub_Sub/dual_flowmeter/thingsboard/dual_flowmeter_measures.csv @@ -0,0 +1,21 @@ +MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit +pump_1_daily_total,Pond_A,dual_flowmeter,periodic,FLOAT,Pump_1_Daily_Flow_Rate_Total,2,1,ro,,,none,,,,,,,, +pump_1_run_status,Pond_A,dual_flowmeter,periodic,BIT,Pump_1_Run_Status,2,1,ro,,,none,,,,,,,, +pump_1_flowrate,Pond_A,dual_flowmeter,periodic,FLOAT,Pump_1_SCL_Flow_Meter,2,1,ro,,,none,,,,,,,, +pump_1_yesterdays_total,Pond_A,dual_flowmeter,periodic,FLOAT,Pump_1_Yesterdays_Total,2,1,ro,,,none,,,,,,,, +pump_1_prevmonth_total,Pond_A,dual_flowmeter,periodic,FLOAT,Pump_1_PrevMonth_Total,2,1,ro,,,none,,,,,,,, +pump_1_month_total,Pond_A,dual_flowmeter,periodic,FLOAT,Pump_1_Current_Month_Total,2,1,ro,,,none,,,,,,,, +pump_1_lifetime_total,Pond_A,dual_flowmeter,periodic,FLOAT,Pump_1_Lifetime_Flow,2,1,ro,,,none,,,,,,,, +pump_1_suction,Pond_A,dual_flowmeter,periodic,FLOAT,Suction_PSI_TP1_Scaled,2,1,ro,,,none,,,,,,,, +pump_2_daily_total,Pond_A,dual_flowmeter,periodic,FLOAT,Pump_2_Daily_Flow_Rate_Total,2,1,ro,,,none,,,,,,,, +pump_2_run_status,Pond_A,dual_flowmeter,periodic,BIT,Pump_2_Run_Status,2,1,ro,,,none,,,,,,,, +pump_2_flowrate,Pond_A,dual_flowmeter,periodic,FLOAT,Pump_2_SCL_Flow_Meter,2,1,ro,,,none,,,,,,,, +pump_2_yesterdays_total,Pond_A,dual_flowmeter,periodic,FLOAT,Pump_2_Yesterdays_Total,2,1,ro,,,none,,,,,,,, +pump_2_prevmonth_total,Pond_A,dual_flowmeter,periodic,FLOAT,Pump_2_PrevMonth_Total,2,1,ro,,,none,,,,,,,, +pump_2_month_total,Pond_A,dual_flowmeter,periodic,FLOAT,Pump_2_Current_Month_Total,2,1,ro,,,none,,,,,,,, +pump_2_lifetime_total,Pond_A,dual_flowmeter,periodic,FLOAT,Pump_2_Lifetime_Flow,2,1,ro,,,none,,,,,,,, +pump_2_suction,Pond_A,dual_flowmeter,periodic,FLOAT,Suction_PSI_TP2_Scaled,2,1,ro,,,none,,,,,,,, +pump_charge_psi_tp1,Pond_A,dual_flowmeter,periodic,FLOAT,Charge_PSI_TP1_Scaled,2,1,ro,,,none,,,,,,,, +pond_1_height,Pond_A,dual_flowmeter,periodic,FLOAT,Pond_level_TP1_Scaled,2,1,ro,,,none,,,,,,,, +pond_1_volume,Pond_A,dual_flowmeter,periodic,FLOAT,pond1Volume,2,1,ro,,,none,,,,,,,, +charge_pump_run_status,Pond_A,dual_flowmeter,periodic,BIT,CHARGE_PUMP_Run_Status,2,1,ro,,,none,,,,,,,, \ No newline at end of file diff --git a/Pub_Sub/flowmeterskid/flowmeterskid_ethernetip_baseline.py b/Pub_Sub/flowmeterskid/flowmeterskid_ethernetip_baseline.py index 167848e..922889a 100644 --- a/Pub_Sub/flowmeterskid/flowmeterskid_ethernetip_baseline.py +++ b/Pub_Sub/flowmeterskid/flowmeterskid_ethernetip_baseline.py @@ -7,116 +7,183 @@ from quickfaas.global_dict import get as get_params from quickfaas.global_dict import _set_global_args from pycomm3 import CIPDriver - -def reboot(): +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) + 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() - for x in ds: - j[x["key"]] = x["value"] + 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 = [] - for key in j.keys(): - d.append({"key": key, "value": j[key]}) + 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.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) - #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 + 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) - 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 = 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"] - 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) + 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): - 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": + 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] - except: - params[key] = cfgparams[key] - cfg["labels"] = convertJSONtoDS(params) - _set_global_args(convertJSONtoDS(params)) + 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: - 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 + 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 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 @@ -140,25 +207,111 @@ def getGPS(): 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__) + return (f"{lat_dec:.8f}",f"{lon_dec:.8f}",f"{speedMPH:.2f}") -def sendData(message,wizard_api): - logger.debug(message) - #publish(__topic__, json.dumps(message), __qos__) +def getFlowmeterData(address): try: - #checkCredentialConfig() - with CIPDriver('192.168.1.223') as fm: + with CIPDriver(address) as fm: resp = fm.generic_message(service=b"\x0E", #get_single_attribute class_code=b"\x04", #assembly instance=b"\x64", #assembly 100 which is a 40byte array attribute=b"\x03", #similar to function code in modbus route_path=True) - print("Bytes", resp[1]) - logger.info("Volume Flow", struct.unpack('f',resp[1][8:12])[0]) #volume flow is byte 9 - 12 - logger.info("Totalizer 1",struct.unpack('f',resp[1][28:32])[0]) #totalizer 1 is byte 29 - 32 - logger.info("Totalizer 2", struct.unpack('f',resp[1][32:36])[0]) #totalizer 2 is byte 33 - 36 - logger.info("Totalizer 3", struct.unpack('f',resp[1][36:40])[0]) #totalizer 3 is byte 37 - 40 + logger.debug("Bytes", resp[1]) + message = {} + message["totalizer_1"] = struct.unpack('f',resp[1][28:32])[0] #totalizer 1 is byte 29 - 32 + message["totalizer_2"] = struct.unpack('f',resp[1][32:36])[0] #totalizer 2 is byte 33 - 36 + message["totalizer_3"] = struct.unpack('f',resp[1][36:40])[0] #totalizer 3 is byte 37 - 40 + message["flowrate"] = struct.unpack('f',resp[1][8:12])[0] #volume flow is byte 9 - 12 + return message except: - logger.error("Could not get gps data!") + logger.error("Could not get flowmeter data!") +def sendData(message,wizard_api): + logger.debug(message) + checkCredentialConfig() + payload = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}} + resetPayload = {"ts": "", "values": {}} + dayReset, weekReset, monthReset, yearReset = False, False, False, False + message = getFlowmeterData('192.168.1.91') #TODO set from parameters + for measure in message.keys(): + try: + if measure in ["totalizer_1"]: + payload["values"]["day_volume"], dayReset = totalizeDay(message[measure]) + payload["values"]["week_volume"], weekReset = totalizeWeek(message[measure]) + payload["values"]["month_volume"], monthReset = totalizeMonth(message[measure]) + payload["values"]["year_volume"], yearReset = totalizeYear(message[measure]) + payload["values"][measure] = message[measure] + 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 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") or totalizers["week"] == 0: + 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/gateway/ratliff_gateway.cfg b/Pub_Sub/gateway/ratliff_gateway.cfg new file mode 100644 index 0000000..9e4f418 --- /dev/null +++ b/Pub_Sub/gateway/ratliff_gateway.cfg @@ -0,0 +1,6643 @@ +{ + "controllers": [ + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Prod_Well_27", + "args": {}, + "samplePeriod": 30, + "expired": 10000, + "endpoint": "192.168.1.27:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_28", + "args": {}, + "samplePeriod": 30, + "expired": 10000, + "endpoint": "192.168.1.28:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_29", + "args": {}, + "samplePeriod": 30, + "expired": 10000, + "endpoint": "192.168.1.29:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_A_30", + "args": {}, + "samplePeriod": 30, + "expired": 10000, + "endpoint": "192.168.1.30:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_31", + "args": {}, + "samplePeriod": 30, + "expired": 10000, + "endpoint": "192.168.1.31:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_A_32", + "args": {}, + "samplePeriod": 30, + "expired": 10000, + "endpoint": "192.168.1.32:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_A_33", + "args": {}, + "samplePeriod": 30, + "expired": 10000, + "endpoint": "192.168.1.33:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_A_34", + "args": {}, + "samplePeriod": 30, + "expired": 10000, + "endpoint": "192.168.1.34:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_A_35", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.35:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_36", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.36:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_B_36", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.236:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_A_37", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.37:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_38", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.38:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_A_39", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.39:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_A_40", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.40:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_A_41", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.41:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_42", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.42:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_A_43", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.43:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_A_44", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.44:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_45", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.45:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Ratliff_Well_A_46", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.46:44818" + }, + { + "protocol": "EtherNet/IP", + "name": "Pond_A", + "args": {}, + "samplePeriod": 30, + "expired": 10000, + "endpoint": "192.168.1.12:44818" + } + ], + "measures": [ + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Prod_Well_27", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_28", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_29", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_A_30", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_31", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_A_32", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_A_33", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_A_34", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_A_35", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_B_36", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_A_37", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_38", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_A_39", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_A_40", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_A_41", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_42", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_A_43", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_A_44", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_45", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_flow_meter", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_hand_input", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_auto_input", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_run_status", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_local_start", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "raw_overload_status", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "Ratliff_Well_A_46", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_1_daily_total", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_1_Daily_Flow_Rate_Total", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_1_run_status", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pump_1_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_1_flowrate", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_1_SCL_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_1_yesterdays_total", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_1_Yesterdays_Total", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_1_prevmonth_total", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_1_PrevMonth_Total", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_1_month_total", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_1_Current_Month_Total", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_1_lifetime_total", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_1_Lifetime_Flow", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_1_suction", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Suction_PSI_TP1_Scaled", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_2_daily_total", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_2_Daily_Flow_Rate_Total", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_2_run_status", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pump_2_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_2_flowrate", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_2_SCL_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_2_yesterdays_total", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_2_Yesterdays_Total", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_2_prevmonth_total", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_2_PrevMonth_Total", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_2_month_total", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_2_Current_Month_Total", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_2_lifetime_total", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_2_Lifetime_Flow", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_2_suction", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Suction_PSI_TP2_Scaled", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pump_charge_psi_tp1", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Charge_PSI_TP1_Scaled", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_1_height", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_level_TP1_Scaled", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_1_volume", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "pond1Volume", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "charge_pump_run_status", + "ctrlName": "Pond_A", + "group": "dual_flowmeter", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CHARGE_PUMP_Run_Status", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + } + ], + "alarmLables": [ + "default" + ], + "alarms": [], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "reference": 20 + }, + { + "name": "dual_flowmeter", + "uploadInterval": 600 + } + ], + "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": "pond-a-gateway", + "auth": 1, + "tls": 0, + "cleanSession": 0, + "mqttVersion": "v3.1.1", + "keepalive": 60, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "CUl7c4ARjNjGLWNJEMLV", + "passwd": "", + "willQos": 0, + "willRetain": 0, + "willTopic": "", + "willPayload": "", + "authType": 1 + } + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "name": "sendData", + "trigger": "measure_event", + "topic": "v1/gateway/telemetry", + "qos": 1, + "groups": [ + "default", + "dual_flowmeter" + ], + "funcName": "sendData", + "script": "# Enter your python code.\nimport json\nfrom datetime import datetime as dt\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\n\n\ndef sendData(message):\n #logger.debug(message)\n # Extract measures and group by ctrlName\n grouped_data = {}\n for measure in message['measures']:\n ctrlName = \" \".join(measure['ctrlName'].split(\"_\"))\n name = measure['name']\n value = measure['value']\n\n if ctrlName not in grouped_data:\n grouped_data[ctrlName] = {}\n\n grouped_data[ctrlName][name] = value\n\n #logger.debug(grouped_data)\n # Transform the grouped data to desired structure\n payload = {}\n now = (round(dt.timestamp(dt.now())/600)*600)*1000\n for key, value in grouped_data.items():\n payload[key] = [{\"ts\": now ,\"values\": value}]\n\n #logger.debug(payload)\n publish(__topic__, json.dumps(payload), __qos__)", + "msgType": 0, + "cloudName": "default" + } + ], + "downloadFuncs": [] + }, + "labels": [ + { + "key": "SN", + "value": "GF5022242024362" + }, + { + "key": "MAC", + "value": "00:18:05:24:cc:cf" + } + ], + "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", + "certificate": "None", + "privateKey": "None", + "mapping_table": [] + }, + "southMetadata": {}, + "bindMetadata": { + "version": "", + "timestamp": "" + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "version": "2.4.3" +} \ No newline at end of file diff --git a/Pub_Sub/hrflowskid/thingsboard/v1/hrflowskid.cfg b/Pub_Sub/hrflowskid/thingsboard/v1/hrflowskid.cfg new file mode 100644 index 0000000..6b622df --- /dev/null +++ b/Pub_Sub/hrflowskid/thingsboard/v1/hrflowskid.cfg @@ -0,0 +1,336 @@ +{ + "controllers": [ + { + "enable": 1, + "protocol": "AllenBradley MicroCip", + "name": "hrflowskid", + "samplePeriod": 10, + "desc": "Sensors: Pressure Transducer, Flow Meter, Valve", + "expired": 1000, + "args": { + "slot": 0, + "connectTimeOut": 10000 + }, + "enableDebug": 0, + "enablePerOnchange": 0, + "endpoint": "192.168.1.12:44818" + } + ], + "measures": [ + { + "name": "pressure_1", + "ctrlName": "hrflowskid", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_PSI", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "flowrate_1", + "ctrlName": "hrflowskid", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Rate", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "total_1_lifetime", + "ctrlName": "hrflowskid", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Lifetime_Flow_Rate", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "valve_1_state", + "ctrlName": "hrflowskid", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Valve_FB", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + } + ], + "alarmLables": [ + "default" + ], + "alarms": [], + "groups": [ + { + "name": "default", + "uploadInterval": 10, + "LwTSDBSize": 150000, + "strategy": 1, + "historyDataPath": "/var/user/data/dbhome/device_supervisor/LwTSDB", + "enablePerOnchange": 0 + } + ], + "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" + } + ], + "cachePath": "/var/user/data/dbhome/device_supervisor/offlinedata", + "cacheSize": 10000, + "debugLogPath": "/var/user/data/dbhome/device_supervisor/debugLog", + "debugLogSize": 2000 + }, + "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": "", + "willQos": 0, + "willRetain": 0, + "willTopic": "", + "willPayload": "", + "tlsAuth": "caSelfSigned" + }, + "uploadRules": [] + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "qos": 1, + "funcName": "sendData", + "script": "import json, os\nfrom common.Logger import logger\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 try:\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 except Exception as e:\n logger.error(f\"Something went wrong in checkFileExist while making folder: {e}\")\n \n try:\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 except Exception as e:\n logger.error(f\"Something went wrong in checkFileExist wihle making file: {e}\")\n\ndef convertDStoJSON(ds):\n j = dict()\n try:\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n except Exception as e:\n logger.error(f\"Something went wrong in convertDStoJSON: {e}\")\n return j\n\ndef convertJSONtoDS(j):\n d = []\n try:\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n except Exception as e:\n logger.error(f\"Something went wrong in convertJSONtoDS: {e}\")\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 try:\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 try:\n checkFileExist(\"creds.json\")\n except Exception as e:\n logger.error(f\"Error in checkFileExist: {e}\")\n with open(credspath, \"r\") as c:\n try:\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 except Exception as e:\n logger.error(f\"Error trying to load credentials from file: {e}\")\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 except Exception as e:\n logger.error(f\"Somethign went wrong in checkCredentialConfig: {e}\")\n\ndef checkParameterConfig(cfg):\n try:\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 except Exception as e:\n logger.error(f\"Something went wrong in checkParameterConfig: {e}\")\n os.system(f'rm {paramspath}')\n return cfg\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\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 payload[\"values\"][measure[\"name\"]] = measure[\"value\"] \n except Exception as e:\n logger.error(e)\n publish(__topic__, json.dumps(payload), __qos__)\n publish(\"v1/devices/me/attributes\", json.dumps({\"latestReportTime\": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__)\n\n", + "name": "sendData", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "msgType": 0, + "cloudName": "default", + "groups": [ + "default" + ] + } + ], + "downloadFuncs": [] + }, + "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": [] + }, + "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": [] + }, + "iec101Server": { + "enable": 0, + "coms": "rs485", + "mode": "UnBalance", + "linkLen": 2, + "linkAddr": 1, + "asduLen": 2, + "ioaLen": 3, + "cotLen": 2, + "serverList": [ + { + "asduAddr": 1 + } + ], + "linkTimeOut": 2000, + "timeSet": 1, + "idleTimeOut": 10000, + "byteOrder": "abcd", + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "iec104Client": { + "enable": 0, + "connectType": 2, + "serverAddr": "ipower.inhandcloud.cn", + "serverPort": 2406, + "communicationCode": "", + "protocol": 1, + "asduAddr": 1, + "tls": 1, + "verification": 1, + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "opcuaServer": { + "enable": 0, + "port": 4840, + "maximumLink": 5, + "securityMode": 0, + "identifierType": "String", + "pubsub": 0, + "certificate": "None", + "privateKey": "None", + "mapping_table": [] + }, + "sl651Slave": { + "enable": 0, + "centerAaddr": 1, + "remoteAddr": "", + "addrCode": "", + "password": "", + "platform_list": [], + "mapping_table": [] + }, + "hj212Client": { + "enable": 0, + "platform_list": [], + "block_list": [], + "mapping_table": [] + }, + "southMetadata": {}, + "bindMetadata": {}, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "templates": { + "testTemp": { + "controller": { + "conTempName": "testTemp", + "enable": 1, + "protocol": "AllenBradley MicroCip", + "samplePeriod": 10, + "desc": "", + "expired": 1000, + "args": { + "slot": 0, + "connectTimeOut": 10000 + }, + "enableDebug": 0, + "enablePerOnchange": 0, + "endpoint": "192.168.1.10:44818", + "status": 0 + }, + "measures": [ + { + "name": "test", + "ctrlName": "micro", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "pond1Height", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "decimal": 2 + } + ], + "desc": "" + } + }, + "version": "2.7.1" +} \ No newline at end of file diff --git a/Pub_Sub/hrflowskid/thingsboard/v1/hrflowskid.csv b/Pub_Sub/hrflowskid/thingsboard/v1/hrflowskid.csv new file mode 100644 index 0000000..78c828d --- /dev/null +++ b/Pub_Sub/hrflowskid/thingsboard/v1/hrflowskid.csv @@ -0,0 +1,5 @@ +MeasuringPointName,ControllerName,GroupName,UploadType,DeadZonePercent,DataType,ArrayIndex,EnableBit,BitIndex,reverseBit,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,Pt,Ct,Mapping_table,TransDecimal,bitMap,msecSample,storageLwTSDB,DataEndianReverse,ReadOffset,ReadLength,WriteOffset,WriteLength,DataParseMethod,BitId +pressure_1,hrflowskid,default,periodic,,FLOAT,,,,,Scaled_PSI,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,, +flowrate_1,hrflowskid,default,periodic,,FLOAT,,,,,Scaled_Flow_Rate,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,, +total_1_lifetime,hrflowskid,default,periodic,,FLOAT,,,,,Scaled_Lifetime_Flow_Rate,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,, +valve_1_state,hrflowskid,default,periodic,,FLOAT,,,,,Scaled_Valve_FB,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,, \ No newline at end of file diff --git a/Pub_Sub/plcfreshwater/v1/cloud.json b/Pub_Sub/plcfreshwater/mistaway/v1/cloud.json similarity index 100% rename from Pub_Sub/plcfreshwater/v1/cloud.json rename to Pub_Sub/plcfreshwater/mistaway/v1/cloud.json diff --git a/Pub_Sub/plcfreshwater/v1/measure.csv b/Pub_Sub/plcfreshwater/mistaway/v1/measure.csv similarity index 100% rename from Pub_Sub/plcfreshwater/v1/measure.csv rename to Pub_Sub/plcfreshwater/mistaway/v1/measure.csv diff --git a/Pub_Sub/plcfreshwater/v1/plcfreshv2.csv b/Pub_Sub/plcfreshwater/mistaway/v1/plcfreshv2.csv similarity index 100% rename from Pub_Sub/plcfreshwater/v1/plcfreshv2.csv rename to Pub_Sub/plcfreshwater/mistaway/v1/plcfreshv2.csv diff --git a/Pub_Sub/plcfreshwater/v1/plcfreshv21.csv b/Pub_Sub/plcfreshwater/mistaway/v1/plcfreshv21.csv similarity index 100% rename from Pub_Sub/plcfreshwater/v1/plcfreshv21.csv rename to Pub_Sub/plcfreshwater/mistaway/v1/plcfreshv21.csv diff --git a/Pub_Sub/plcfreshwater/v1/plcfreshwater_ma_v1.cfg b/Pub_Sub/plcfreshwater/mistaway/v1/plcfreshwater_ma_v1.cfg similarity index 100% rename from Pub_Sub/plcfreshwater/v1/plcfreshwater_ma_v1.cfg rename to Pub_Sub/plcfreshwater/mistaway/v1/plcfreshwater_ma_v1.cfg diff --git a/Pub_Sub/plcfreshwater/v1/pub/sendData.py b/Pub_Sub/plcfreshwater/mistaway/v1/pub/sendData.py similarity index 100% rename from Pub_Sub/plcfreshwater/v1/pub/sendData.py rename to Pub_Sub/plcfreshwater/mistaway/v1/pub/sendData.py diff --git a/Pub_Sub/plcfreshwater/v1/sub/receiveCommand.py b/Pub_Sub/plcfreshwater/mistaway/v1/sub/receiveCommand.py similarity index 100% rename from Pub_Sub/plcfreshwater/v1/sub/receiveCommand.py rename to Pub_Sub/plcfreshwater/mistaway/v1/sub/receiveCommand.py diff --git a/Pub_Sub/plcfreshwater/thingsboard/conocophillips.csv b/Pub_Sub/plcfreshwater/thingsboard/conocophillips.csv new file mode 100644 index 0000000..b5c8e17 --- /dev/null +++ b/Pub_Sub/plcfreshwater/thingsboard/conocophillips.csv @@ -0,0 +1,11 @@ +MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit +scaled_flow_meter,Ratliff_Well_31,default,periodic,FLOAT,Scaled_Flow_Meter,2,1,ro,,,none,,,,,,,, +scaled_pressure_transducer,Ratliff_Well_31,default,periodic,FLOAT,Scaled_Pressure_Transducer,2,1,ro,,,none,,,,,,,, +raw_hand_input,Ratliff_Well_31,default,periodic,BIT,Raw_Hand_Input,2,1,ro,,,none,,,,,,,, +raw_auto_input,Ratliff_Well_31,default,periodic,BIT,Raw_Auto_Input,2,1,ro,,,none,,,,,,,, +raw_run_status,Ratliff_Well_31,default,periodic,BIT,Raw_Run_Status,2,1,ro,,,none,,,,,,,, +raw_local_start,Ratliff_Well_31,default,periodic,BIT,Raw_Local_Start,2,1,ro,,,none,,,,,,,, +lifetime_flow_meter_gal,Ratliff_Well_31,default,periodic,FLOAT,Lifetime_Flow_Meter_Gal,2,1,ro,,,none,,,,,,,, +spt_flow_meter_unit,Ratliff_Well_31,default,periodic,BIT,SPT_Flow_Meter_Unit,2,1,ro,,,none,,,,,,,, +raw_overload_status,Ratliff_Well_31,default,periodic,BIT,Raw_Overload_Status,2,1,ro,,,none,,,,,,,, +CMD_Cloud_Control,Ratliff_Well_31,default,periodic,BIT,CMD_Cloud_Control,2,1,rw,,,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/v1/plcfreshwater_advvfdipp_tb_v1.cfg new file mode 100644 index 0000000..3a3887b --- /dev/null +++ b/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v1/plcfreshwater_advvfdipp_tb_v1.cfg @@ -0,0 +1,235 @@ +{ + "controllers": [ + { + "protocol": "EtherNet/IP", + "name": "plcfreshwater", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.12:44818" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "reference": 4 + } + ], + "measures": [ + { + "name": "flowrate", + "ctrlName": "plcfreshwater", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "tubingpressure", + "ctrlName": "plcfreshwater", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "flowtotalyesterday", + "ctrlName": "plcfreshwater", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_BBLs", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "flowtotal", + "ctrlName": "plcfreshwater", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_BBLs", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + } + ], + "alarms": [], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "DEBUG", + "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": 0, + "mqttVersion": "v3.1.1", + "keepalive": 60, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "unknown", + "passwd": "unknown", + "authType": 1 + } + } + ], + "labels": [ + { + "key": "SN", + "value": "GF5022242024422" + }, + { + "key": "MAC", + "value": "00:18:05:24:cc:8a" + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "name": "sendData", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "qos": 1, + "groups": [ + "default" + ], + "funcName": "sendData", + "script": "import json, os\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\nfrom datetime import datetime as dt\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 try:\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 except Exception as e:\n logger.error(f\"Something went wrong in checkFileExist while making folder: {e}\")\n \n try:\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 except Exception as e:\n logger.error(f\"Something went wrong in checkFileExist wihle making file: {e}\")\n\ndef convertDStoJSON(ds):\n j = dict()\n try:\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n except Exception as e:\n logger.error(f\"Something went wrong in convertDStoJSON: {e}\")\n return j\n\ndef convertJSONtoDS(j):\n d = []\n try:\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n except Exception as e:\n logger.error(f\"Something went wrong in convertJSONtoDS: {e}\")\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 try:\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 try:\n checkFileExist(\"creds.json\")\n except Exception as e:\n logger.error(f\"Error in checkFileExist: {e}\")\n with open(credspath, \"r\") as c:\n try:\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 except Exception as e:\n logger.error(f\"Error trying to load credentials from file: {e}\")\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 except Exception as e:\n logger.error(f\"Somethign went wrong in checkCredentialConfig: {e}\")\n\ndef checkParameterConfig(cfg):\n try:\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 except Exception as e:\n logger.error(f\"Something went wrong in checkParameterConfig: {e}\")\n os.system(f'rm {paramspath}')\n return cfg\n\ndef sendData(message):\n payload = {}\n payload[\"ts\"] = (round(dt.timestamp(dt.now())/600)*600)*1000\n payload[\"values\"] = {}\n try:\n checkCredentialConfig()\n except Exception as e:\n logger.error(e)\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n except Exception as e:\n logger.error(e)\n publish(__topic__, json.dumps(payload), __qos__)", + "msgType": 0, + "cloudName": "default" + } + ], + "downloadFuncs": [] + }, + "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/plcfreshwater_advvfdipp/thingsboard/v2/plcfreshwater_advvfdipp_tb_v2.cfg b/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/plcfreshwater_advvfdipp_tb_v2.cfg new file mode 100644 index 0000000..68f5636 --- /dev/null +++ b/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/plcfreshwater_advvfdipp_tb_v2.cfg @@ -0,0 +1,235 @@ +{ + "controllers": [ + { + "protocol": "EtherNet/IP", + "name": "plcfreshwater", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.12:44818" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "reference": 4 + } + ], + "measures": [ + { + "name": "flowrate", + "ctrlName": "plcfreshwater", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "tubingpressure", + "ctrlName": "plcfreshwater", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "flowtotalyesterday", + "ctrlName": "plcfreshwater", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_BBLs", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "flowtotal", + "ctrlName": "plcfreshwater", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_BBLs", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + } + ], + "alarms": [], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "DEBUG", + "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": 0, + "mqttVersion": "v3.1.1", + "keepalive": 60, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "unknown", + "passwd": "unknown", + "authType": 1 + } + } + ], + "labels": [ + { + "key": "SN", + "value": "GF5022242024422" + }, + { + "key": "MAC", + "value": "00:18:05:24:cc:8a" + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "name": "sendData", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "qos": 1, + "groups": [ + "default" + ], + "funcName": "sendData", + "script": "import json, os\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\nfrom datetime import datetime as dt\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 try:\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 except Exception as e:\n logger.error(f\"Something went wrong in checkFileExist while making folder: {e}\")\n \n try:\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 except Exception as e:\n logger.error(f\"Something went wrong in checkFileExist wihle making file: {e}\")\n\ndef convertDStoJSON(ds):\n j = dict()\n try:\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n except Exception as e:\n logger.error(f\"Something went wrong in convertDStoJSON: {e}\")\n return j\n\ndef convertJSONtoDS(j):\n d = []\n try:\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n except Exception as e:\n logger.error(f\"Something went wrong in convertJSONtoDS: {e}\")\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 try:\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 try:\n checkFileExist(\"creds.json\")\n except Exception as e:\n logger.error(f\"Error in checkFileExist: {e}\")\n with open(credspath, \"r\") as c:\n try:\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 except Exception as e:\n logger.error(f\"Error trying to load credentials from file: {e}\")\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 except Exception as e:\n logger.error(f\"Somethign went wrong in checkCredentialConfig: {e}\")\n\ndef checkParameterConfig(cfg):\n try:\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 except Exception as e:\n logger.error(f\"Something went wrong in checkParameterConfig: {e}\")\n os.system(f'rm {paramspath}')\n return cfg\n\ndef sendData(message):\n payload = {}\n payload[\"ts\"] = (round(dt.timestamp(dt.now())/600)*600)*1000\n payload[\"values\"] = {}\n try:\n checkCredentialConfig()\n except Exception as e:\n logger.error(e)\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n except Exception as e:\n logger.error(e)\n publish(__topic__, json.dumps(payload), __qos__)\n publish(\"v1/devices/me/attributes\", json.dumps({\"latestReportTime\": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__)", + "msgType": 0, + "cloudName": "default" + } + ], + "downloadFuncs": [] + }, + "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/plcfreshwater_advvfdipp/thingsboard/v2/pub/sendData.py b/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/pub/sendData.py new file mode 100644 index 0000000..4505d00 --- /dev/null +++ b/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/v2/pub/sendData.py @@ -0,0 +1,161 @@ +import json, os +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 +from datetime import datetime as dt + +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 + +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__) + 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/rigpump/.DS_Store b/Pub_Sub/rigpump/.DS_Store index 09aed8cc1b8afe0b954053d57540e056820c0086..349514709af0b49888da1be09079f71c438b8ec5 100644 GIT binary patch delta 38 ucmZoMXfc@J&&ahgU^gQp*JK_hL(a66;^d_K{2a#3noI{-H?wp6