From 71bc9f9b39eeebef3e3d6aca1abfe4e419d665a8 Mon Sep 17 00:00:00 2001 From: Nico Melone Date: Wed, 1 Nov 2023 08:57:21 -0500 Subject: [PATCH] updated various devicetypes --- .DS_Store | Bin 10244 -> 10244 bytes .gitignore | 5 + Pub_Sub/.DS_Store | Bin 22532 -> 22532 bytes Pub_Sub/abbflow/.DS_Store | Bin 8196 -> 8196 bytes Pub_Sub/abbflow/v2/.DS_Store | Bin 6148 -> 6148 bytes Pub_Sub/advvfdipp/.DS_Store | Bin 10244 -> 10244 bytes .../mistaway}/device_supervisor.cfg | 0 .../v1/advvfdipp_wo_downhole_tb_v1.cfg | 10 +- .../v1/dual_flowmeter_ma_v1_2.6.1.cfg | 567 ++++ .../thingsboard/v1/plcpond_tb_v1.cfg | 0 .../thingsboard/v1/pub/sendData.py | 0 .../thingsboard/v2/bn_pond.cfg | 0 .../thingsboard/v2/fkplcpond_ec2_2_1.cfg | 594 ++++ .../thingsboard/v2/plcpond_tb_v2.cfg | 0 .../thingsboard/v2/pub/sendData.py | 0 .../thingsboard/v3/fkplcpond_tb_v3.cfg | 666 ++++ Pub_Sub/gateway/1701.cfg | 2841 +++++++++++++++++ .../thingsboard/v3/pub/sendDataNoel.py | 155 + .../mistaway/v1/pub/sendDatav2.py | 343 ++ .../mistaway/v1/sub/receiveCommandv2.py | 92 + 20 files changed, 5268 insertions(+), 5 deletions(-) rename Pub_Sub/{advvfdipp_wo_downhole/thingsboard/v1 => advvfdipp/mistaway}/device_supervisor.cfg (100%) create mode 100644 Pub_Sub/dual_flowmeter/mistaway/v1/dual_flowmeter_ma_v1_2.6.1.cfg rename Pub_Sub/{plcpond => fkplcpond}/thingsboard/v1/plcpond_tb_v1.cfg (100%) rename Pub_Sub/{plcpond => fkplcpond}/thingsboard/v1/pub/sendData.py (100%) rename Pub_Sub/{plcpond => fkplcpond}/thingsboard/v2/bn_pond.cfg (100%) create mode 100644 Pub_Sub/fkplcpond/thingsboard/v2/fkplcpond_ec2_2_1.cfg rename Pub_Sub/{plcpond => fkplcpond}/thingsboard/v2/plcpond_tb_v2.cfg (100%) rename Pub_Sub/{plcpond => fkplcpond}/thingsboard/v2/pub/sendData.py (100%) create mode 100644 Pub_Sub/fkplcpond/thingsboard/v3/fkplcpond_tb_v3.cfg create mode 100644 Pub_Sub/gateway/1701.cfg create mode 100644 Pub_Sub/hrtankbattery/thingsboard/v3/pub/sendDataNoel.py create mode 100644 Pub_Sub/plcfreshwater/mistaway/v1/pub/sendDatav2.py create mode 100644 Pub_Sub/plcfreshwater/mistaway/v1/sub/receiveCommandv2.py diff --git a/.DS_Store b/.DS_Store index e867c4179899c3e85e055970a0ffcf6174f39f20..51f7a6f1ef21e50e06c6aa59ffc1394b7a2a9cae 100644 GIT binary patch delta 1961 zcmc(gYitx%6vxkhx}`IW(7W3$ow9Uyp|ypwVwVE8n3C;Fffie73k8I_k7=2>-Ca7{ zA`-Hw=m!;3a(!ULXf$dQrKBK4M5DyuGeRIulthgYO*AnoUoc7{-q~rPd{DobILXYp z=iGb#_i=u^cTfAC_TeH$C6W{(P2K0OD9IrrhtsE0aekRnEOEc_C9Rhc8# z8sRvSKkG2~K4(Z`p0RL_<4B(Dkdenv7Ws0_4_66WpqfLCk$5s9w5mBY_Z)SGwr>5p z?hPAz7#lS8wR$|9Hiq=3a9THc#?zbWHloQyhjE|Y!(2m#zP&A#Hj)W*ojza+t0<#0 zi{{L|vGV36wJRD|wziMwGpDOSEmSueF+GtsdJTPGL)eV!iI|b->)LL_(p%RL8Kx15 z>z#>kzpgkXhcfPRvV5&r^T@1J?jDR7+XjvF4lA0;SG}5FVMpb=Vq#5ek}*p%W+!;H zGFjea#Ty57@wLNhg|cN~nq&Xf zNu)3U6Fcw#9>ha<7?0y=?8mb>fR{0fLm0zhoWv*i6rbTV&f{BLz<0QWD-ubNRLLz> zNb{viX`vL5mP#w6#(7e!y#vWY+UYUS#d*1zGp`ro)d zKQl|RyKq*K-@?15u7Q`&>B^|SE&-8#uZ{9Gv?rlvc@{15xK=#dGk2cqW4Qt|+bypU z?lggz?Jf-Xd`uE#+iq3Rr?MQut&+`M8W1ifoZ988${d1VB{S}sU972Us9v#tIgGM{ z8=Hib#p8dC#m97xzMyaDCxOME$bpsmWtVKr_h8}@J1X0A1 z5IAfTKD>_x{dP_1E{u{;@x`HP|8k8dBD}+`m`x6Kny0o&BK1 z%xFB4OvZ^jUGw=9&N>J4>^&r$N`A#T-EsW#$oG7Pt7fthU{i&d=RM-1F8>r2%j*@Q zw&tiS;BX9kcJr@Aqx@*m=X_>C)nudWIxWX=i1-0_fWKI9af+UZOwkh_i}zjIiMVg- ztR(l;1tZb8(&I9MC-FRl&l3ix*hgVoCd{#$DJ wNMSFqFTAZd*E&EVzqtIUS=@71FTt_!FF8EFte$t49pnl3O~~%%e_d_jFPPBk%K!iX delta 1739 zcmbuAe@q-j6vyW~cZFR$EyJ(lSPnP}wTc&dwAunK2n9k7SZLu|C=GDOE@kz&qqhfD zTXT)pw5HXH^N-QiX#7KC)o4+p?O&$0Rb!1&jG-|m5^b9Jhx(8H(?n-)k4h6YX`Ezt z=Djy>-kZ0dojKfdxaXN7u$g_HnVMn|ta29;*(&4%LO6-;t?eC+PfX6{DjxT&-#z1+ z%~sqBDg^U-hgOV`ZE~iY)R4WzB*}?*TU#U=k4T+zBr?`+HC|}B*{=VmeRAB1CVj|? z$HiH1wRppOOgytK}QPp8yeBi+P`i%j9 zZQTZO*w-vZ%h!R-a(V`W@p9J#m-<91zi?BlQwLW~WHM@6$zbpbsLQ=9D_c=-Th3N! zp`D>!Y+#t@O`FF4?#ZMXk6Am7ge7}%Ie#oQ%=wgM>@cF?q&aQ0g_DNWZ;r-ez2+lE zfxVw44eDDfi+mNUtJmIL-?*itvwJRw=jJh1=-D-GT4p3_41}#wBc_|Ny`lZ4o*dt8 z>P9SSj+sV6RdW&Oi-jkQxx8GS<1N;-{;5dH+&5(=ALf;cl2(_NX>5-!v$#L5+ip64 zPf^pBRb`qsXj@tnhJ5Q8huha^tk06k@^EJ2T>-}W9yDV*w^YY9Sj)6fG#oLaTvweq z_iSL=u4yBYvJ1gGGunniru9noX%&0x3+28ZfiW8 zFuM20j0FEAqu(m^!#pQ#vEABrGZ{~0j9qdg1NMR~x^8fLA9fWrZAY)7@UO&3UO}pI zvFMe})y^=zA+@qOn6W6Nl&m9dq>GG@1UW#SBF~Z25b(X%F4*q)z4k zo^HD{eWs(foK1Sj6cI=B3)a8#&p`V+wszddI{y{umRkdQex+Uf{DMMHk>BRJuCYao z6@*f(d=Y5}$(TcrItdwygAx=kW^|dRKJgzAJ5081WK(0wV zu1h>tA|GC?K@fFl!d7fUw*;aWsSt)RjIiXwrXq$(?1P1acvOOM2#?_yj^k;Zz>I|B z1&N0Z$7^^Ur|~A<#|QWjXK@}M<03BMQ;Eyh_zpi{!THuV5a_xY0sOp(fR9ATFzJ;n zM3$cQR~od!bDM?f@n>a*Cp;C@Iy8I6Gk}>x+jCvcg8t>QZs z>M0X`h{%V8UVGR&4?aX7L6HREQ$i3(Q4jS{(0g=dT|_8?I&jYU;QKG%`OmjpB+Esz zdbVK$02}}^Kpw_Hg&Zu5nzTlI$YbDw;NTf8;Et*h2S&nexLf~y=ej3aEb zC04SOMuE1uKJmmuT{7~Rs%;h~viS^Mt2^x?K3q~dsG;y2CPy+2hOT!hTF6-JQVLoi z5bRQdx`A?7ryp7l6Y>;uopU~Sq0p`A8Y8t6S}9V~ds$>Cw74jV4XytEbC;*hnOW;L zuAcOg75wRIL?z~;Z;!o{a9s7v=A?E$W6k7BBFXj^`c<`l#)`+&rj@pJZ%&DycZXj@ z%S85%gq)i?P=*7rqw%#`jrW^WGKi^w2V4DK6#Z^gg)Phm+|(EN&Jlt)bOrnM9ft%H zFpY(wZf^;(F`JNKrvW%xdL zlyhEr61vOtvUCPheIDHCpW|yHP{O09s<21x{QEe&na>Pv{T&v=9r(>%A$;X;zQIS~ zUeN|iN%mK^5#@m@vQ51M1%mlOw`dzJZCNIc4S3NPsp2xjm>cxqrN~uo6KqJoM6MH_ ta9MmDGw?y|9+w0LdvJQFnvNubQpKK4$Ums{QD^dpfX`#CzZZ0IzW|Ei@^JtF delta 618 zcmaJ;O=uHA6n-IUb!dXFK^YKAel8G#0`~M^*kQ_SR1bKAFs5NIHNgjWF&v_O@3xN!EQK zKau=FJJTb0KJ}4D56&~J&xUX%onWlEh)>hHa>w6zS;=hV#9>o%T!#@ToAog zD~_wf1EPp;TenDixlYDi+wgf_qkB3Y{E%G=2r=WUlb<`DU1{zPy+;*iaJjU!y(GvOSy_jO|Xwb-#zQuO!cuoNCRb0Ddot;KRG-sJMiC@ryY; pXo+mEkbf&2^YdaZEWT3ZzJ;GsK#aB(AF^MZThDoI{v&-){{ULXt^@!8 diff --git a/Pub_Sub/abbflow/.DS_Store b/Pub_Sub/abbflow/.DS_Store index fe912d9de0daaf580088c11cf2a3d30576b454cb..4404c41c78a0b723176f898c1be063be71bbe07d 100644 GIT binary patch delta 342 zcmZp1XmOa}&nUVvU^hRb=wx0&DW0VA;)0}{{3HejhMkkY3l?ffR#%%C8|x?-TA0-8 zC{!C77?|rQm>Zka)^c))D(hPZ#b@W_=H+)!o+u>G*aI?SGK-)AGvgj{5L+ZS-^B%L z9*2Xw>XL+mM;yV5>IHdF1=b4kGBGJ^-Xl1bk&!H`c|;`ZbJ7iilk;;6fX)Ykh-W~8 ziJ^?a2-z9DHxo53-aG7wkV}C(5nZkz1KGR=pcaUEWx+*xIr(|%Kt3Y~34ml67&k8w HN#F(mfVofC2o|bKR9BlAnCK{&Sen=B zC{$Y-835VFX0^4P9HPql)N*d6^g(Ht!Xj$~gJE;GxOFB0@Z6!9{sF`FZI;(-=1!@?2xy J%r5bl9ROZIH{$>R diff --git a/Pub_Sub/abbflow/v2/.DS_Store b/Pub_Sub/abbflow/v2/.DS_Store index d4e3577870d53d5b1f4ceb4d44279d4563588c62..3bf4fcbc4ca8d87afacecce93a6bd00dad4fac79 100644 GIT binary patch delta 228 zcmZoMXfc@J&&abeU^gQp&tx7ZiR=P~Qii0Qbi?4}{M-TtFksUKQp^lsncRFAm!zEh zB%lb#lf7-f&)qxhh%B3eN46jX*;E0B$?{CU!&yIpwHJe|MK=6VzSrLiFvFp;2*WXD R(G1^Q$gIY)nVsV=KLCy3Kz;xK delta 123 zcmZoMXfc@J&&aVcU^gQp$7CKRiOEx#zJ)V@05d}|Ln%X2ZoZ34QcivnP=urZ|C}Ee m?j3eSmQBGUTaaNGoSdIq05T2;Ha}!mW0}}cu$i6XFFydlPD820L2>@wg3PC delta 57 zcmZn(XbISmAjG(Ha-vWnk7RYVp{1Fzj)JMF<>Zqh(v01c{|L!5_DmKO64`7Ze4S@A NtHNKF%`Bo!%m5k95sCl+ diff --git a/Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/device_supervisor.cfg b/Pub_Sub/advvfdipp/mistaway/device_supervisor.cfg similarity index 100% rename from Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/device_supervisor.cfg rename to Pub_Sub/advvfdipp/mistaway/device_supervisor.cfg diff --git a/Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/advvfdipp_wo_downhole_tb_v1.cfg b/Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/advvfdipp_wo_downhole_tb_v1.cfg index 7a97280..ad085a2 100644 --- a/Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/advvfdipp_wo_downhole_tb_v1.cfg +++ b/Pub_Sub/advvfdipp_wo_downhole/thingsboard/v1/advvfdipp_wo_downhole_tb_v1.cfg @@ -19,7 +19,7 @@ "group": "default", "uploadType": "periodic", "dataType": "FLOAT", - "addr": "val_Flowmeter", + "addr": "val_Flowmeter_BarrelsPerDay", "decimal": 2, "readWrite": "ro", "unit": "", @@ -351,7 +351,7 @@ "ctrlName": "advvfdipp", "group": "default", "uploadType": "periodic", - "dataType": "INT", + "dataType": "DINT", "addr": "sts_PID_Control", "readWrite": "rw", "unit": "", @@ -489,7 +489,7 @@ "args": { "host": "hp.henrypump.cloud", "port": 1883, - "clientId": "faskens-ci-1301", + "clientId": "unknown", "auth": 1, "tls": 0, "cleanSession": 1, @@ -500,8 +500,8 @@ "rootCA": "", "verifyServer": 0, "verifyClient": 0, - "username": "faskensmqtt", - "passwd": "faskensmqtt@1903", + "username": "unknown", + "passwd": "unknown", "authType": 1, "willQos": 0, "willRetain": 0, diff --git a/Pub_Sub/dual_flowmeter/mistaway/v1/dual_flowmeter_ma_v1_2.6.1.cfg b/Pub_Sub/dual_flowmeter/mistaway/v1/dual_flowmeter_ma_v1_2.6.1.cfg new file mode 100644 index 0000000..99a8403 --- /dev/null +++ b/Pub_Sub/dual_flowmeter/mistaway/v1/dual_flowmeter_ma_v1_2.6.1.cfg @@ -0,0 +1,567 @@ +{ + "controllers": [ + { + "protocol": "AllenBradley MicroCip", + "name": "dual_flowmeter", + "samplePeriod": 10, + "expired": 10000, + "enablePerOnchange": 0, + "args": { + "slot": 0, + "connectTimeOut": 2000 + }, + "endpoint": "192.168.1.12:44818" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600 + } + ], + "measures": [ + { + "name": "pump_1_daily_total", + "ctrlName": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "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": "dual_flowmeter", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_level_TP1_Scaled", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "1.0", + "offset": "0.0" + }, + { + "name": "pond_1_volume", + "ctrlName": "dual_flowmeter", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "pond1Volume", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "1.0", + "offset": "0.0" + }, + { + "name": "charge_pump_run_status", + "ctrlName": "dual_flowmeter", + "group": "default", + "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": "" + } + ], + "alarms": [], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "INFO", + "coms": [ + { + "name": "rs232", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + }, + { + "name": "rs485", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + } + ] + }, + "clouds": [ + { + "cacheSize": 100, + "enable": 1, + "name": "default", + "type": "Standard MQTT", + "args": { + "host": "mq194.imistaway.net", + "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": "GF5022223016158" + }, + { + "key": "MAC", + "value": "00:18:05:21:b2:ea" + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "name": "Send Data", + "trigger": "measure_event", + "topic": "meshify/db/194/_/dual_flowmeter/${MAC_LOWER}", + "qos": 1, + "groups": [ + "default" + ], + "funcName": "sendData", + "script": "import json, uuid, os\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom paho.mqtt import client\nfrom quickfaas.global_dict import get as get_params\nfrom quickfaas.global_dict import _set_global_args\n\ndef reboot():\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\n r = os.popen(\"kill -s SIGHUP `cat /var/run/python/supervisord.pid`\").read()\n logger.info(f\"REBOOT : {r}\")\n\ndef checkFileExist(filename):\n path = \"/var/user/files\"\n if not os.path.exists(path):\n logger.info(\"no folder making files folder in var/user\")\n os.makedirs(path)\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n if not os.path.exists(path + \"/\" + filename):\n logger.info(\"no creds file making creds file\")\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\ndef convertJSONtoDS(j):\n d = []\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n return d\n\ndef checkCredentialConfig():\n logger.info(\"CHECKING CONFIG\")\n cfgpath = \"/var/user/cfg/device_supervisor/device_supervisor.cfg\"\n credspath = \"/var/user/files/creds.json\"\n cfg = dict()\n with open(cfgpath, \"r\") as f:\n cfg = json.load(f)\n clouds = cfg.get(\"clouds\")\n logger.info(clouds)\n #if not configured then try to configure from stored values\n if clouds[0][\"args\"][\"clientId\"] == \"unknown\" or clouds[0][\"args\"][\"username\"] == \"unknown\" or not clouds[0][\"args\"][\"passwd\"] or clouds[0][\"args\"][\"passwd\"] == \"unknown\":\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n creds = json.load(c)\n if creds:\n logger.info(\"updating config with stored data\")\n clouds[0][\"args\"][\"clientId\"] = creds[\"clientId\"]\n clouds[0][\"args\"][\"username\"] = creds[\"userName\"]\n clouds[0][\"args\"][\"passwd\"] = creds[\"password\"]\n cfg[\"clouds\"] = clouds\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n reboot()\n else:\n #assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n logger.info(\"updating stored file with new data\")\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n creds = json.load(c)\n if creds:\n if creds[\"clientId\"] != clouds[0][\"args\"][\"clientId\"]:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n if creds[\"userName\"] != clouds[0][\"args\"][\"username\"]:\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n if creds[\"password\"] != clouds[0][\"args\"][\"passwd\"]:\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n else:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n with open(credspath, \"w\") as cw:\n json.dump(creds,cw)\n\ndef checkParameterConfig(cfg):\n logger.info(\"Checking Parameters!!!!\")\n paramspath = \"/var/user/files/params.json\"\n cfgparams = convertDStoJSON(cfg.get(\"labels\"))\n #check stored values \n checkFileExist(\"params.json\")\n with open(paramspath, \"r\") as f:\n logger.info(\"Opened param storage file\")\n params = json.load(f)\n if params:\n if cfgparams != params:\n #go through each param\n #if not \"unknown\" and cfg and params aren't the same take from cfg likely updated manually\n #if key in cfg but not in params copy to params\n logger.info(\"equalizing params between cfg and stored\")\n for key in cfgparams.keys():\n try:\n if cfgparams[key] != params[key] and cfgparams[key] != \"unknown\":\n params[key] = cfgparams[key]\n except:\n params[key] = cfgparams[key]\n cfg[\"labels\"] = convertJSONtoDS(params)\n _set_global_args(convertJSONtoDS(params))\n with open(paramspath, \"w\") as p:\n json.dump(params, p)\n else:\n with open(paramspath, \"w\") as p:\n logger.info(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n \n return cfg\n\n\n\nlwtData = {\n \"init\":False,\n \"client\": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport=\"tcp\")\n}\ndef lwt(mac):\n try:\n #if not lwtData[\"connected\"]:\n if not lwtData[\"init\"]:\n print(\"INITIALIZING LWT CLIENT\")\n lwtData[\"client\"].username_pw_set(username=\"admin\", password=\"columbus\")\n lwtData[\"client\"].will_set(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\",json.dumps([{\"value\":False}]))\n lwtData[\"client\"].reconnect_delay_set(min_delay=10, max_delay=120)\n lwtData[\"init\"] = True\n print(\"Connecting to MQTT Broker for LWT purposes!!!!!!!\")\n lwtData[\"client\"].connect(\"mq194.imistaway.net\",1883, 600)\n lwtData[\"client\"].reconnect()\n lwtData[\"client\"].publish(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\", json.dumps([{\"value\":True}]))\n except Exception as e:\n print(\"LWT DID NOT DO THE THING\")\n print(e)\n\ndef sendData(message):\n #logger.debug(message)\n mac = __topic__.split(\"/\")[-1]\n lwt(mac)\n checkCredentialConfig()\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n if measure[\"name\"] in [\"pump_1_run_status\", \"pump_2_run_status\", \"charge_pump_run_status\"]:\n logger.debug(\"Converting DINT/BOOL to STRING\")\n value = convert_int(measure[\"name\"], measure[\"value\"])\n logger.debug(\"Converted {} to {}\".format(measure[\"value\"], value))\n publish(__topic__ + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": value}), __qos__)\n else:\n publish(__topic__ + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": measure[\"value\"]}), __qos__)\n except Exception as e:\n logger.error(e)\n \n\ndef convert_int(plc_tag, value):\n \n status_codes = {\n 0: \"Off\",\n 1: \"On\"\n }\n\n plc_tags = {\n \"pump_1_run_status\": status_codes.get(value, \"Invalid Code\"),\n \"pump_2_run_status\": status_codes.get(value, \"Invalid Code\"),\n \"charge_pump_run_status\": status_codes.get(value, \"Invalid Code\")\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")\n\n ", + "msgType": 0, + "cloudName": "default" + } + ], + "downloadFuncs": [ + { + "name": "Commands", + "topic": "meshify/sets/194/${MAC_UPPER}:01:99", + "qos": 1, + "funcName": "receiveCommand", + "payload_type": "Plaintext", + "script": "# Enter your python code.\nimport json\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(mac,value, wizard_api):\n #get new values and send\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.info(data)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n topic = \"meshify/db/194/_/dual_flowmeter/\" + mac + \"/\" + measure[\"name\"]\n if measure[\"name\"] in [\"pump_1_run_status\", \"pump_2_run_status\", \"charge_pump_run_status\"]:\n payload = [{\"value\": convert_int(measure[\"name\"], measure[\"value\"])}]\n else:\n payload = [{\"value\": measure[\"value\"]}]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n wizard_api.mqtt_publish(topic, json.dumps(payload))\ndef writeplctag(mac, value, wizard_api):\n try:\n value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"advvfdipp\":{value[\"tag\"]: value[\"val\"]}}\n wizard_api.write_plc_values(message)\n except Exception as e:\n logger.debug(e)\n \ndef receiveCommand(topic, payload, wizard_api):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)[0]\n command = p[\"payload\"][\"name\"].split(\".\")[1]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n }\n commands[command](p[\"mac\"].lower(),p[\"payload\"][\"value\"], wizard_api)\n #logger.debug(command)\n ack(p[\"msgId\"], p[\"mac\"], command, p[\"payload\"][\"name\"].split(\".\")[1], p[\"payload\"][\"value\"], wizard_api)\n\ndef ack(msgid, mac, name, command, value, wizard_api):\n #logger.debug(mac)\n macsquish = \"\".join(mac.split(\":\")[:-2])\n maclower = \":\".join(mac.split(\":\")[:-2])\n maclower = maclower.lower()\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"meshify/responses/\" + str(msgid), json.dumps([{\"value\": \"{} Success Setting: {} To: {}\".format(macsquish,name, value), \"msgid\": str(msgid)}]))\n wizard_api.mqtt_publish(\"meshify/db/194/_/mainMeshify/\" + maclower + \":00:00/commands\", json.dumps([{\"value\": {\"status\": \"success\", \"value\": str(value), \"channel\": command}, \"msgid\": str(msgid)}]))\n\ndef convert_int(plc_tag, value):\n \n status_codes = {\n 0: \"Off\",\n 1: \"On\"\n }\n\n plc_tags = {\n \"pump_1_run_status\": status_codes.get(value, \"Invalid Code\"),\n \"pump_2_run_status\": status_codes.get(value, \"Invalid Code\"),\n \"charge_pump_run_status\": status_codes.get(value, \"Invalid Code\")\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")\n\n ", + "msgType": 0, + "trigger": "command_event", + "cloudName": "default" + } + ] + }, + "modbusSlave": { + "enable": 0, + "protocol": "Modbus-TCP", + "port": 502, + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "maxConnection": 5, + "mapping_table": [] + }, + "iec104Server": { + "enable": 0, + "cotSize": 2, + "port": 2404, + "serverList": [ + { + "asduAddr": 1 + } + ], + "kValue": 12, + "wValue": 8, + "t0": 15, + "t1": 15, + "t2": 10, + "t3": 20, + "maximumLink": 5, + "timeSet": 1, + "byteOrder": "abcd", + "mapping_table": [] + }, + "opcuaServer": { + "enable": 0, + "port": 4840, + "maximumLink": 5, + "securityMode": 0, + "identifierType": "String", + "mapping_table": [] + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "southMetadata": {}, + "bindMetadata": {} +} \ No newline at end of file diff --git a/Pub_Sub/plcpond/thingsboard/v1/plcpond_tb_v1.cfg b/Pub_Sub/fkplcpond/thingsboard/v1/plcpond_tb_v1.cfg similarity index 100% rename from Pub_Sub/plcpond/thingsboard/v1/plcpond_tb_v1.cfg rename to Pub_Sub/fkplcpond/thingsboard/v1/plcpond_tb_v1.cfg diff --git a/Pub_Sub/plcpond/thingsboard/v1/pub/sendData.py b/Pub_Sub/fkplcpond/thingsboard/v1/pub/sendData.py similarity index 100% rename from Pub_Sub/plcpond/thingsboard/v1/pub/sendData.py rename to Pub_Sub/fkplcpond/thingsboard/v1/pub/sendData.py diff --git a/Pub_Sub/plcpond/thingsboard/v2/bn_pond.cfg b/Pub_Sub/fkplcpond/thingsboard/v2/bn_pond.cfg similarity index 100% rename from Pub_Sub/plcpond/thingsboard/v2/bn_pond.cfg rename to Pub_Sub/fkplcpond/thingsboard/v2/bn_pond.cfg diff --git a/Pub_Sub/fkplcpond/thingsboard/v2/fkplcpond_ec2_2_1.cfg b/Pub_Sub/fkplcpond/thingsboard/v2/fkplcpond_ec2_2_1.cfg new file mode 100644 index 0000000..2b2d63a --- /dev/null +++ b/Pub_Sub/fkplcpond/thingsboard/v2/fkplcpond_ec2_2_1.cfg @@ -0,0 +1,594 @@ +{ + "controllers": [ + { + "protocol": "EtherNet/IP", + "name": "plcpond", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.12:44818" + } + ], + "measures": [ + { + "name": "pond_1_level", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lev", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_1_total_bbls", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Total_Barrels", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_1_hi_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_1_Hi_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_1_hi_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Hi_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_1_hi_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Hi_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_1_lo_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_1_Lo_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_1_lo_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lo_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_1_lo_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lo_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_2_level", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lev", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_2_total_bbls", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Total_Barrels", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_2_hi_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_2_Hi_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_2_hi_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Hi_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_2_hi_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Hi_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_2_lo_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_2_Lo_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_2_lo_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lo_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "pond_2_lo_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lo_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "air_comp_low_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "AL0_Air_Comp_Low", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "air_comp_val", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Val_Air_Comp_Out", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "air_comp_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "SPT_Low_Air_PSI", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + } + ], + "alarmLables": [ + "default" + ], + "alarms": [ + { + "name": "air_comp_low_alm", + "ctrlName": "plcpond", + "measureName": "air_comp_low_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Alarm Triggered" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "reference": 16 + } + ], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "INFO", + "coms": [ + { + "name": "rs232", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + }, + { + "name": "rs485", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + } + ] + }, + "clouds": [ + { + "cacheSize": 100, + "enable": 1, + "name": "default", + "type": "Standard MQTT", + "args": { + "host": "hp.henrypump.cloud", + "port": 1883, + "clientId": "unknown", + "auth": 1, + "tls": 0, + "cleanSession": 0, + "mqttVersion": "v3.1.1", + "keepalive": 60, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "unknown", + "passwd": "unknown", + "authType": 1 + } + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "name": "sendData", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "qos": 1, + "groups": [ + "default" + ], + "funcName": "sendData", + "script": "# Enter your python code.\nimport json, os\nfrom datetime import datetime as dt\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom quickfaas.global_dict import get as get_params\nfrom quickfaas.global_dict import _set_global_args\n\ndef reboot():\n #basic = Basic()\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\n r = os.popen(\"kill -s SIGHUP `cat /var/run/python/supervisord.pid`\").read()\n logger.info(f\"REBOOT : {r}\")\n\ndef checkFileExist(filename):\n path = \"/var/user/files\"\n if not os.path.exists(path):\n logger.info(\"no folder making files folder in var/user\")\n os.makedirs(path)\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n if not os.path.exists(path + \"/\" + filename):\n logger.info(\"no creds file making creds file\")\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\ndef convertJSONtoDS(j):\n d = []\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n return d\n\ndef checkCredentialConfig():\n logger.info(\"CHECKING CONFIG\")\n cfgpath = \"/var/user/cfg/device_supervisor/device_supervisor.cfg\"\n credspath = \"/var/user/files/creds.json\"\n cfg = dict()\n with open(cfgpath, \"r\") as f:\n cfg = json.load(f)\n clouds = cfg.get(\"clouds\")\n logger.info(clouds)\n #if not configured then try to configure from stored values\n if clouds[0][\"args\"][\"clientId\"] == \"unknown\" or clouds[0][\"args\"][\"username\"] == \"unknown\" or not clouds[0][\"args\"][\"passwd\"] or clouds[0][\"args\"][\"passwd\"] == \"unknown\":\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n creds = json.load(c)\n if creds:\n logger.info(\"updating config with stored data\")\n clouds[0][\"args\"][\"clientId\"] = creds[\"clientId\"]\n clouds[0][\"args\"][\"username\"] = creds[\"userName\"]\n clouds[0][\"args\"][\"passwd\"] = creds[\"password\"]\n cfg[\"clouds\"] = clouds\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n reboot()\n else:\n #assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n logger.info(\"updating stored file with new data\")\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n creds = json.load(c)\n if creds:\n if creds[\"clientId\"] != clouds[0][\"args\"][\"clientId\"]:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n if creds[\"userName\"] != clouds[0][\"args\"][\"username\"]:\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n if creds[\"password\"] != clouds[0][\"args\"][\"passwd\"]:\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n else:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n with open(credspath, \"w\") as cw:\n json.dump(creds,cw)\n\ndef checkParameterConfig(cfg):\n logger.info(\"Checking Parameters!!!!\")\n paramspath = \"/var/user/files/params.json\"\n cfgparams = convertDStoJSON(cfg.get(\"labels\"))\n #check stored values \n checkFileExist(\"params.json\")\n with open(paramspath, \"r\") as f:\n logger.info(\"Opened param storage file\")\n params = json.load(f)\n if params:\n if cfgparams != params:\n #go through each param\n #if not \"unknown\" and cfg and params aren't the same take from cfg likely updated manually\n #if key in cfg but not in params copy to params\n logger.info(\"equalizing params between cfg and stored\")\n for key in cfgparams.keys():\n try:\n if cfgparams[key] != params[key] and cfgparams[key] != \"unknown\":\n params[key] = cfgparams[key]\n except:\n params[key] = cfgparams[key]\n cfg[\"labels\"] = convertJSONtoDS(params)\n _set_global_args(convertJSONtoDS(params))\n with open(paramspath, \"w\") as p:\n json.dump(params, p)\n else:\n with open(paramspath, \"w\") as p:\n logger.info(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n \n return cfg\n\n\n\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" + }, + { + "name": "sendAlarm", + "trigger": "warning_event", + "topic": "v1/devices/me/telemetry", + "qos": 2, + "funcName": "sendAlarm", + "script": "import json, time\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\n\n\ndef sendAlarm(message):\n logger.info(message)\n payload = {}\n payload[\"ts\"] = time.time()*1000\n payload[\"values\"] = {message[\"measureName\"]: message[\"value\"]}\n publish(__topic__, json.dumps(payload), __qos__)", + "alarms": [ + "air_comp_low_alm" + ], + "msgType": 0, + "cloudName": "default" + } + ], + "downloadFuncs": [] + }, + "labels": [ + { + "key": "SN", + "value": "GF5022223016182" + }, + { + "key": "MAC", + "value": "00:18:05:21:b3:11" + } + ], + "modbusSlave": { + "enable": 0, + "protocol": "Modbus-TCP", + "port": 502, + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "maxConnection": 5, + "mapping_table": [] + }, + "modbusRTUSlave": { + "enable": 0, + "protocol": "Modbus-RTU", + "coms": "rs485", + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "mapping_table": [] + }, + "iec104Server": { + "enable": 0, + "cotSize": 2, + "port": 2404, + "serverList": [ + { + "asduAddr": 1 + } + ], + "kValue": 12, + "wValue": 8, + "t0": 30, + "t1": 15, + "t2": 10, + "t3": 20, + "maximumLink": 5, + "timeSet": 1, + "byteOrder": "abcd", + "mapping_table": [] + }, + "iec104Client": { + "enable": 0, + "connectType": 2, + "serverAddr": "ipower.inhandcloud.cn", + "serverPort": 2404, + "communicationCode": "", + "protocol": 1, + "asduAddr": 1, + "tls": 0, + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "opcuaServer": { + "enable": 0, + "port": 4840, + "maximumLink": 5, + "securityMode": 0, + "identifierType": "String", + "mapping_table": [] + }, + "southMetadata": {}, + "bindMetadata": { + "version": "", + "timestamp": "" + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "version": "2.3.1" +} \ No newline at end of file diff --git a/Pub_Sub/plcpond/thingsboard/v2/plcpond_tb_v2.cfg b/Pub_Sub/fkplcpond/thingsboard/v2/plcpond_tb_v2.cfg similarity index 100% rename from Pub_Sub/plcpond/thingsboard/v2/plcpond_tb_v2.cfg rename to Pub_Sub/fkplcpond/thingsboard/v2/plcpond_tb_v2.cfg diff --git a/Pub_Sub/plcpond/thingsboard/v2/pub/sendData.py b/Pub_Sub/fkplcpond/thingsboard/v2/pub/sendData.py similarity index 100% rename from Pub_Sub/plcpond/thingsboard/v2/pub/sendData.py rename to Pub_Sub/fkplcpond/thingsboard/v2/pub/sendData.py diff --git a/Pub_Sub/fkplcpond/thingsboard/v3/fkplcpond_tb_v3.cfg b/Pub_Sub/fkplcpond/thingsboard/v3/fkplcpond_tb_v3.cfg new file mode 100644 index 0000000..34baa55 --- /dev/null +++ b/Pub_Sub/fkplcpond/thingsboard/v3/fkplcpond_tb_v3.cfg @@ -0,0 +1,666 @@ +{ + "controllers": [ + { + "enable": 1, + "protocol": "AllenBradley MicroCip", + "name": "plcpond", + "samplePeriod": 10, + "desc": "", + "expired": 1000, + "args": { + "slot": 0, + "connectTimeOut": 10000 + }, + "enableDebug": 0, + "enablePerOnchange": 0, + "endpoint": "192.168.1.12:44818" + } + ], + "measures": [ + { + "name": "pond_1_level", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lev", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_total_bbls", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Total_Barrels", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_hi_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_1_Hi_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_1_hi_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Hi_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_hi_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Hi_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_lo_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_1_Lo_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_1_lo_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lo_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_lo_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lo_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_level", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lev", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_total_bbls", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Total_Barrels", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_hi_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_2_Hi_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_2_hi_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Hi_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_hi_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Hi_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "1.0", + "offset": "0.0", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_lo_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_2_Lo_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_2_lo_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lo_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_lo_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lo_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "air_comp_low_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "AL0_Air_Comp_Low", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "reverseBit": 0, + "bitMap": 0 + }, + { + "name": "air_comp_val", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Val_Air_Comp_Out", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "decimal": 2 + }, + { + "name": "air_comp_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "SPT_Low_Air_PSI", + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "decimal": 2 + } + ], + "alarmLables": [ + "default" + ], + "alarms": [ + { + "name": "air_comp_low_alm", + "ctrlName": "plcpond", + "alarmLevel": 5, + "content": "Alarm Triggered", + "alarmLable": "default", + "measureName": "air_comp_low_alm", + "cond1": { + "op": "eq", + "value": "1" + }, + "cond2": { + "op": "eq", + "value": "" + }, + "condOp": "none" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "reference": 16, + "LwTSDBSize": 1000, + "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": "unknown", + "authType": 1, + "willQos": 0, + "willRetain": 0, + "willTopic": "", + "willPayload": "", + "tlsAuth": "caSelfSigned" + }, + "uploadRules": [] + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "name": "sendData", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "qos": 1, + "groups": [ + "default" + ], + "funcName": "sendData", + "script": "# Enter your python code.\nimport json, os\nfrom datetime import datetime as dt\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom quickfaas.global_dict import get as get_params\nfrom quickfaas.global_dict import _set_global_args\n\ndef reboot():\n #basic = Basic()\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\n r = os.popen(\"kill -s SIGHUP `cat /var/run/python/supervisord.pid`\").read()\n logger.info(f\"REBOOT : {r}\")\n\ndef checkFileExist(filename):\n path = \"/var/user/files\"\n if not os.path.exists(path):\n logger.info(\"no folder making files folder in var/user\")\n os.makedirs(path)\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n if not os.path.exists(path + \"/\" + filename):\n logger.info(\"no creds file making creds file\")\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\ndef convertJSONtoDS(j):\n d = []\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n return d\n\ndef checkCredentialConfig():\n logger.info(\"CHECKING CONFIG\")\n cfgpath = \"/var/user/cfg/device_supervisor/device_supervisor.cfg\"\n credspath = \"/var/user/files/creds.json\"\n cfg = dict()\n with open(cfgpath, \"r\") as f:\n cfg = json.load(f)\n clouds = cfg.get(\"clouds\")\n logger.info(clouds)\n #if not configured then try to configure from stored values\n if clouds[0][\"args\"][\"clientId\"] == \"unknown\" or clouds[0][\"args\"][\"username\"] == \"unknown\" or not clouds[0][\"args\"][\"passwd\"] or clouds[0][\"args\"][\"passwd\"] == \"unknown\":\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n creds = json.load(c)\n if creds:\n logger.info(\"updating config with stored data\")\n clouds[0][\"args\"][\"clientId\"] = creds[\"clientId\"]\n clouds[0][\"args\"][\"username\"] = creds[\"userName\"]\n clouds[0][\"args\"][\"passwd\"] = creds[\"password\"]\n cfg[\"clouds\"] = clouds\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n reboot()\n else:\n #assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n logger.info(\"updating stored file with new data\")\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n creds = json.load(c)\n if creds:\n if creds[\"clientId\"] != clouds[0][\"args\"][\"clientId\"]:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n if creds[\"userName\"] != clouds[0][\"args\"][\"username\"]:\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n if creds[\"password\"] != clouds[0][\"args\"][\"passwd\"]:\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n else:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n with open(credspath, \"w\") as cw:\n json.dump(creds,cw)\n\ndef checkParameterConfig(cfg):\n logger.info(\"Checking Parameters!!!!\")\n paramspath = \"/var/user/files/params.json\"\n cfgparams = convertDStoJSON(cfg.get(\"labels\"))\n #check stored values \n checkFileExist(\"params.json\")\n with open(paramspath, \"r\") as f:\n logger.info(\"Opened param storage file\")\n params = json.load(f)\n if params:\n if cfgparams != params:\n #go through each param\n #if not \"unknown\" and cfg and params aren't the same take from cfg likely updated manually\n #if key in cfg but not in params copy to params\n logger.info(\"equalizing params between cfg and stored\")\n for key in cfgparams.keys():\n try:\n if cfgparams[key] != params[key] and cfgparams[key] != \"unknown\":\n params[key] = cfgparams[key]\n except:\n params[key] = cfgparams[key]\n cfg[\"labels\"] = convertJSONtoDS(params)\n _set_global_args(convertJSONtoDS(params))\n with open(paramspath, \"w\") as p:\n json.dump(params, p)\n else:\n with open(paramspath, \"w\") as p:\n logger.info(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n \n return cfg\n\n\n\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__, cloud_name=\"default\")", + "cloudName": "default", + "msgType": 0 + }, + { + "qos": 2, + "funcName": "sendAlarm", + "script": "import json, time\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\n\n\ndef sendAlarm(message):\n logger.info(message)\n payload = {}\n payload[\"ts\"] = time.time()*1000\n payload[\"values\"] = {message[\"measureName\"]: message[\"value\"]}\n publish(__topic__, json.dumps(payload), __qos__,cloud_name=\"default\")", + "name": "sendAlarm", + "trigger": "warning_event", + "topic": "v1/devices/me/telemetry", + "cloudName": "default", + "alarms": [ + "default" + ], + "msgType": 0 + } + ], + "downloadFuncs": [] + }, + "labels": [ + { + "key": "SN", + "value": "GF5022311031664" + }, + { + "key": "MAC", + "value": "00:18:05:28:4a:40" + } + ], + "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": 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", + "pubsub": 0, + "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": { + "version": "", + "timestamp": "" + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "templates": {}, + "version": "2.7.1" +} \ No newline at end of file diff --git a/Pub_Sub/gateway/1701.cfg b/Pub_Sub/gateway/1701.cfg new file mode 100644 index 0000000..984c7f6 --- /dev/null +++ b/Pub_Sub/gateway/1701.cfg @@ -0,0 +1,2841 @@ +{ + "controllers": [ + { + "enable": 1, + "protocol": "AllenBradley MicroCip", + "name": "1701_1", + "samplePeriod": 30, + "desc": "", + "expired": 30000, + "args": { + "slot": 0, + "connectTimeOut": 30000 + }, + "enableDebug": 0, + "enablePerOnchange": 0, + "endpoint": "192.168.1.19:44818" + }, + { + "enable": 1, + "name": "1701_2", + "samplePeriod": 30, + "desc": "", + "expired": 30000, + "args": { + "connectTimeOut": 30000, + "slot": 0 + }, + "enableDebug": 0, + "protocol": "AllenBradley MicroCip", + "enablePerOnchange": 0, + "endpoint": "192.168.1.20:44818" + }, + { + "enable": 1, + "name": "1701_3", + "samplePeriod": 30, + "desc": "", + "expired": 30000, + "args": { + "connectTimeOut": 30000, + "slot": 0 + }, + "enableDebug": 0, + "protocol": "AllenBradley MicroCip", + "enablePerOnchange": 0, + "endpoint": "192.168.1.21:44818" + }, + { + "enable": 1, + "name": "1701_7", + "samplePeriod": 30, + "desc": "", + "expired": 30000, + "args": { + "connectTimeOut": 30000, + "slot": 0 + }, + "enableDebug": 0, + "protocol": "AllenBradley MicroCip", + "enablePerOnchange": 0, + "endpoint": "192.168.1.25:44818" + }, + { + "enable": 1, + "name": "1701_8", + "samplePeriod": 30, + "desc": "", + "expired": 30000, + "args": { + "connectTimeOut": 30000, + "slot": 0 + }, + "enableDebug": 0, + "protocol": "AllenBradley MicroCip", + "enablePerOnchange": 0, + "endpoint": "192.168.1.26:44818" + }, + { + "enable": 1, + "name": "1701_9", + "samplePeriod": 30, + "desc": "", + "expired": 30000, + "args": { + "connectTimeOut": 30000, + "slot": 0 + }, + "enableDebug": 0, + "protocol": "AllenBradley MicroCip", + "enablePerOnchange": 0, + "endpoint": "192.168.1.27:44818" + }, + { + "enable": 1, + "name": "1701_10", + "samplePeriod": 30, + "desc": "", + "expired": 30000, + "args": { + "connectTimeOut": 30000, + "slot": 0 + }, + "enableDebug": 0, + "protocol": "AllenBradley MicroCip", + "enablePerOnchange": 0, + "endpoint": "192.168.1.28:44818" + }, + { + "enable": 1, + "name": "1701_11", + "samplePeriod": 30, + "desc": "", + "expired": 30000, + "args": { + "connectTimeOut": 30000, + "slot": 0 + }, + "enableDebug": 0, + "protocol": "AllenBradley MicroCip", + "enablePerOnchange": 0, + "endpoint": "192.168.1.29:44818" + }, + { + "enable": 1, + "name": "1701_12", + "samplePeriod": 30, + "desc": "", + "expired": 30000, + "args": { + "connectTimeOut": 30000, + "slot": 0 + }, + "enableDebug": 0, + "protocol": "AllenBradley MicroCip", + "enablePerOnchange": 0, + "endpoint": "192.168.1.30:44818" + }, + { + "enable": 1, + "protocol": "AllenBradley MicroCip", + "name": "1701_Pond", + "samplePeriod": 30, + "desc": "", + "expired": 30000, + "args": { + "slot": 0, + "connectTimeOut": 30000 + }, + "enableDebug": 0, + "enablePerOnchange": 0, + "endpoint": "192.168.1.12:44818" + } + ], + "measures": [ + { + "name": "scaled_flow_meter", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_hand_input", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_auto_input", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_run_status", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_local_start", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_overload_status", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_bbl", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_BBLS_RD", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_flow_meter", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_hand_input", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_auto_input", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_run_status", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_local_start", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_overload_status", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_bbl", + "ctrlName": "1701_2", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_BBLS_RD", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_flow_meter", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_hand_input", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_auto_input", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_run_status", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_local_start", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_overload_status", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_bbl", + "ctrlName": "1701_3", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_BBLS_RD", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_flow_meter", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_hand_input", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_auto_input", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_run_status", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_local_start", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_overload_status", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_bbl", + "ctrlName": "1701_7", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_BBLS_RD", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_flow_meter", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_hand_input", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_auto_input", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_run_status", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_local_start", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_overload_status", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_bbl", + "ctrlName": "1701_8", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_BBLS_RD", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_flow_meter", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_hand_input", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_auto_input", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_run_status", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_local_start", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_overload_status", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_bbl", + "ctrlName": "1701_9", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_BBLS_RD", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_flow_meter", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_hand_input", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_auto_input", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_run_status", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_local_start", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_overload_status", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_bbl", + "ctrlName": "1701_10", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_BBLS_RD", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_flow_meter", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_hand_input", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_auto_input", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_run_status", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_local_start", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_overload_status", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_bbl", + "ctrlName": "1701_11", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_BBLS_RD", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_flow_meter", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_hand_input", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_auto_input", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_run_status", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_local_start", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_overload_status", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_bbl", + "ctrlName": "1701_12", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_BBLS_RD", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_1_daily_total", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_1_Daily_Flow_Rate_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_1_run_status", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pump_1_Run_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_1_flowrate", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_1_SCL_Flow_Meter", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_1_yesterdays_total", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_1_Yesterdays_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_1_prevmonth_total", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_1_PrevMonth_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_1_month_total", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_1_Current_Month_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_1_lifetime_total", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_1_Lifetime_Flow", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_1_suction", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Suction_PSI_TP1_Scaled", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_2_daily_total", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_2_Daily_Flow_Rate_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_2_run_status", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pump_2_Run_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_2_flowrate", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_2_SCL_Flow_Meter", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_2_yesterdays_total", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_2_Yesterdays_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_2_prevmonth_total", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_2_PrevMonth_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_2_month_total", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_2_Current_Month_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_2_lifetime_total", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pump_2_Lifetime_Flow", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_2_suction", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Suction_PSI_TP2_Scaled", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_charge_psi_tp1", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Charge_PSI_TP1_Scaled", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pond_1_height", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_level_TP1_Scaled", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "pump_1_low_flow_spt", + "ctrlName": "1701_Pond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "SPT_TP1_Low_Flow_Rate", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + } + ], + "alarmLables": [ + "default" + ], + "alarms": [], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "LwTSDBSize": 1000, + "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": "1701-gateway", + "auth": 1, + "tls": 0, + "cleanSession": 0, + "mqttVersion": "v3.1.1", + "keepalive": 60, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "xhwuu890sesg7xstcikv", + "passwd": "", + "willQos": 0, + "willRetain": 0, + "willTopic": "", + "willPayload": "", + "tlsAuth": "caSelfSigned" + }, + "uploadRules": [] + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "qos": 2, + "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.info(message)\n # Extract measures and group by ctrlName\n grouped_data = {}\n grouped_attributes = {}\n now = (round(dt.timestamp(dt.now())/600)*600)*1000\n for measure in message['measures']:\n ctrlName = \" \".join(measure['ctrlName'].split(\"_\"))\n name = measure['name']\n value = measure['value']\n health = measure['health']\n\n if ctrlName not in grouped_data:\n grouped_data[ctrlName] = {}\n\n if ctrlName not in grouped_attributes:\n grouped_attributes[ctrlName] = {}\n if health:\n grouped_data[ctrlName][name] = value\n grouped_attributes[ctrlName][\"latestReportTime\"] = now\n #print(grouped_data)\n # Transform the grouped data to desired structure\n payload = {}\n\n for key, value in grouped_data.items():\n if value:\n payload[key] = [{\"ts\": now ,\"values\": value}]\n attributes_payload = {}\n for key, value in grouped_attributes.items():\n if value:\n attributes_payload[key] = value\n\n\n\n logger.info(payload)\n logger.info(attributes_payload)\n publish(__topic__, json.dumps(payload), __qos__,cloud_name=\"default\")\n publish(\"v1/gateway/attributes\", json.dumps(attributes_payload), __qos__,cloud_name=\"default\")\n publish(\"v1/devices/me/telemetry\", json.dumps({\"connected\": True}), __qos__, cloud_name=\"default\")", + "name": "sendData", + "trigger": "measure_event", + "topic": "v1/gateway/telemetry", + "msgType": 0, + "cloudName": "default", + "groups": [ + "default" + ] + } + ], + "downloadFuncs": [] + }, + "labels": [ + { + "key": "SN", + "value": "GF5022242024406" + }, + { + "key": "MAC", + "value": "00:18:05:24:cc:66" + } + ], + "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": 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", + "pubsub": 0, + "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": { + "version": "", + "timestamp": "" + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "templates": { + "plcfreshwater": { + "controller": { + "conTempName": "plcfreshwater", + "enable": 1, + "protocol": "AllenBradley MicroCip", + "samplePeriod": 30, + "desc": "", + "expired": 30000, + "args": { + "slot": 0, + "connectTimeOut": 30000 + }, + "enableDebug": 0, + "enablePerOnchange": 0, + "endpoint": "192.168.1.19:44818", + "status": 1 + }, + "measures": [ + { + "name": "scaled_flow_meter", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Flow_Meter", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "scaled_pressure_transducer", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Scaled_Pressure_Transducer", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_hand_input", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Hand_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_auto_input", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Auto_Input", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_run_status", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Run_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_local_start", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Local_Start", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_gal", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "yesterday_flow_meter_gal", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Yesterday_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "today_flow_meter_gal", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Day_Total_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "last_month_flow_meter_gal", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Last_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "month_flow_meter_gal", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Totalizer_FM_Current_Month_Gal", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "spt_flow_meter_unit", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "SPT_Flow_Meter_Unit", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "raw_overload_status", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Raw_Overload_Status", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "CMD_Cloud_Control", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "CMD_Cloud_Control", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + }, + { + "name": "lifetime_flow_meter_bbl", + "ctrlName": "1701_1", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Lifetime_Flow_Meter_BBLS_RD", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 0, + "transformType": 0 + } + ], + "desc": "" + } + }, + "version": "2.7.1" +} \ No newline at end of file diff --git a/Pub_Sub/hrtankbattery/thingsboard/v3/pub/sendDataNoel.py b/Pub_Sub/hrtankbattery/thingsboard/v3/pub/sendDataNoel.py new file mode 100644 index 0000000..275cfa2 --- /dev/null +++ b/Pub_Sub/hrtankbattery/thingsboard/v3/pub/sendDataNoel.py @@ -0,0 +1,155 @@ +# Enter your python code. +import json, os, time +from datetime import datetime as dt +from common.Logger import logger +from quickfaas.remotebus import publish +from quickfaas.global_dict import get as get_params +from quickfaas.global_dict import _set_global_args + +def reboot(reason="Rebooting for config file update"): + #basic = Basic() + logger.info("!" * 10 + "REBOOTING DEVICE" + "!"*10) + logger.info(reason) + r = os.popen("kill -s SIGHUP `cat /var/run/python/supervisord.pid`").read() + logger.info(f"REBOOT : {r}") + +def checkFileExist(filename): + path = "/var/user/files" + if not os.path.exists(path): + logger.info("no folder making files folder in var/user") + os.makedirs(path) + with open(path + "/" + filename, "a") as f: + json.dump({}, f) + if not os.path.exists(path + "/" + filename): + logger.info("no creds file making creds file") + with open(path + "/" + filename, "a") as f: + json.dump({}, f) + +def convertDStoJSON(ds): + j = dict() + for x in ds: + j[x["key"]] = x["value"] + return j + +def convertJSONtoDS(j): + d = [] + for key in j.keys(): + d.append({"key": key, "value": j[key]}) + return d + +def checkCredentialConfig(): + logger.debug("CHECKING CONFIG") + cfgpath = "/var/user/cfg/device_supervisor/device_supervisor.cfg" + credspath = "/var/user/files/creds.json" + cfg = dict() + with open(cfgpath, "r") as f: + cfg = json.load(f) + clouds = cfg.get("clouds") + logger.debug(clouds) + #if not configured then try to configure from stored values + if clouds[0]["args"]["clientId"] == "unknown" or clouds[0]["args"]["username"] == "unknown" or not clouds[0]["args"]["passwd"] or clouds[0]["args"]["passwd"] == "unknown": + checkFileExist("creds.json") + with open(credspath, "r") as c: + creds = json.load(c) + if creds: + logger.debug("updating config with stored data") + clouds[0]["args"]["clientId"] = creds["clientId"] + clouds[0]["args"]["username"] = creds["userName"] + clouds[0]["args"]["passwd"] = creds["password"] + cfg["clouds"] = clouds + cfg = checkParameterConfig(cfg) + with open(cfgpath, "w", encoding='utf-8') as n: + json.dump(cfg, n, indent=1, ensure_ascii=False) + reboot() + else: + #assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data + checkFileExist("creds.json") + with open(credspath, "r") as c: + logger.debug("updating stored file with new data") + cfg = checkParameterConfig(cfg) + with open(cfgpath, "w", encoding='utf-8') as n: + json.dump(cfg, n, indent=1, ensure_ascii=False) + creds = json.load(c) + if creds: + if creds["clientId"] != clouds[0]["args"]["clientId"]: + creds["clientId"] = clouds[0]["args"]["clientId"] + if creds["userName"] != clouds[0]["args"]["username"]: + creds["userName"] = clouds[0]["args"]["username"] + if creds["password"] != clouds[0]["args"]["passwd"]: + creds["password"] = clouds[0]["args"]["passwd"] + else: + creds["clientId"] = clouds[0]["args"]["clientId"] + creds["userName"] = clouds[0]["args"]["username"] + creds["password"] = clouds[0]["args"]["passwd"] + with open(credspath, "w") as cw: + json.dump(creds,cw) + +def checkParameterConfig(cfg): + logger.debug("Checking Parameters!!!!") + paramspath = "/var/user/files/params.json" + cfgparams = convertDStoJSON(cfg.get("labels")) + #check stored values + checkFileExist("params.json") + with open(paramspath, "r") as f: + logger.debug("Opened param storage file") + params = json.load(f) + if params: + if cfgparams != params: + #go through each param + #if not "unknown" and cfg and params aren't the same take from cfg likely updated manually + #if key in cfg but not in params copy to params + logger.debug("equalizing params between cfg and stored") + for key in cfgparams.keys(): + try: + if cfgparams[key] != params[key] and cfgparams[key] != "unknown": + params[key] = cfgparams[key] + except: + params[key] = cfgparams[key] + cfg["labels"] = convertJSONtoDS(params) + _set_global_args(convertJSONtoDS(params)) + with open(paramspath, "w") as p: + json.dump(params, p) + else: + with open(paramspath, "w") as p: + logger.debug("initializing param file with params in memory") + json.dump(convertDStoJSON(get_params()), p) + cfg["labels"] = get_params() + + return cfg + +def sendData(message): + #logger.debug(message) + try: + checkCredentialConfig() + except Exception as e: + logger.error(e) + payload = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}} + run_tanks = {} + + for measure in message["measures"]: + try: + logger.debug(measure) + if abs(payload["ts"]/1000 - measure["timestamp"]) > 3600: + reboot(reason="Poll timestamp and actual timestamp out of sync. Actual: {} Poll: {}".format(payload["ts"]/1000,measure["timestamp"])) + if measure["name"] in ["oil_run_tank","water_run_tank"]: + run_tanks[measure["name"]] = measure["value"] + if "_level" in measure["name"]: + run_tanks[measure["name"]] = measure["value"] + payload["values"][measure["name"]] = measure["value"] + except Exception as e: + logger.error(e) + payload["values"]["oil_run_tank_level"] = run_tanks["oil_0" + str(run_tanks["oil_run_tank"]) + "_level"] + payload["values"]["water_run_tank_level"] = run_tanks["water_0" + str(run_tanks["water_run_tank"]) + "_level"] + + values_1 = dict(list(payload["values"].items())[len(payload["values"])//2:]) + payload_1 = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}} + payload_1["values"] = values_1 + publish(__topic__, json.dumps(payload_1), __qos__) + time.sleep(2) + values_2 = dict(list(payload["values"].items())[:len(payload["values"])//2]) + payload_2 = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}} + payload_2["values"] = values_2 + publish(__topic__, json.dumps(payload_2), __qos__) + #publish(__topic__, json.dumps(payload), __qos__) + publish("v1/devices/me/attributes", json.dumps({"latestReportTime": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__) + diff --git a/Pub_Sub/plcfreshwater/mistaway/v1/pub/sendDatav2.py b/Pub_Sub/plcfreshwater/mistaway/v1/pub/sendDatav2.py new file mode 100644 index 0000000..44c2917 --- /dev/null +++ b/Pub_Sub/plcfreshwater/mistaway/v1/pub/sendDatav2.py @@ -0,0 +1,343 @@ +import json, os, uuid +from datetime import datetime as dt +from common.Logger import logger +from paho.mqtt import client +from quickfaas.remotebus import publish +from quickfaas.global_dict import get as get_params +from quickfaas.global_dict import _set_global_args + +def reboot(reason="Rebooting for config file update"): + #basic = Basic() + logger.info("!" * 10 + "REBOOTING DEVICE" + "!"*10) + logger.info(reason) + r = os.popen("kill -s SIGHUP `cat /var/run/python/supervisord.pid`").read() + logger.info(f"REBOOT : {r}") + +def checkFileExist(filename): + path = "/var/user/files" + try: + if not os.path.exists(path): + logger.debug("no folder making files folder in var/user") + os.makedirs(path) + with open(path + "/" + filename, "a") as f: + json.dump({}, f) + except Exception as e: + logger.error(f"Something went wrong in checkFileExist while making folder: {e}") + + try: + if not os.path.exists(path + "/" + filename): + logger.debug("no creds file making creds file") + with open(path + "/" + filename, "a") as f: + json.dump({}, f) + except Exception as e: + logger.error(f"Something went wrong in checkFileExist wihle making file: {e}") + +def convertDStoJSON(ds): + j = dict() + try: + for x in ds: + j[x["key"]] = x["value"] + except Exception as e: + logger.error(f"Something went wrong in convertDStoJSON: {e}") + return j + +def convertJSONtoDS(j): + d = [] + try: + for key in j.keys(): + d.append({"key": key, "value": j[key]}) + except Exception as e: + logger.error(f"Something went wrong in convertJSONtoDS: {e}") + return d + +def checkCredentialConfig(): + logger.debug("CHECKING CONFIG") + cfgpath = "/var/user/cfg/device_supervisor/device_supervisor.cfg" + credspath = "/var/user/files/creds.json" + cfg = dict() + with open(cfgpath, "r") as f: + try: + cfg = json.load(f) + clouds = cfg.get("clouds") + logger.debug(clouds) + #if not configured then try to configure from stored values + if clouds[0]["args"]["clientId"] == "unknown" or clouds[0]["args"]["username"] == "unknown" or not clouds[0]["args"]["passwd"] or clouds[0]["args"]["passwd"] == "unknown": + try: + checkFileExist("creds.json") + except Exception as e: + logger.error(f"Error in checkFileExist: {e}") + with open(credspath, "r") as c: + try: + creds = json.load(c) + if creds: + logger.debug("updating config with stored data") + clouds[0]["args"]["clientId"] = creds["clientId"] + clouds[0]["args"]["username"] = creds["userName"] + clouds[0]["args"]["passwd"] = creds["password"] + cfg["clouds"] = clouds + cfg = checkParameterConfig(cfg) + with open(cfgpath, "w", encoding='utf-8') as n: + json.dump(cfg, n, indent=1, ensure_ascii=False) + reboot() + except Exception as e: + logger.error(f"Error trying to load credentials from file: {e}") + else: + #assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data + checkFileExist("creds.json") + with open(credspath, "r") as c: + logger.debug("updating stored file with new data") + cfg = checkParameterConfig(cfg) + with open(cfgpath, "w", encoding='utf-8') as n: + json.dump(cfg, n, indent=1, ensure_ascii=False) + creds = json.load(c) + if creds: + if creds["clientId"] != clouds[0]["args"]["clientId"]: + creds["clientId"] = clouds[0]["args"]["clientId"] + if creds["userName"] != clouds[0]["args"]["username"]: + creds["userName"] = clouds[0]["args"]["username"] + if creds["password"] != clouds[0]["args"]["passwd"]: + creds["password"] = clouds[0]["args"]["passwd"] + else: + creds["clientId"] = clouds[0]["args"]["clientId"] + creds["userName"] = clouds[0]["args"]["username"] + creds["password"] = clouds[0]["args"]["passwd"] + with open(credspath, "w") as cw: + json.dump(creds,cw) + except Exception as e: + logger.error(f"Somethign went wrong in checkCredentialConfig: {e}") + +def checkParameterConfig(cfg): + try: + logger.debug("Checking Parameters!!!!") + paramspath = "/var/user/files/params.json" + cfgparams = convertDStoJSON(cfg.get("labels")) + #check stored values + checkFileExist("params.json") + with open(paramspath, "r") as f: + logger.debug("Opened param storage file") + params = json.load(f) + if params: + if cfgparams != params: + #go through each param + #if not "unknown" and cfg and params aren't the same take from cfg likely updated manually + #if key in cfg but not in params copy to params + logger.debug("equalizing params between cfg and stored") + for key in cfgparams.keys(): + try: + if cfgparams[key] != params[key] and cfgparams[key] != "unknown": + params[key] = cfgparams[key] + except: + params[key] = cfgparams[key] + cfg["labels"] = convertJSONtoDS(params) + _set_global_args(convertJSONtoDS(params)) + with open(paramspath, "w") as p: + json.dump(params, p) + else: + with open(paramspath, "w") as p: + logger.debug("initializing param file with params in memory") + json.dump(convertDStoJSON(get_params()), p) + cfg["labels"] = get_params() + + return cfg + except Exception as e: + logger.error(f"Something went wrong in checkParameterConfig: {e}") + os.system(f'rm {paramspath}') + return cfg + +payload = {} + +def get_totalizers(mac): + try: + mac = "".join(mac.split(":")) + with open(f"/var/user/files/totalizers_{mac}.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 lwt(mac, lwtData): + try: + #if not lwtData["connected"]: + if not lwtData["init"]: + print("INITIALIZING LWT CLIENT") + lwtData["client"].username_pw_set(username="admin", password="columbus") + lwtData["client"].will_set("meshify/db/194/_/mainHP/" + mac + ":00:00/connected",json.dumps([{"value":False}])) + lwtData["client"].reconnect_delay_set(min_delay=10, max_delay=120) + lwtData["init"] = True + print("Connecting to MQTT Broker for LWT purposes!!!!!!!") + lwtData["client"].connect("mq194.imistaway.net",1883, 600) + lwtData["client"].reconnect() + lwtData["client"].publish("meshify/db/194/_/mainHP/" + mac + ":00:00/connected", json.dumps([{"value":True}])) + except Exception as e: + print("LWT DID NOT DO THE THING") + print(e) + +lwtData = {} + +def sendData(message,wizard_api): + logger.debug(message) + checkCredentialConfig() + + for device in message["values"].keys(): + if not device in lwtData.keys(): + lwtData[device] = { + "init":False, + "client": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport="tcp") + } + #setup LWT and refresh status + lwt(device, lwtData[device]) + payload = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}} + resetPayload = {"ts": "", "values": {}} + dayReset, weekReset, monthReset, yearReset = False, False, False, False + for measure in message["values"][device].keys(): + try: + if message["values"][device][measure]["status"] == 1: + if measure in ["lifetime_flow_meter_gal"]: + payload["values"]["total_fm_day_gal"], payload["values"]["total_fm_day_bbls"],dayReset = totalizeDay(message["values"][device][measure]["raw_data"], device) + #payload["values"]["week_volume"], weekReset = totalizeWeek(message["values"][device][measure]["raw_data"]) + payload["values"]["total_fm_month_gal"],payload["values"]["total_fm_month_bbls"], monthReset = totalizeMonth(message["values"][device][measure]["raw_data"], device) + #payload["values"]["year_volume"], yearReset = totalizeYear(message["values"][device][measure]["raw_data"]) + payload["values"]["lifetime_flow_meter_gal"] = message["values"][device][measure]["raw_data"] + payload["values"]["lifetime_flow_meter_bbls"] = message["values"][device][measure]["raw_data"]/42 + elif measure in ["raw_hand_input", "raw_auto_input", "raw_run_status", "raw_local_start","raw_overload_status"]: + payload["values"][measure] = convert_int(measure, message["values"][device][measure]["raw_data"]) + else: + payload["values"][measure] = message["values"][device][measure]["raw_data"] + except Exception as e: + logger.error(e) + + if payload["values"]: + payload["values"]["plc_ping"] = "OK" + else: + payload["values"]["plc_ping"] = "Comms Error to PLC" + + for measure in payload["values"].keys(): + publish(__topic__+ device + ":01:99/" + measure, json.dumps({"value": payload["values"][measure]}), __qos__) + + if dayReset: + resetPayload["values"]["total_fm_yesterday_gal"] = payload["values"]["total_fm_day_gal"] + resetPayload["values"]["total_fm_day_gal"] = 0 + resetPayload["values"]["total_fm_yesterday_bbls"] = payload["values"]["total_fm_day_bbls"] + resetPayload["values"]["total_fm_day_bbls"] = 0 + if weekReset: + resetPayload["values"]["last_week_volume"] = payload["values"]["week_volume"] + resetPayload["values"]["week_volume"] = 0 + if monthReset: + resetPayload["values"]["total_fm_last_month_gal"] = payload["values"]["total_fm_month_gal"] + resetPayload["values"]["total_fm_month_gal"] = 0 + resetPayload["values"]["total_fm_last_month_bbls"] = payload["values"]["total_fm_month_bbls"] + resetPayload["values"]["total_fm_month_bbls"] = 0 + if yearReset: + resetPayload["values"]["last_year_volume"] = payload["values"]["year_volume"] + resetPayload["values"]["year_volume"] = 0 + + if resetPayload["values"]: + for measure in resetPayload["values"].keys(): + publish(__topic__+ device + ":01:99/" + measure, json.dumps({"value": resetPayload["values"][measure]}), __qos__) + +def saveTotalizers(totalizers, mac): + try: + mac = "".join(mac.split(":")) + with open(f"/var/user/files/totalizers_{mac}.json", "w") as t: + json.dump(totalizers,t) + except Exception as e: + logger.error(e) + + +def totalizeDay(lifetime, mac): + totalizers = get_totalizers(mac) + 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, mac) + reset = True + return (value,value / 42,reset) + +def totalizeWeek(lifetime, mac): + totalizers = get_totalizers(mac) + 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, mac) + reset = True + return (value,value / 42, reset) + +def totalizeMonth(lifetime, mac): + totalizers = get_totalizers(mac) + 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, mac) + reset = True + return (value,value / 42,reset) + +def totalizeYear(lifetime, mac): + totalizers = get_totalizers(mac) + 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, mac) + reset = True + return (value,value / 42, reset) + +def convert_int(plc_tag, value): + input_codes = { + 0: "Off", + 1: "On" + } + + run_status_codes = { + 0: "Stopped", + 1: "Running" + } + + overload_codes = { + 0: "Good", + 1: "Down on Overload Tripped" + } + + plc_tags = { + "raw_hand_input": input_codes.get(value, "Invalid Code"), + "raw_local_start": input_codes.get(value, "Invalid Code"), + "raw_auto_input": input_codes.get(value, "Invalid Code"), + "raw_run_status": run_status_codes.get(value, "Invalid Code"), + "raw_overload_status": overload_codes.get(value, "Invalid Code") + } + + return plc_tags.get(plc_tag, "Invalid Tag") \ No newline at end of file diff --git a/Pub_Sub/plcfreshwater/mistaway/v1/sub/receiveCommandv2.py b/Pub_Sub/plcfreshwater/mistaway/v1/sub/receiveCommandv2.py new file mode 100644 index 0000000..d2bbbaf --- /dev/null +++ b/Pub_Sub/plcfreshwater/mistaway/v1/sub/receiveCommandv2.py @@ -0,0 +1,92 @@ +# Enter your python code. +import json +from quickfaas.measure import recall +from quickfaas.remotebus import publish +from common.Logger import logger +from quickfaas.measure import write_plc_values + +def sync(mac,value, wizard_api): + #get new values and send + try: + data = recall()#json.loads(recall().decode("utf-8")) + except Exception as e: + logger.error(e) + logger.info(data) + + for controller in data: + if controller["name"] == mac[:-6]: + if controller["health"] == 1: + publish("meshify/db/194/_/plcfreshwater/" + mac + "/plc_ping", json.dumps({"value": "OK"})) + else: + publish("meshify/db/194/_/plcfreshwater/" + mac + "/plc_ping", json.dumps({"value": "Comms Error to PLC"})) + for measure in controller["measures"]: + #publish measure + topic = "meshify/db/194/_/plcfreshwater/" + mac + "/" + measure["name"] + if measure["name"] in ["raw_hand_input", "raw_auto_input", "raw_run_status", "raw_local_start","raw_overload_status"]: + payload = [{"value": convert_int(measure["name"], measure["value"])}] + else: + payload = [{"value": measure["value"]}] + logger.debug("Sending on topic: {}".format(topic)) + logger.debug("Sending value: {}".format(payload)) + publish(topic, json.dumps(payload)) +def writeplctag(mac, value, wizard_api): + try: + value = json.loads(value.replace("'",'"')) + logger.debug(value) + if value["tag"] == "CMD_Cloud_Control": + value["tag"] = "cmd_cloud_control" + message = {mac[:-6]:{value["tag"]: value["val"]}} + write_plc_values(message) + except Exception as e: + logger.debug(e) + +def receiveCommand(topic, payload, wizard_api): + logger.debug(topic) + logger.debug(json.loads(payload)) + p = json.loads(payload)[0] + command = p["payload"]["name"].split(".")[1] + commands = { + "sync": sync, + "writeplctag": writeplctag, + } + commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api) + #logger.debug(command) + ack(p["msgId"], p["mac"], command, p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api) + +def ack(msgid, mac, name, command, value, wizard_api): + #logger.debug(mac) + macsquish = "".join(mac.split(":")[:-2]) + maclower = ":".join(mac.split(":")[:-2]) + maclower = maclower.lower() + #logger.debug(msgid) + #logger.debug(mac) + #logger.debug(name) + #logger.debug(value) + publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(macsquish,name, value), "msgid": str(msgid)}])) + publish("meshify/db/194/_/mainMeshify/" + maclower + ":00:00/commands", json.dumps([{"value": {"status": "success", "value": str(value), "channel": command}, "msgid": str(msgid)}])) + +def convert_int(plc_tag, value): + input_codes = { + 0: "Off", + 1: "On" + } + + run_status_codes = { + 0: "Stopped", + 1: "Running" + } + + overload_codes = { + 0: "Good", + 1: "Down on Overload Tripped" + } + + plc_tags = { + "raw_hand_input": input_codes.get(value, "Invalid Code"), + "raw_local_start": input_codes.get(value, "Invalid Code"), + "raw_auto_input": input_codes.get(value, "Invalid Code"), + "raw_run_status": run_status_codes.get(value, "Invalid Code"), + "raw_overload_status": overload_codes.get(value, "Invalid Code") + } + + return plc_tags.get(plc_tag, "Invalid Tag")