From 9b3296a04b9d3bf741dd8c5a40df8998c6e5c019 Mon Sep 17 00:00:00 2001 From: Nico Melone Date: Wed, 9 Mar 2022 15:34:08 -0600 Subject: [PATCH] updated configs --- .DS_Store | Bin 0 -> 14340 bytes advvfdipp/.DS_Store | Bin 0 -> 6148 bytes dualactuator/.DS_Store | Bin 0 -> 6148 bytes flow-monitor/.DS_Store | Bin 0 -> 6148 bytes plcfreshwater/.DS_Store | Bin 0 -> 6148 bytes plcfreshwater/config.txt | 2 +- plcfreshwater/plcfreshwater.py | 11 +- plcpond/config.txt | 2 +- plcpond/plcpond.py | 164 ++++++-- plcpond/utilities.py | 28 +- promagmbs/.DS_Store | Bin 0 -> 6148 bytes .../__pycache__/promagmbs.cpython-39.pyc | Bin 0 -> 2654 bytes promagmbs/config.txt | 2 +- promagmbs/device_base.py | 360 ++++++++++++++++++ promagmbs/device_base.pyc | Bin 0 -> 10210 bytes promagmbs/promagmbs.log | 0 promagmbs/promagmbs.pyc | Bin 0 -> 3195 bytes promagmbs/utilities.pyc | Bin 0 -> 1765 bytes rigpump/tag.json | 1 + 19 files changed, 521 insertions(+), 49 deletions(-) create mode 100644 .DS_Store create mode 100644 advvfdipp/.DS_Store create mode 100644 dualactuator/.DS_Store create mode 100644 flow-monitor/.DS_Store create mode 100644 plcfreshwater/.DS_Store create mode 100644 promagmbs/.DS_Store create mode 100644 promagmbs/__pycache__/promagmbs.cpython-39.pyc create mode 100644 promagmbs/device_base.py create mode 100644 promagmbs/device_base.pyc create mode 100644 promagmbs/promagmbs.log create mode 100644 promagmbs/promagmbs.pyc create mode 100644 promagmbs/utilities.pyc create mode 100644 rigpump/tag.json diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c518f8da67c9beba81dd17de2732094f5a407b39 GIT binary patch literal 14340 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 y(&Turb>Sc3Y#di&B! literal 0 HcmV?d00001 diff --git a/dualactuator/.DS_Store b/dualactuator/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..eefb38633cc1450b69fca162e2a2b8f751ce6538 GIT binary patch literal 6148 zcmeHK%}T>S5Z-O8O({YS3VK`cTClY(R=k8*U%-eSRBA$s24l7~sX3HF?)pN$h|lB9 z?glL8EMjM1_nY6{><8H&#u#@OVUIDJF=jzSpL z2mJOr^I6QYApidTag=7=?kBI+8(Z5=t7)~Zd+$l+Ugl?u)b;1LXkAGe2c_-@*U>be z*t_R4$^0mp&Q(DaP9f#)CQ3q?yK<3)sjBsKz-n2oiG8qKj*hz>aWd?$I%3%y3{N{^ z&>yWmunFpinIe7tZqJNSi4XWY?9JuyHGtTRy8rj6(S1^hCVkNou# zvWNj<;GZ$T8)I+m!lKOC`eS)`)(U73&`>b1Km`Q!wMzgPxR30sppFaFAbXv9&_ SugU@GBA^JNju`j_2EG7)+)1|p literal 0 HcmV?d00001 diff --git a/flow-monitor/.DS_Store b/flow-monitor/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..112597e4dfcbf80e139428635f8c1bed9fafded8 GIT binary patch literal 6148 zcmeHK%Sr=55Ukc50)ph|aelyqe!&uwFYpIMgCMLfXw>VT@?CzK)sM@vdJ0}bHT2X> zPuC1nhwW_uw*J`N04o4Xx+4xg%+2@RXLeQ*Bhq=sHC`~_70=kuvVRXa_YzO&$@`k{ z2fX1Ex4ZYp{$Ut;Pn1akDIf);fE17dM=MYzb$N00Njg9ZNP$yRz`qZT?${NMiSg;+ z5G??4!EhMo(Mu4U2Z&wan8*mtl1fafRf}OsXS`KjS2!jn9ahbU)y-BNipA|bzePH% zOVlU@q`*{x^IWdH{%`4j^#4pHJ@|8D;yJp&Uny?`WbLtWK!V275D*tMi$rr literal 0 HcmV?d00001 diff --git a/plcfreshwater/.DS_Store b/plcfreshwater/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0895819efb250ba51c23b0c7d8c7ba1c91b4adf8 GIT binary patch literal 6148 zcmeHK%We}f6unLYnY0jP0a7&k&ACG;HALq{4F%gOOB)m)1AR-Tmv9g7%z_^{$nw4zL zb)e9FBovXPJsQ#bHE&np6mSY`ngaaoZqX49sYeNZzrNpRQuPC=0<`ny@C0e^yEc@V z(&jC zHS3laf#aj67(H=0rZb9G=S{5YA9I6gIt&O)-5bB+rxT@Q@Uz?tUc}L~+qiM0lB^de(O47WFoMhLmvIuRX@k-g+&`GlYu?SQ4FW|Dw*Jz>x!olIdaF~mDJl$m;9yisj z;@CPJvYg%I2}b=l|2+-~U%h z?#U_O6!@4#AhXA@F7Q#jgQN{@J{N#3iwlFO Rfw?~dS_YRn1^%i6KLGx<>!JVv literal 0 HcmV?d00001 diff --git a/plcfreshwater/config.txt b/plcfreshwater/config.txt index dd1f95e..4a50f9f 100644 --- a/plcfreshwater/config.txt +++ b/plcfreshwater/config.txt @@ -8,7 +8,7 @@ "file4": "Tags.py" }, "deviceName": "plcfreshwater", - "releaseVersion": "14", + "releaseVersion": "16", "driverFileName": "plcfreshwater.py", "driverId": "0100" } \ No newline at end of file diff --git a/plcfreshwater/plcfreshwater.py b/plcfreshwater/plcfreshwater.py index 91c2adb..c80188f 100644 --- a/plcfreshwater/plcfreshwater.py +++ b/plcfreshwater/plcfreshwater.py @@ -1,4 +1,5 @@ """Driver for plcfreshwater""" +import logging import threading import json import time @@ -53,7 +54,7 @@ class start(threading.Thread, deviceBase): mqtt=mqtt, Nodes=Nodes) self.daemon = True - self.version = "14" + self.version = "16" self.finished = threading.Event() self.force_send = False self.public_ip_address = "" @@ -81,7 +82,7 @@ class start(threading.Thread, deviceBase): print("plcfreshwater driver will start in {} seconds".format(WAIT_FOR_CONNECTION_SECONDS - i)) time.sleep(1) - global TOPIC_MAC, PLC_IP_ADDRESS, log, write_tag, PERSIST + global TOPIC_MAC, PLC_IP_ADDRESS, log, write_tag, read_tag, PERSIST TOPIC_MAC = self.mac @@ -204,14 +205,17 @@ class start(threading.Thread, deviceBase): self.totals_counter = 0 if self.totals_counter >= 3: self.fix_totals() + log.info("Would've run fix_totals!!!!") self.totals_counter = 0 def fix_totals(self): Daily_Holding = PERSIST["Daily Holding"] - PERSIST["Monthly Holding"] - resp = write_tag(self.plcip, "Lifetime_Flow_Meter_Gal", PERSIST["Lifetime"] - PERSIST["Monthly Holding"], plc_type="Micro800") + new_lifetime = PERSIST["Lifetime"] - PERSIST["Monthly Holding"] + resp = write_tag(self.plcip, "Lifetime_Flow_Meter_Gal", new_lifetime, plc_type="Micro800") if resp == True: PERSIST["Daily Holding"] = Daily_Holding PERSIST["Monthly Holding"] = 0.0 + PERSIST["Lifetime"] = new_lifetime persistence.store(PERSIST, 'totalizers_{}.json'.format(self.mac)) log.info("RESETTING TOTALIZERS!!!") @@ -254,7 +258,6 @@ class start(threading.Thread, deviceBase): try: if val - PERSIST["Lifetime"] > 0: self.totalizing = True - PERSIST['Lifetime'] = val else: self.totalizing = False except: diff --git a/plcpond/config.txt b/plcpond/config.txt index a7c1479..a85752d 100644 --- a/plcpond/config.txt +++ b/plcpond/config.txt @@ -2,7 +2,7 @@ "driverFileName": "plcpond.py", "deviceName": "plcpond", "driverId": "0220", - "releaseVersion": "5", + "releaseVersion": "7", "files": { "file1": "plcpond.py", "file2": "utilities.py", diff --git a/plcpond/plcpond.py b/plcpond/plcpond.py index 902a475..ae950e2 100644 --- a/plcpond/plcpond.py +++ b/plcpond/plcpond.py @@ -8,7 +8,8 @@ import logging from random import randint from device_base import deviceBase from Channel import PLCChannel, read_tag, write_tag, TAG_DATAERROR_SLEEPTIME -from utilities import get_public_ip_address +from utilities import get_public_ip_address, get_private_ip_address +from datetime import datetime as dt import persistence _ = None @@ -42,6 +43,22 @@ if not PERSIST: } persistence.store(PERSIST, 'persist.json') +TOTALIZER = persistence.load('totalizers.json') +if not TOTALIZER: + TOTALIZER = { + 'Todays': 0, + 'Yesterdays': 0, + 'Current Months': 0, + 'Previous Months': 0, + 'Monthly Holding': 0, + 'Daily Holding': 0, + 'Lifetime': 0, + 'Day': 0, + 'Month': 0, + 'Last Report': 0 + } + persistence.store(TOTALIZER, 'totalizers.json') + CHANNELS = [ PLCChannel(PLC_IP_ADDRESS, "cfgnumberofponds", "cfgNumberOfPonds", "REAL", 0.5, 3600, map_=False, write_enabled=False, plc_type='Micro800'), PLCChannel(PLC_IP_ADDRESS, "pond1height", "pond1Height", "REAL", 5.0, 3600, map_=False, write_enabled=False, plc_type='Micro800'), @@ -60,10 +77,10 @@ if PERSIST['flowmeter_enable']: CHANNELS.append(PLCChannel(PLC_IP_ADDRESS, 'totalizer_1', 'Val_FlowMeterT1', 'REAL', 1000, 3600, plc_type='Micro800')) CHANNELS.append(PLCChannel(PLC_IP_ADDRESS, 'totalizer_2', 'Val_FlowMeterT2', 'REAL', 1000, 3600, plc_type='Micro800')) CHANNELS.append(PLCChannel(PLC_IP_ADDRESS, 'totalizer_3', 'Val_FlowMeterT3', 'REAL', 1000, 3600, plc_type='Micro800')) - CHANNELS.append(PLCChannel(PLC_IP_ADDRESS, 'today_flow', 'Val_FlowMeterToday', 'REAL', 1000, 3600, plc_type='Micro800')) - CHANNELS.append(PLCChannel(PLC_IP_ADDRESS, 'yesterday_flow', 'Val_FlowMeterYesterday', 'REAL', 1000, 3600, plc_type='Micro800')) - CHANNELS.append(PLCChannel(PLC_IP_ADDRESS, 'current_month_flow', 'Val_FlowMeterMonth', 'REAL', 1000, 3600, plc_type='Micro800')) - CHANNELS.append(PLCChannel(PLC_IP_ADDRESS, 'prev_month_flow', 'Val_FlowMeterLastMonth ', 'REAL', 1000, 3600, plc_type='Micro800')) + #CHANNELS.append(PLCChannel(PLC_IP_ADDRESS, 'today_flow', 'Val_FlowMeterToday', 'REAL', 1000, 3600, plc_type='Micro800')) + #CHANNELS.append(PLCChannel(PLC_IP_ADDRESS, 'yesterday_flow', 'Val_FlowMeterYesterday', 'REAL', 1000, 3600, plc_type='Micro800')) + #CHANNELS.append(PLCChannel(PLC_IP_ADDRESS, 'current_month_flow', 'Val_FlowMeterMonth', 'REAL', 1000, 3600, plc_type='Micro800')) + #CHANNELS.append(PLCChannel(PLC_IP_ADDRESS, 'prev_month_flow', 'Val_FlowMeterLastMonth ', 'REAL', 1000, 3600, plc_type='Micro800')) CALIBRATION_TABLES = [[],[], [], [], []] # position 0 is a dummy table @@ -79,7 +96,7 @@ class start(threading.Thread, deviceBase): deviceBase.__init__(self, name=name, number=number, mac=mac, Q=Q, mcu=mcu, companyId=companyId, offset=offset, mqtt=mqtt, Nodes=Nodes) self.daemon = True - self.version = "5" + self.version = "7" self.finished = threading.Event() self.force_send = False threading.Thread.start(self) @@ -101,6 +118,8 @@ class start(threading.Thread, deviceBase): public_ip_address = get_public_ip_address() self.sendtodbDev(1, 'public_ip_address', public_ip_address, 0, 'plcpond') + private_ip_address = get_private_ip_address() + self.sendtodbDev(1, 'private_ip_address', private_ip_address, 0, 'plcpond') watchdog = self.plcpond_watchdog() self.sendtodbDev(1, 'watchdog', watchdog, 0, 'plcpond') watchdog_send_timestamp = time.time() @@ -111,40 +130,45 @@ class start(threading.Thread, deviceBase): watchdog_loops = 0 watchdog_check_after = 5000 while True: - if self.force_send: - logger.warning("FORCE SEND: TRUE") + try: + if self.force_send: + logger.warning("FORCE SEND: TRUE") - for c in CHANNELS: - v = c.read() - if v is not None: # read returns None if it fails - if c.check(v, self.force_send): - self.sendtodbDev(1, c.mesh_name, c.value, 0, 'plcpond') - #time.sleep(TAG_DATAERROR_SLEEPTIME) # sleep to allow Micro800 to handle ENET requests + for c in CHANNELS: + v = c.read() + if v is not None: # read returns None if it fails + if c.mesh_name in ["totalizer_1"]: + self.totalize(v) + if c.check(v, self.force_send): + self.sendtodbDev(1, c.mesh_name, c.value, 0, 'plcpond') + #time.sleep(TAG_DATAERROR_SLEEPTIME) # sleep to allow Micro800 to handle ENET requests - for pond_index in range(1, 5): - self.read_pond_calibration(pond_index) + for pond_index in range(1, 5): + self.read_pond_calibration(pond_index) - # print("plcpond driver still alive...") - if self.force_send: - if send_loops > 2: - logger.warning("Turning off force_send") - self.force_send = False - send_loops = 0 - else: - send_loops += 1 + # print("plcpond driver still alive...") + if self.force_send: + if send_loops > 2: + logger.warning("Turning off force_send") + self.force_send = False + send_loops = 0 + else: + send_loops += 1 - watchdog_loops += 1 - if watchdog_loops >= watchdog_check_after: - test_watchdog = self.plcpond_watchdog() - if not test_watchdog == watchdog or (time.time() - watchdog_send_timestamp) > WATCHDOG_SEND_PERIOD: - self.sendtodbDev(1, 'watchdog', test_watchdog, 0, 'plcpond') - watchdog = test_watchdog + watchdog_loops += 1 + if watchdog_loops >= watchdog_check_after: + test_watchdog = self.plcpond_watchdog() + if not test_watchdog == watchdog or (time.time() - watchdog_send_timestamp) > WATCHDOG_SEND_PERIOD: + self.sendtodbDev(1, 'watchdog', test_watchdog, 0, 'plcpond') + watchdog = test_watchdog - test_public_ip = get_public_ip_address() - if not test_public_ip == public_ip_address: - self.sendtodbDev(1, 'public_ip_address', test_public_ip, 0, 'plcpond') - public_ip_address = test_public_ip - watchdog_loops = 0 + test_public_ip = get_public_ip_address() + if not test_public_ip == public_ip_address: + self.sendtodbDev(1, 'public_ip_address', test_public_ip, 0, 'plcpond') + public_ip_address = test_public_ip + watchdog_loops = 0 + except Exception as e: + logger.error("Something went wrong in read: {}".format(e)) def read_pond_calibration(self, pond_number): @@ -260,3 +284,73 @@ class start(threading.Thread, deviceBase): if w is None: w = "Error writing to PLC..." return w + + def totalize(self, val): + right_now = dt.today() + month = right_now.month + day = right_now.day + #Totalize Today, Yesterday, Month, Last Month + #if the stored day is 0 then it's a fresh run of this should initalize values now + if TOTALIZER['Day'] == 0: + TOTALIZER['Day'] = day + TOTALIZER['Month'] = month + TOTALIZER['Daily Holding'] = val + TOTALIZER['Monthly Holding'] = val + persistence.store(TOTALIZER, 'totalizers.json') + #Communication error during initialization check if lifetime has reported properly and update holdings + if TOTALIZER['Daily Holding'] == None and not(val == None): + TOTALIZER['Daily Holding'] = val + TOTALIZER['Monthly Holding'] = val + + try: + if val - TOTALIZER['Daily Holding'] - TOTALIZER['Todays'] > 500 or time.time() - TOTALIZER['Last Report'] > 3600 or self.force_send: + TOTALIZER['Todays'] = val - TOTALIZER['Daily Holding'] + TOTALIZER['Current Months'] = val - TOTALIZER['Monthly Holding'] + TOTALIZER['Lifetime'] = val + self.sendtodbDev(1, 'today_flow', TOTALIZER['Todays'], 0, 'plcpond') + self.sendtodbDev(1, 'current_month_flow', TOTALIZER['Current Months'], 0, 'plcpond') + self.sendtodbDev(1, 'yesterday_flow', TOTALIZER['Yesterdays'], 0, 'plcpond') + if self.force_send: + self.sendtodbDev(1, 'prev_month_flow', TOTALIZER['Previous Months'], 0, 'plcpond') + TOTALIZER['Last Report'] = time.time() + except: + if time.time() - TOTALIZER['Last Report'] > 3600 or self.force_send: + self.sendtodbDev(1, 'today_flow', TOTALIZER['Todays'], 0, 'plcpond') + self.sendtodbDev(1, 'current_month_flow', TOTALIZER['Current Months'], 0, 'plcpond') + self.sendtodbDev(1, 'yesterday_flow', TOTALIZER['Yesterdays'], 0, 'plcpond') + if self.force_send: + self.sendtodbDev(1, 'prev_month_flow', TOTALIZER['Previous Months'], 0, 'plcpond') + TOTALIZER['Last Report'] = time.time() + + #If the current day doesn't equal the stored day roll the dailies over + if not(day == TOTALIZER['Day']): + #if a comms error use the stored values else use the latested values + if val == None: + TOTALIZER['Yesterdays'] = TOTALIZER['Todays'] + TOTALIZER['Todays'] = 0 + TOTALIZER['Daily Holding'] = TOTALIZER['Lifetime'] + else: + TOTALIZER['Yesterdays'] = val - TOTALIZER['Daily Holding'] + TOTALIZER['Todays'] = 0 + TOTALIZER['Daily Holding'] = val + TOTALIZER['Lifetime'] = val + TOTALIZER['Day'] = day + self.sendtodbDev(1, 'today_flow', TOTALIZER['Todays'], 0, 'plcpond') + self.sendtodbDev(1, 'yesterday_flow', TOTALIZER['Yesterdays'], 0, 'plcpond') + TOTALIZER['Last Report'] = time.time() + #the day has rolled over if the month also rolls over + if not(month == TOTALIZER['Month']): + #if a comms error use the stored values else use the latested values + if val == None: + TOTALIZER['Previous Months'] = TOTALIZER['Current Months'] + TOTALIZER['Current Months'] = 0 + TOTALIZER['Monthly Holding'] = TOTALIZER['Lifetime'] + else: + TOTALIZER['Previous Months'] = val - TOTALIZER['Monthly Holding'] + TOTALIZER['Current Months'] = 0 + TOTALIZER['Monthly Holding'] = val + TOTALIZER['Month'] = month + self.sendtodbDev(1, 'current_month_flow', TOTALIZER['Current Months'], 0, 'plcpond') + self.sendtodbDev(1, 'prev_month_flow', TOTALIZER['Previous Months'], 0, 'plcpond') + TOTALIZER['Last Report'] = time.time() + persistence.store(TOTALIZER, 'totalizers.json') \ No newline at end of file diff --git a/plcpond/utilities.py b/plcpond/utilities.py index 58c7ab0..7cc8dd8 100644 --- a/plcpond/utilities.py +++ b/plcpond/utilities.py @@ -1,16 +1,30 @@ """Utility functions for the driver.""" import socket import struct +import urllib +import contextlib +def get_private_ip_address(): + """Find the private IP Address of the host device.""" + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + sock.connect(("8.8.8.8", 80)) + except Exception as e: + return e + ip_address = sock.getsockname()[0] + sock.close() + return ip_address def get_public_ip_address(): - """Find the public IP Address of the host device.""" - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.connect(("8.8.8.8", 80)) - ip = s.getsockname()[0] - s.close() - return ip - + ip_address = "0.0.0.0" + try: + with contextlib.closing(urllib.urlopen("http://checkip.amazonaws.com")) as url: + ip_address = url.read() + except Exception as e: + print("could not resolve check IP: {}".format(e)) + return ip_address + return ip_address[:-1] + def int_to_float16(int_to_convert): """Convert integer into float16 representation.""" diff --git a/promagmbs/.DS_Store b/promagmbs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..974cfb78c9c05e9f2327ef1363e526092a599e19 GIT binary patch literal 6148 zcmeH~K~BR!3`M_bg{rdYlI2{18;q*<1RMZF!-_~jMX1~CxHjJ&gMy-}I~MRQd0yhN zGs<7YF#y}XcXz-Bz>4m~hc9#UefODNWn@8`KjY9p4MXqIb#7gR*Df%iN7ubg>t7i< z-~mTG1*Cu!kOKc(0rqUS)lH*TDIf);z_$YaeJFHiO^%K6 z>EIG00J&s1jMp(ski`RJO^%I>(5#h`t<-YFuvX4^$-J5z8(TRnhY!n>EhiL<)A{@o z>9E?URSHOfp9=WwP1|_?-_y^`|DGe00#e|QDqzdq{cg*b%icPBP4BgZ{z(5a=0-Y~ lXvJi-V%~TwzMbS1zvg~Tj*U^yc$Aa+5pZ2(Qs6ff_yj&FA94Ty literal 0 HcmV?d00001 diff --git a/promagmbs/__pycache__/promagmbs.cpython-39.pyc b/promagmbs/__pycache__/promagmbs.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32bdf1047897acc7ffee5a72fbf45c6ce500b180 GIT binary patch literal 2654 zcmZuz-ESmE5ufjw{j~3F-(3=tOo9^KO0WimKtfRz?ri5yO7`IFfYcHi#?!s)vFBsm zJ?mqa-KRSwUh*%X^$QYz3oks65HCFWg+G8Ne$~7FNWzS|x@x+*y1VLE)f0C*O#{yd z@BTghQ`<29O~TzLfbbcb`X>lCn88hMWhOJx+nJTy%r@zplR3G|T+LgV$2_g)Ghg=s z3(&h+BX6>%X$XJW;@+jn+T3Ry(G(pX@CI*k3tFwOJ=PW7<%Vcqn$YboH-&$CPxJor zKF3$KCARK--CAyo?s|Mj1g8(6@lZUxu|VSwX`EZ^(dP#5@a`LfcZGTSmatzt>}_rx z8oiC#&Yny!gbatJ49Bv}<57OB`d2u(G3c3flZ%Tq5l>R!NoSqNl=-9%tf0WJSD|hLa*0XyGx2(n1tv zkN2RK!(u$bl-Wjq_jX5FIjYS#HU8lnR~9zcb89CrxnMya|KZ8B5{k8sokEh|6LY<_;X@8JtH@^m&IL0D}+n{b`EWJwuoX;K5KwD|7 ztZ)}m_GS;B7ipEoSvnJ8bs|EpgWm5oYKJ0Hd&ML_7P7YUIH}EFqfaJvBPsK7Tuh(y z+AD`cB`Uc5ysBz<0LQDN+WhIkpx3M$)rk}_`MUOwG+PHzlw!pwk`ybrD;9ZK)IN}= z(z0Og{)H$i77U@KP6V$Tz+WN`MZqO`1y&s;vY~82kmMuTA<`wXL1dH2JtFssY=QjE zknf=T@BZ#r3hV3^X;SX)mB}Q>T59+6w0br<-hCztIsMfnAOCQLe02-5TdqHz%7?J^ zKANIM4XbUwXL+V)HqmBX9q<12DHD@a)(`R2bW|NM+(Znl+4f5@N>zniyAy$d-g3{B zZ$nY@EAl;vbs*O>egH|4Ck^|0>Fc3yEKP;WN7GCH2MjkCW<_8zUt4>|?><~u6#&NV zrA@$k1fXfCIZKy2#GQ9B?r~Rt^hkJ7yh04FAVrMNJG?xbpZ*H76)he3Ge`bKYv|I(JAi0|Y!m@Tou3;EfLr%2f&9#s|Eg$ZA8@zNELGp^ z0Lix6!Q5Y9Hw(9-ed{84{(HUwCvVOk{W7U0ah6R(IVtWs`sx$7LsDF3y_-s~&V%q( znq{F5X_yw_9~Yq#Nm+1prS(62^5VspAFOg4Aiph>*J;%6*Z00t6(v=b^v?k1Z1dp7 z%cuL{;r?Ln7va&%ul8r}e`gD-qCFr(FGRoJmmY0&=V&4eS`pbt1$vbr2UnCKlz6U; zixH9+wQ+>xb<$#3)*ck|7^zBy7lkPkV$A$kv9=^_Ol2*FJgZ86yeBT?TlmroH2zrd zDn`=c@U@xBkW`zb8f9fUR;>Ffu96d8j@I(_jhvi_vg9EG2ZF>xXz3O{4!2 z7;XY*ES}IYsdl6?7@$JKQZ^9grrQbqRQDhCAv1`t@SLgVqQm-+%etH2FQYz32#ak0M?ssI^qFwi_r8x!CZSBX#>O7de;^9g`d{%ti?Y;!I3Pgef{N>UMIjRTEK zf=CA%(F&#{(scT7V9k6QttYWIuAAE#aC-Fx{Xf*s^TELj*1(U*7aH~Q`((U{Uy=21 z2kRVGxQ_C*SbM7C<)mUQWV9;bJ_xlL$p@IHPyGK}R0p4|oc$?P0QDHe0SeoA35(!> RPzT6u5_UCysc+hj{XfP /etc/resolv.conf") + #Queue for imcoming sets + self.loraQ = Queue.Queue() + + self.knownIDs = [] + thread.start_new_thread(self.getSetsThread, ()) + + def getSetsThread(self): + + while True: + try: + item = self.loraQ.get(block=True, timeout=600) + try: + print "here is the item from the sets q" + print item + if len(item) == 2: + techname = str(json.loads(item[1])[0]['payload']['name'].split(".")[0]) + channel = str(json.loads(item[1])[0]['payload']['name'].split(".")[1]) + name = techname.split("_")[0] + id = techname.split("_")[1][1:-2].replace(":","").upper() + value = json.loads(item[1])[0]['payload']['value'] + msgId = json.loads(item[1])[0]['msgId'] + + print channel, value, id, name, msgId + success = self.specificSets(channel, value, id, name) + + if success == True: + print "SUCCESS ON SET" + if int(msgId) == 0: + return + lc = self.getTime() + + value = str(self.mac) + " Success Setting: " + channel + " To: " + value + msg = """[ { "value":"%s", "timestamp":"%s", "msgId":"%s" } ]""" % (value, str(lc), msgId) + print value + print msg + topic = "meshify/responses/" + str(msgId) + print topic + self.q.put([topic, str(msg), 2]) + + + else: + + lc = self.getTime() + if success == False: + reason = "(Internal Gateway/Device Error)" + else: + reason = success + value = str(self.mac) + " Failed Setting: " + channel + " To: " + value + " " + reason + msg = """[ { "value":"%s", "timestamp":"%s", "msgId":"%s" } ]""" % (value, str(lc), msgId) + topic = "meshify/responses/" + msgId + self.q.put([topic, str(msg), 2]) + + except: + if int(msgId) == 0: + return + lc = self.getTime() + value = str(self.mac) + " Failed Setting: " + channel + " To: " + value + " (No Callback Found)" + msg = """[ { "value":"%s", "timestamp":"%s", "msgId":"%s" } ]""" % (value, str(lc), msgId) + topic = "meshify/responses/" + msgId + self.q.put([topic, str(msg), 2]) + print 'no Set callback found for channel: ' + funcName + + except: + print "sets queue timeout, restarting..." + + + def sendtodbDevLora(self, id, channel, value, timestamp, deviceName): + + + + mac = self.mac + + if deviceName == "mainMeshify": + zigmac = "_[01:00:00:00:00:" + id[0:2] + ":" + id[2:4] + ":" + id[4:6] + "]!" + else: + zigmac = "_[00:00:00:00:00:" + id[0:2] + ":" + id[2:4] + ":" + id[4:6] + "]!" + dname = deviceName + zigmac + + #define dname, make id into techname and mac + if id not in self.knownIDs: + self.knownIDs.append(id) + self.mcu.xbees[dname] = self.loraQ + + #meshify/db/330/C493000354FB/ilora/c493000354fb2A6E/a1-v + #[ { "value":"0.5635", "timestamp":"1486039316" } ] + + if int(timestamp) == 0: + timestamp = self.getTime() + + topic = 'meshify/db/%s/%s/%s/%s' % (self.company, mac, dname, channel) + print topic + msg = """[ { "value":"%s", "timestamp":"%s" } ]""" % (str(value), str(timestamp)) + print msg + self.q.put([topic, msg, 0]) + + def sendtodbLocLora(self, id, channel, value, timestamp, deviceName): + + + + mac = id + while len(mac) < 12: + mac = "0" + mac + if deviceName == "mainMeshify": + zigmac = "_[01:00:00:00:00:" + id[0:2] + ":" + id[2:4] + ":" + id[4:6] + "]!" + else: + zigmac = "_[00:00:00:00:00:" + id[0:2] + ":" + id[2:4] + ":" + id[4:6] + "]!" + dname = deviceName + zigmac + + #define dname, make id into techname and mac + if id not in self.knownIDs: + self.knownIDs.append(id) + topic = str(("meshify/sets/" + str(self.company) + "/" + mac + "/#")) + self.mqtt.subscribe(topic, 0) + topic = str(("meshify/sets/" + "1" + "/" + mac + "/#")) + self.mqtt.subscribe(topic, 0) + self.mcu.xbees[dname] = self.loraQ + + #meshify/db/330/C493000354FB/ilora/c493000354fb2A6E/a1-v + #[ { "value":"0.5635", "timestamp":"1486039316" } ] + + if int(timestamp) == 0: + timestamp = self.getTime() + + topic = 'meshify/db/%s/%s/%s/%s' % (self.company, mac, dname, channel) + print topic + msg = """[ { "value":"%s", "timestamp":"%s" } ]""" % (str(value), str(timestamp)) + print msg + self.q.put([topic, msg, 0]) + + def sendtodbLocLoraCom(self, id, channel, value, timestamp, deviceName): + + + + mac = "1" + id + while len(mac) < 12: + mac = "0" + mac + + if deviceName == "mainMeshify": + zigmac = "_[01:00:00:00:00:" + id[0:2] + ":" + id[2:4] + ":" + id[4:6] + "]!" + else: + zigmac = "_[00:00:00:00:01:" + id[0:2] + ":" + id[2:4] + ":" + id[4:6] + "]!" + dname = deviceName + zigmac + + #define dname, make id into techname and mac + if id not in self.knownIDs: + self.knownIDs.append(id) + topic = str(("meshify/sets/" + str(self.company) + "/" + mac + "/#")) + self.mqtt.subscribe(topic, 0) + topic = str(("meshify/sets/" + "1" + "/" + mac + "/#")) + self.mqtt.subscribe(topic, 0) + self.mcu.xbees[dname] = self.loraQ + + #meshify/db/330/C493000354FB/ilora/c493000354fb2A6E/a1-v + #[ { "value":"0.5635", "timestamp":"1486039316" } ] + + if int(timestamp) == 0: + timestamp = self.getTime() + + topic = 'meshify/db/%s/%s/%s/%s' % (self.company, mac, dname, channel) + print topic + msg = """[ { "value":"%s", "timestamp":"%s" } ]""" % (str(value), str(timestamp)) + print msg + self.q.put([topic, msg, 0]) + + def sendtodbLoc(self, ch, channel, value, timestamp, deviceName, mac): + + + #this will add your derived nodes the master nodes list, allowing them to receive sets!! + localNodesName = deviceName + "_" + str(ch) + "99" + + if not self.localNodes.has_key(localNodesName): + self.localNodes[localNodesName] = True + self.nodes[localNodesName] = self + + #make the techname + lst = textwrap.wrap(str(mac), width=2) + tech = "" + for i in range(len(lst)): + tech += lst[i].lower() + ":" + + + chName2 = '_[' + tech + + if int(ch) < 10: + ch = "0" + str(int(ch)) + + if len(ch) > 2: + ch = ch[:-2] + + dname = deviceName + chName2 + str(ch) + ":98]!" + + if int(timestamp) == 0: + timestamp = self.getTime() + + topic = 'meshify/db/%s/%s/%s/%s' % (self.company, mac, dname, channel) + print topic + msg = """[ { "value":"%s", "timestamp":"%s" } ]""" % (str(value), str(timestamp)) + print msg + self.q.put([topic, msg, 0]) + + def sendtodbDevJSON(self, ch, channel, value, timestamp, deviceName): + + if int(ch) < 10: + ch = "0" + str(int(ch)) + dname = deviceName + self.chName2 + str(ch) + ":99]!" + if int(timestamp) == 0: + timestamp = self.getTime() + + topic = 'meshify/db/%s/%s/%s/%s' % (self.company, self.mac, dname, channel) + print topic + msg = """[ { "value":%s, "timestamp":"%s" } ]""" % (str(value), str(timestamp)) + print msg + self.q.put([topic, msg, 0]) + + def sendtodbLora(self, ch, channel, value, timestamp, deviceName): + + if ":" not in ch: + ch = ch[0:2] + ":" + ch[2:4] + + #this will add your derived nodes the master nodes list, allowing them to receive sets!! + localNodesName = deviceName + "_" + str(ch).replace(':', "") + + if not self.localNodes.has_key(localNodesName): + self.localNodes[localNodesName] = True + self.nodes[localNodesName] = self + + + + dname = deviceName + self.chName2 + str(ch) + "]!" + + + + if int(timestamp) == 0: + timestamp = self.getTime() + + topic = 'meshify/db/%s/%s/%s/%s' % (self.company, self.mac, dname, channel) + print topic + msg = """[ { "value":"%s", "timestamp":"%s" } ]""" % (str(value), str(timestamp)) + print msg + self.q.put([topic, msg, 0]) + + def sendtodbDev(self, ch, channel, value, timestamp, deviceName): + + + #this will add your derived nodes the master nodes list, allowing them to receive sets!! + localNodesName = deviceName + "_" + str(ch) + "99" + + if not self.localNodes.has_key(localNodesName): + self.localNodes[localNodesName] = True + self.nodes[localNodesName] = self + + if int(ch) < 10: + ch = "0" + str(int(ch)) + + dname = deviceName + self.chName2 + str(ch) + ":99]!" + + + + if int(timestamp) == 0: + timestamp = self.getTime() + + topic = 'meshify/db/%s/%s/%s/%s' % (self.company, self.mac, dname, channel) + print topic + msg = """[ { "value":"%s", "timestamp":"%s" } ]""" % (str(value), str(timestamp)) + print msg + self.q.put([topic, msg, 0]) + + def sendtodbCH(self, ch, channel, value, timestamp): + + + if int(ch) < 10: + ch = "0" + str(ch) + + dname = self.chName + str(ch) + ":99]!" + + + + if int(timestamp) == 0: + timestamp = self.getTime() + + topic = 'meshify/db/%s/%s/%s/%s' % (self.company, self.mac, dname, channel) + print topic + msg = """[ { "value":"%s", "timestamp":"%s" } ]""" % (str(value), str(timestamp)) + print msg + self.q.put([topic, msg, 0]) + + def sendtodb(self, channel, value, timestamp): + + if int(timestamp) == 0: + timestamp = self.getTime() + if timestamp < 1400499858: + return + else: + timestamp = str(int(timestamp) + int(self.offset)) + + topic = 'meshify/db/%s/%s/%s/%s' % (self.company, self.mac, self.deviceName, channel) + print topic + msg = """[ { "value":"%s", "timestamp":"%s" } ]""" % (str(value), str(timestamp)) + print msg + self.q.put([topic, msg, 0]) + + def sendtodbJSON(self, channel, value, timestamp): + + if int(timestamp) == 0: + timestamp = self.getTime() + if timestamp < 1400499858: + return + else: + timestamp = str(int(timestamp) + int(self.offset)) + + topic = 'meshify/db/%s/%s/%s/%s' % (self.company, self.mac, self.deviceName, channel) + print topic + msg = """[ { "value":%s, "timestamp":"%s" } ]""" % (str(value), str(timestamp)) + print msg + self.q.put([topic, msg, 0]) + def getTime(self): + return str(int(time.time() + int(self.offset))) + + + + diff --git a/promagmbs/device_base.pyc b/promagmbs/device_base.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb1fc540e6009a6f0211142320b0816faad691c7 GIT binary patch literal 10210 zcmd^FOLH7o6~5gw8fivPKgaSTYRh(*BreHz9*z|gT$XLwNj$+V2M0N3Xic}ImPXyu zbdPN%(#k1Vriu;x1Bxn&1q-UEB3m}F;s@{(C@8j6;QP+)?itCFYy}6X!q(im?>_h5 z^L^)>+mriyf9d3jKR9)j{LA6{3O>=#k+}FXR70tmEN`e8Bds^pjG5+hY9^QF^J*ra z=DXBPSDG)VnL?WHRx{mczDLdUr1_$nDW>_7nkl9EUNzIJTs#gl=hWv)JyGiWGkuhA zy3z$%{eR+LH7-$X@1bA!t~!yIEsNDx@rizh#KVHHi2j}bl=>WkU_k~S#nqUS!BXVm zTt{ANu!t_nUTjWK=vNVK=7huAZ|%AcyzC129(<;nL%YwR|X(louc;QlgDQg zpXg0Psr7EPu2c<~f@BP}jz83xY8`*bBs7NX?L1*PZt%Uk~4};sa{&Ab0ACp^T)^s|$zJ;-U08ht<3u zQC9I0wK&ZA7LW2wA(R2t)%#hEOl)H9evDmI6L<(zg*8(B;AG7F?eozfzO>$0fwSyc zel!uIO8FcX9Y#`LSPot5;>C;Bcry&+@uoM6ujo}YdG&=*hDBcUq1UwD9+UspyVkfD z*U>Wy8xP0oVK5i*RBxZJ-LK$VRgNKv3rNDbxyXy-Ze;7>@`@9z#q3E@q&;XY&w5Q+ z!)k|)SJU?Tf@Ed9WG~2EO>d>))V-JhX|1eah8%LsPF-3Z*M(@2Jn3$;rMtP_Y-?V3 ztGD7Fbf5E^QEayY>9@QZ$1+_Ix?UurG{U;ms7jHW8Ac*;v=+tQvUI)E@{-9LVbi%I zlP(3}qu|yx-8WundX5_pVRRHb&A1kLk7`L}KPuIdCRrAo%TW2b2GHKtixtp(1(G7ia3eZgW4jOS zee83NJ&j`a|D3T8|GSJHW4|$&)uP=j8vRDUIf(B%^@wZX(*@R7aTJf=$wAAS-_EU# z=BU1gS_G^Ng-YTp2VFNe47KK)fG?0|Ai>$-8`uDVmrT|C!o+4^QHx*(R2I}Q+q%^- z;5iH^4le?~0wz|XZNudDJ>LjD+XfzKD$XM~-qw*kUXv%*H# z&QBY}RE6!EhtLGt%c&`l-V`Wg3Jf;|Ce%~}+JRVDG`J|O>xr<1FQul(ND#I|gZrU$R7i`)o@2)}(zaW9!qblB~ z%2PK3Lw$U2HAm6hW7u0{KgQ=CrK%hUo~nZBSrE~Z5L@godtoc~KL#H~7CJ0=O;WlQ zFW?KbWX(0hWhsGmBWqPGf>6B}2$^KXS!;xjD+D97GA3!w{|b(VO*q>mQ+f15r;#w+ zax{O-6&9KPXmaxU^tAP1)tbJ3HzFlj)2(_PjBA0-Vn3Llup-idbvH!r4dm`ypIM_a z+33XRnP~K^HOjSs6qi@B8hL~+SsT^^nHhZ+{JAxnnw2n!yl6Zc!F-ilLF_dHr(sPw zvG>SX8^0#Lk#)V<44bb+q%-S=<2O9FEt4$MiVm`^QVp$1r_q>o>Pyy*uobwkM5oXY zgzRsD_;u49o2u+e`kpl0!LbK}M21);~5jR^h(bWPbZ75-~iW zd--m7fqX}C6AB0Ijlw{-o97ZqE?Q~$vE9evBv&{bc;<>%_vidN1dL?7A85;pdGBI3 z#ZcI^Y|^^Y(gy8@(}1*M@LEBg=Cr~oZSJEyo{A&wG3>oqW^Ha|y;@CZ|9sb`Phh{s zaqJQ4Ll;k@QI}`p2u1ujT=DB-E@1$%x?K&C{Sqb{6mqBgVWLgP%C?)^1^Z;jLMR|n|Fp(UC z>4kY=+~)EidU&Tray(cZSs`y`WU4t+TLKyZj)fNt_D3sR;9Sb|LQ+)ADrlANh9BJ4 zU={S$?w>n9aqe9EukE1<$M{rypXZS{tm&wZAs8+mYDxm`?D&}|`-@)2;Aazy1uCfs zkOt7-&OB2GZe!pIIJH|vop?O!d67-VvfpIFI(wW6@ngS*MBFq1kA0bS?=T@S#4pQO z&8C;8T{kZBQ-7Y`Dd%$uG5ZRezk_5~XvB2iBgh$t?kp(o1NfQHRTU93DqjQ|-ZEb| zO1VK}$T-{uH_ap_j^p#RuK$+04mYWw9$R!Lpb*p>=o?(MifFv{4OWZl9@G+NO^sTj z+Ee*aBgzkLWf98XL*-A3@Q#WsmNG0rXZAR12P|9`-S5N#$ObMMQVjc4u zWt6GlP+jdlB6RJN=!xSFaN*@$yK$rhrhpAxy%cIdl7^agP#=g`@EkL!A?m|O?AEqW z+b05Rs6p~=q1H!_ErD9*R0-5*wyHiAS?t(3`zo?2XkG}^XcbbZ(Y}q#gT@7) z{>9)?{D@7D(t+ycs&TnDuxS|tw)P}*f=0n5cSJxJwPvGw)1UR)XtuAhZyU(ZhOd2{ zBQn(5H&~ova)rs>p!z{rCscookrGI&e8D(m48R<<;d%yU?I1qSg6)@pEiW#h<6EI? z3UtpBsnlsSul8%`<^{ST^*+IBYN%L5z#~|N-C_~&C=t578FX>Kp%MPvqjrGqm2IKh zzXiI0tYC6*Tj+wOaPiRr-QBu93%Ui_80Q;?Zef#^6zJOTLm33W_AM&Zi-qs`iRdZ# z+V4^Q=(>%c`d`DX{Q>uYp0OC;{{md;pQn~Jf$L8Iuge!PVD&Qun2@6gap3&Hrs+$U z9^sNdkqz*;te&FdriPxTc&I4D9aze%=HG-PO3KpBBmfXd$AU>GFw&XT>=Wp{`V{nF z@USVM99T`HiGzyTembbQTgB?N)kLOkH3!uCK;oeG^8x_fQ31Cgxrz|0$#bdNuOO8$ z<PQEkav(-Gq#*3x9f-sAXD(^-)?O)^xnrW4G2Vi#pKjqs7z?67rW9NPv@9wxya zsi3~l_E@)=yqFGh`_fY`UURI9VtGEpL-7K9n;!q3j3WnhpzV(=YM31{_v12gD0j># zAW}P?E1^8hI+HD1{MjPLWib0a3YoekZtQDxVs? z>Lprt={dCSG)8s?L1&_;?^Y~^K%x+Dptn{$Il*>}Be79iXSmNg#`zv|S&Y-6F<;j; zLKO4f^oP~IVqUq5Q9N(N`#fvLEm`bBAZBNMD06}s9KR;iBNxdh$+C1-l1M!xBhX`; zj6k{QheLuV!2{Qdz;Ie(`K{LosR0j;2>6OGi;B$aCQ5`sAh?agM zbAyXB)qw&)X>>ROE=2!CbrQ|cgu5NXVGLt*4(}C$#0dCm<|ftQHdS>n?4ZFwIy{H+3qc+Jj zov&CvjzqzXkK`<}iZPTwmfv01`gb(nT5+`b){4_lk#HI)>hwp0xM+E77RVJ02(%lqA!%r*%x;A3Q_H^fiyxvCR%F=|Edi z`$J^E7E$f>wnj8;JLM9++MT|>3FYdvVBoM}D2djsd}6`KW9Am!B7c!pGamaL3K@qa zHtS4cvl5$>Fc{8LELl=3mJ08iwpgkMa`3xYDyU9EH&9-_+S%DsL2J@?P})*q1R}*3 zWvTX{09$O89OsTqBAs_+lD+T;pOf;(?m2D!#4%lfSG@znD0&BL2f0m|9<> z3YNKJ`a)Hl4e8SMIJlSEM}oCljW_$Xn*4aAR>QAqS`8LC zdo>I^o5vt8yX>3H-DXl{a-Yd3Odc@#0h1b&A2M;6kp9|&Np3so&`a(jB3`W&%+n`| zmy0Kgqs3Fj)5U?}vEtF?OAlRk25KA2%(EtnXS5hyNMsj*ftx7nVe&S&vOVbkG!n6?Oh&NbOZ_UyUqXH FzX0&`%zyv@ literal 0 HcmV?d00001 diff --git a/promagmbs/promagmbs.log b/promagmbs/promagmbs.log new file mode 100644 index 0000000..e69de29 diff --git a/promagmbs/promagmbs.pyc b/promagmbs/promagmbs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7816482b3ade8088df98cd333467462f99908e4 GIT binary patch literal 3195 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 BSsVZW literal 0 HcmV?d00001 diff --git a/rigpump/tag.json b/rigpump/tag.json new file mode 100644 index 0000000..6847a88 --- /dev/null +++ b/rigpump/tag.json @@ -0,0 +1 @@ +{"1": {"c": "ETHERNET/IP", "b": "192.168.1.10", "addresses": {"300": {"2-2": {"ah": "", "bytary": null, "al": "", "vn": "VFD Current", "ct": "number", "le": "16", "grp": "3600", "la": 0.0, "chn": "vfd_current", "un": "1", "dn": "rigpump", "da": "300", "lrt": 1575910120.446133, "a": "VFD_OutCurrent", "c": "1.0", "misc_u": "Amps", "f": "1", "mrt": "60", "m": "none", "m1ch": "2-2", "mv": "0", "s": "On", "r": "0-250", "t": "int", "vm": null}, "2-3": {"ah": "", "bytary": null, "al": "", "vn": "VFD Frequency", "ct": "number", "le": "16", "grp": "3600", "la": 0.0, "chn": "vfd_frequency", "un": "1", "dn": "rigpump", "da": "300", "lrt": 1575910120.518855, "r": "0-75", "a": "VFD_SpeedFdbk", "c": "0.5", "misc_u": "Hz", "f": "1", "mrt": "60", "m": "none", "m1ch": "2-3", "s": "On", "mv": "0", "t": "int", "vm": null}, "2-1": {"ah": "", "bytary": null, "al": "", "vn": "Discharge Pressure", "ct": "number", "le": "16", "grp": "3600", "la": 20.0, "chn": "discharge_pressure", "un": "1", "dn": "rigpump", "da": "300", "lrt": 1575910120.644362, "a": "val_DischargePressure", "c": "5.0", "misc_u": "PSI", "f": "1", "mrt": "60", "m": "none", "m1ch": "2-1", "mv": "0", "s": "On", "r": "0-500", "t": "int", "vm": null}, "2-6": {"ah": "", "bytary": null, "al": "", "vn": "Discharge Pressure Setpoint", "ct": "number", "le": "16", "grp": "3600", "la": 45.0, "chn": "discharge_pressure_setpoint", "un": "1", "dn": "rigpump", "da": "300", "lrt": 1575910120.730308, "a": "cfg_PID_DischargePressureSP", "c": "0.5", "misc_u": "PSI", "f": "1", "mrt": "60", "m": "none", "m1ch": "2-6", "mv": "0", "s": "On", "r": "0-500", "t": "int", "vm": null}, "2-7": {"ah": "", "bytary": null, "al": "", "vn": "VFD Frequency Setpoint", "ct": "number", "le": "16", "grp": "3600", "la": 45.0, "chn": "vfd_frequency_setpoint", "un": "1", "dn": "rigpump", "da": "300", "lrt": 1575910120.798552, "a": "cfg_PID_ManualSP", "c": "0.5", "misc_u": "Hz", "f": "1", "mrt": "60", "m": "none", "m1ch": "2-7", "mv": "0", "s": "On", "r": "0-75", "t": "int", "vm": null}, "2-4": {"ah": "", "bytary": null, "al": "", "vn": "Device Status", "ct": "number", "le": "16", "grp": "3600", "la": 64, "chn": "device_status", "un": "1", "dn": "rigpump", "da": "300", "lrt": 1575910120.8616178, "a": "RigPump.State", "c": "1", "misc_u": "", "f": "1", "mrt": "60", "m": "none", "m1ch": "2-4", "mv": "0", "s": "On", "r": "0-32768", "t": "int", "vm": {"1": "Running", "128": "Overpressure", "64": "Idle", "1024": "Faulted"}}, "2-5": {"ah": "", "bytary": null, "al": "", "vn": "Flow Rate Setpoint", "ct": "number", "le": "16", "grp": "3600", "la": 55.0, "chn": "flow_rate_setpoint", "un": "1", "dn": "rigpump", "da": "300", "lrt": 1575910120.928473, "a": "cfg_PID_FlowSP", "c": "0.1", "misc_u": "BPM", "f": "1", "mrt": "60", "m": "none", "m1ch": "2-5", "mv": "0", "s": "On", "r": "0-5000", "t": "int", "vm": null}, "2-8": {"ah": "", "bytary": null, "al": "0", "vn": "Auto/Manual Mode", "ct": "number", "le": "16", "grp": "3600", "la": 0, "chn": "auto_manual", "un": "1", "dn": "rigpump", "da": "300", "lrt": 1575910120.996027, "r": "0-1", "a": "mode_Auto", "c": "0", "misc_u": "", "f": "1", "mrt": "60", "m": "none", "m1ch": "2-8", "s": "On", "mv": "0", "t": "int", "vm": {"1": "Auto", "0": "Manual"}}, "2-9": {"ah": "", "bytary": null, "al": "0", "vn": "Control Mode", "ct": "number", "le": "16", "grp": "3600", "la": 0, "chn": "auto_control_mode", "r": "0-1", "dn": "rigpump", "da": "300", "lrt": 1575910121.059379, "a": "controlMode", "c": "0", "misc_u": "", "f": "1", "mrt": "60", "m": "none", "m1ch": "2-9", "mv": "0", "s": "On", "un": "1", "t": "int", "vm": {"1": "Flow", "0": "Pressure"}}, "2-10": {"ah": "", "bytary": null, "al": "", "vn": "Energy Today", "ct": "number", "le": "16", "grp": "3600", "la": 0.0, "chn": "energy_today", "un": "1", "dn": "rigpump", "vm": null, "lrt": 1575910121.126346, "da": "300", "a": "Energy_Total[0]", "c": "10", "misc_u": "kWh", "f": "1", "mrt": "60", "m": "none", "m1ch": "2-10", "mv": "0", "s": "On", "r": "0-250", "t": "int"}, "2-11": {"ah": "", "bytary": null, "al": "", "vn": "Flow Rate", "ct": "number", "le": "16", "grp": "3600", "la": 15.0, "chn": "flow_rate", "un": "1", "dn": "rigpump", "da": "300", "lrt": 1575910121.195685, "a": "val_Flowmeter", "c": "5.0", "misc_u": "BPM", "f": "1", "mrt": "60", "m": "none", "m1ch": "2-11", "mv": "0", "s": "On", "r": "0-50000", "t": "int", "vm": null}, "2-12": {"ah": "", "bytary": null, "al": "", "vn": "Energy Yesterday", "ct": "number", "le": "16", "grp": "3600", "la": 0, "chn": "energy_yesterday", "un": "1", "dn": "rigpump", "da": "300", "lrt": 1575909846.276182, "r": "0-250", "a": "Energy_Total[1]", "c": "10", "misc_u": "kWh", "f": "1", "mrt": "60", "m": "none", "m1ch": "2-12", "s": "On", "mv": "0", "t": "int", "vm": null}}}, "f": "Off", "p": "", "s": "1"}, "2": {"c": "M1-232", "b": "9600", "addresses": {}, "f": "Off", "p": "", "s": "1"}} \ No newline at end of file