From f06962ed1c2530a21392d1d2f555c27fb03f7712 Mon Sep 17 00:00:00 2001 From: Nico Melone Date: Tue, 20 Dec 2022 15:44:14 -0600 Subject: [PATCH] added hrbooster, updated tank alarms for TB and added a battery config --- .DS_Store | Bin 10244 -> 10244 bytes Pub_Sub/.DS_Store | Bin 18436 -> 18436 bytes .../hrbooster/thingsboard/v1/hrbooster.csv | 16 + .../thingsboard/v1/hrbooster.numbers | Bin 0 -> 145704 bytes .../hrbooster/thingsboard/v1/hrbooster2.csv | 16 + .../thingsboard/v1/hrboosterAlarms.csv | 8 + .../thingsboard/v1/hrbooster_tb_v1.cfg | 602 +++++++++++++++ .../thingsboard/hrbattery_8_7.csv | 154 ++++ .../thingsboard/hrbattery_alarm.csv | 64 ++ .../thingsboard/hrbattery_alarm_8_7.csv | 74 ++ .../thingsboard/hrtankbattery.csv | 132 ++++ .../thingsboard/v1/tankalarmAlarms.csv | 9 + .../tankalarms/thingsboard/v1/tankalarms.csv | 20 + .../thingsboard/v1/tankalarms_tb_v1.cfg | 724 ++++++++++++++++++ getPLCData.ipynb | 562 ++++++++++++++ 15 files changed, 2381 insertions(+) create mode 100644 Pub_Sub/hrbooster/thingsboard/v1/hrbooster.csv create mode 100755 Pub_Sub/hrbooster/thingsboard/v1/hrbooster.numbers create mode 100644 Pub_Sub/hrbooster/thingsboard/v1/hrbooster2.csv create mode 100644 Pub_Sub/hrbooster/thingsboard/v1/hrboosterAlarms.csv create mode 100644 Pub_Sub/hrbooster/thingsboard/v1/hrbooster_tb_v1.cfg create mode 100644 Pub_Sub/hrtankbattery/thingsboard/hrbattery_8_7.csv create mode 100644 Pub_Sub/hrtankbattery/thingsboard/hrbattery_alarm.csv create mode 100644 Pub_Sub/hrtankbattery/thingsboard/hrbattery_alarm_8_7.csv create mode 100644 Pub_Sub/hrtankbattery/thingsboard/hrtankbattery.csv create mode 100644 Pub_Sub/tankalarms/thingsboard/v1/tankalarmAlarms.csv create mode 100644 Pub_Sub/tankalarms/thingsboard/v1/tankalarms.csv create mode 100644 Pub_Sub/tankalarms/thingsboard/v1/tankalarms_tb_v1.cfg create mode 100644 getPLCData.ipynb diff --git a/.DS_Store b/.DS_Store index 851789ffddf6a08911c9ea416e4b71df4a36295d..ee251c9320c7975f5943ce1d879322a636d8262b 100644 GIT binary patch delta 1098 zcmeIwPe>F|90&0C9ao#-p}t*Pot<52#BBYu<*KWumTg*?Zl$f72Bob!#^ShZu3EO4 z7@oAc3{(`+pM&&=LRhmuRF{YdB1kroE_Lbt~6idRv6ef|Muhp$fwX_I27(Clvy2I~DM6s^{576sv6LW(Ud zBRkhsvbCbhQyWcWMiZr4Lh>F^?O?KVH*E;%)6B;UQInA+<~S&A=<)|TSV&k+oOx7g zRDErV$~pvoWvH--N=*YwZ^$1EFwf7h)J(Ox6m+6Kh<+TyaSY-##&8B_aSj)74cBo4ckmcb@D$JR5;KV69cJ+X^H{(l zzHxEf8jk0ToQX@~%v>gy#pQEloSUoG+@e>fw^i+`s;=?;6+Hy4(&E>R?^-r8x}MkV zSZq|ZNLHJjYM(9ET$*Pq5OjAIvl3H>tyth0RxhP=i=h7iGeoVDMJ%VORC7u8f3bZ< zX2_gw`$f0?ju`Mrfs9OS!e*3Xo32@jo!E<7?9)w`MO$zfKD0wcH-hLvFN(uBiBlNH zh%P&>+b+vq#3fwD6-?kJZs9f}n8Gw3;E`_q9Ix>f?<26r#YW=fC4+&qsYkRCtE_D> O%m3T_$2N<^Bm&*oX%oQ$>hgd*KMDy>yq zZe|LGl}WM?n@S{Wu`6U-5QA~y{cs2<4S%(M+!(8@sdW; zK?X>STqIY?6nRKqka_Zfd?w4}C;0_{A_beU8M!FH7Fc0JF)HCfHEQ66AI%8hC_2!I zE_9<80~o{*hB1P(IEVANfC*f~B=+9GP29#b9$*Gf@d~f;25<2ZOZbX!SjG_&}1GUku)J}_N74^_M>Z5+ztnD@gguJD`p?*K}t;?5eNM0*5h6M4Xv4pciouK1s z34_sOwm6u!Xf&5Hx20SX>^x<)%$$}=Nyo8vsb)JRF#w*LFq@2qT2{a`yUDQ;+C{QN zz6;tvf;JO5Fu(y9s!)pt97L1AY(Wsm&<;hAu7E~x0{w{M6ygH)G|pfQ>b?26z<^>9%Bwq@C?r}j|IFG)bH^LU$8V|-jp_*ZvCA)A@BRYz#CoQ^yC8n E1CA&B_W%F@ diff --git a/Pub_Sub/.DS_Store b/Pub_Sub/.DS_Store index c832e4b25028cb3f381598fd2fe75163df21d719..cc8a32d274d5afe4e40d00dc79d0954ba67757d9 100644 GIT binary patch delta 1177 zcma)6U2GIp7`>-kx^ugwy%oE6cgsR)$=2G9-KE>VEv*z5F&1o<*8X4&vpa*GushT4 zZ21v&iBujSYLgp@Bqk<4`67XgCdLO|FvcI?L7Vtuj6fh7LkuSRDtC5jjLANDCv%hY zec%1&+;b-1$|_b?u{wb_u1wbX#aOCE?C-tUKnQ_+sIR4- zl!!`9a#Zel`4&lm*rI9YX=NZW5O3R&7!*IZ?@CoI)9hS6Ygu`>ca;L6rd!HY;>0dk znM^isWnE5<&D-Dq_Jc3Rs`qefwf|kaxR5-UvkHqYA#Vk%5hJz}+0+?u0&TN3_)H{6 zmja8<#|KX&607%(2KMg!*t423;G&sYTOv)AwIjDHI|l*(n*DND3xd{kJ1-4 zwWJ@gH20LIuuo|v)5fFxkek_4)a9-z-hu7B9HUdV@rtf6)vN5H-E``xVQQ4wUgQay z;L~|EtLG`xymP&@kIx*_i?(5zl#P4AL7L{XQmlgHY)igzFFeAZ^`gSQ@)G-ahKtLgmTm53$0hkWx5JpGRj6-lY+`(pKd-Rw z6mc&!SH46(Ay>)Q+$7(VAIV*EkNiS@C4Z2=K~Mu98W2Jl5p>`&bfFt@^dXI5 zj9?V|Z~)I@63<~CS>&MO2rQhyNxX{Ja2D_40^Y+#e29;6372sNpW`}i;3j^+E!-AY z!+!iOz6|$>GqI%D5xG;Qo1_1@`mdj!ztd7&{eO2_fjw{khR#SmAl1Nf%7xS&d?mh|O0XmeX(m1xYb}by@!JQ)#5%<@j>#g==WUFgT z&f^tr`Z0hZsZR!b@f4oMGdPGTOk)Of6^*otMvGX2 zjb*%!(>Q|_yotB*4pxP}xyK21{aIH-h6Sr_bK;2&zD<-Y$Z?P*mV9hECUjC1J*iGP oRDJ_Qb83t8LTaM^KXXFdA5Dt~17UHv=Of3z>#thprD-gB1U}(3Dl~ssxDdyZpj|8XhplJlnomsT2-{7MMww)5(~z@ZkH9a80kMV z=l@6Nn}tOzEMjpCC$8-BG{~K;^YUISX@Jz0-e`MupW6;K{oz8J-Nd-dez?ltc;)0x z*o~bTO^&vdU9o6P?&@AGo8xO`HrOJg!RZFt=u1z~NolsX$`9R}+ou>S7sa@kHA~jK z7&1$un6akwx!u+YA@91!D_$fGW0^Ite97nY2XvhUGv$NUv9eV#4hDLRLiZ$2ts%bcDm1zFoQ!Z1UO%)@UiZ~32P6A{-Ns(=2 zKM~|8IYT}om&j%E9a$pR$&ch$a*Nz1cgSz#ck(y+hukL*$Wv%=!3_^u&<>6cbR&j1 z66nJw3}Y)sFp8a+L{6|$y{tt$H;^kr`{3_xQUPl+g zSceVRh<+q%QIB97-o|#M@ve${5B6dj0*7!I778e#T#Nh^POHQ}z&V`91xS31%lI5$ z;7fdkukn2~eVObC+O1uWJQ$G7-D!s-D_k-be?`v3?t#ciyu&WX$EXpFMmL5#6Omqd fr*}{`4Gzc$ef@Ikjc@FR)MK|Cj|J>R;=cAAhVJ+N diff --git a/Pub_Sub/hrbooster/thingsboard/v1/hrbooster.csv b/Pub_Sub/hrbooster/thingsboard/v1/hrbooster.csv new file mode 100644 index 0000000..b4ebf6e --- /dev/null +++ b/Pub_Sub/hrbooster/thingsboard/v1/hrbooster.csv @@ -0,0 +1,16 @@ +MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,bitMap,msecSample +suction,hrbooster,default,periodic,FLOAT,AIn_SuctionPressure.Val,2,,ro,,,none,,,,,,,,,, +discharge,hrbooster,default,periodic,FLOAT,AIn_DischargePressure.Val,2,,ro,,,none,,,,,,,,,, +flowrate,hrbooster,default,periodic,FLOAT,Flow_Rate_MBS,2,,ro,,,none,,,,,,,,,, +today_total,hrbooster,default,periodic,FLOAT,Today_Totalizer.Total,2,,ro,,,none,,,,,,,,,, +month_total,hrbooster,default,periodic,FLOAT,Month_Totalizer.Total,2,,ro,,,none,,,,,,,,,, +output_current,hrbooster,default,periodic,FLOAT,VFD_OutCurrent,2,,ro,,,none,,,,,,,,,, +speed_feedback,hrbooster,default,periodic,FLOAT,VFD_SpeedFdbk,2,,ro,,,none,,,,,,,,,, +running_status,hrbooster,default,periodic,BIT,VFD_753:I.DriveStatus_Running,,,ro,,,none,,,,,,,,,0, +suction_alm,hrbooster,default,periodic,BIT,alarm_SuctionPressure,,,ro,,,none,,,,,,,,,0, +discharge_alm,hrbooster,default,periodic,BIT,alarm_DischargePressure,,,ro,,,none,,,,,,,,,0, +vfd_alm,hrbooster,default,periodic,BIT,alarm_VFD,,,ro,,,none,,,,,,,,,0, +dc_alm,hrbooster,default,periodic,BIT,DC_Alarm,,,ro,,,none,,,,,,,,,0, +ups_alm,hrbooster,default,periodic,BIT,UPS_Alarm,,,ro,,,none,,,,,,,,,0, +ac_alm,hrbooster,default,periodic,BIT,AC_Power_Fail,,,ro,,,none,,,,,,,,,0, +plc_io_alm,hrbooster,default,periodic,BIT,ControllerFault_IO,,,ro,,,none,,,,,,,,,0, \ No newline at end of file diff --git a/Pub_Sub/hrbooster/thingsboard/v1/hrbooster.numbers b/Pub_Sub/hrbooster/thingsboard/v1/hrbooster.numbers new file mode 100755 index 0000000000000000000000000000000000000000..240d7cfdc1e97a4a15f3deff73aa87c9da08739c GIT binary patch literal 145704 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 literal 0 HcmV?d00001 diff --git a/Pub_Sub/hrbooster/thingsboard/v1/hrbooster2.csv b/Pub_Sub/hrbooster/thingsboard/v1/hrbooster2.csv new file mode 100644 index 0000000..fb02e69 --- /dev/null +++ b/Pub_Sub/hrbooster/thingsboard/v1/hrbooster2.csv @@ -0,0 +1,16 @@ +MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Address,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,bitMap,msecSample +suction,hrbooster,default,periodic,FLOAT,AIn_SuctionPressureVal,2,1,ro,,,none,,,,,,,,,, +discharge,hrbooster,default,periodic,FLOAT,AIn_DischargePressureVal,2,1,ro,,,none,,,,,,,,,, +flowrate,hrbooster,default,periodic,FLOAT,Flow_Rate_MBS,2,1,ro,,,none,,,,,,,,,, +today_total,hrbooster,default,periodic,FLOAT,Today_Totalizer,2,1,ro,,,none,,,,,,,,,, +month_total,hrbooster,default,periodic,FLOAT,Month_Totalizer,2,1,ro,,,none,,,,,,,,,, +output_current,hrbooster,default,periodic,FLOAT,VFD_OutCurrent,2,1,ro,,,none,,,,,,,,,, +speed_feedback,hrbooster,default,periodic,FLOAT,VFD_SpeedFdbk,2,1,ro,,,none,,,,,,,,,, +running_status,hrbooster,default,periodic,BIT,VFD_753IDriveStatus_Running,2,1,ro,,,none,,,,,,,,,, +suction_alm,hrbooster,default,periodic,BIT,alarm_SuctionPressure,2,1,ro,,,none,,,,,,,,,, +discharge_alm,hrbooster,default,periodic,BIT,alarm_DischargePressure,2,1,ro,,,none,,,,,,,,,, +vfd_alm,hrbooster,default,periodic,BIT,alarm_VFD,2,1,ro,,,none,,,,,,,,,, +dc_alm,hrbooster,default,periodic,BIT,DC_Alarm,2,1,ro,,,none,,,,,,,,,, +ups_alm,hrbooster,default,periodic,BIT,UPS_Alarm,2,1,ro,,,none,,,,,,,,,, +ac_alm,hrbooster,default,periodic,BIT,AC_Power_Fail,2,1,ro,,,none,,,,,,,,,, +plc_io_alm,hrbooster,default,periodic,BIT,ControllerFault_IO,2,1,ro,,,none,,,,,,,,,, \ No newline at end of file diff --git a/Pub_Sub/hrbooster/thingsboard/v1/hrboosterAlarms.csv b/Pub_Sub/hrbooster/thingsboard/v1/hrboosterAlarms.csv new file mode 100644 index 0000000..3ac4678 --- /dev/null +++ b/Pub_Sub/hrbooster/thingsboard/v1/hrboosterAlarms.csv @@ -0,0 +1,8 @@ +AlarmName,ControllerName,MeasuringPointName,AlarmLevel,Condition1,Operand1,CombineMethod,Condition2,Operand2,AlarmContent +suction_alm,hrbooster,suction_alm,5,eq,1.0,none,eq,,Suction Pressure Alarm +discharge_alm,hrbooster,discharge_alm,5,eq,1.0,none,eq,,Discharge Pressure Alarm +vfd_alm,hrbooster,vfd_alm,5,eq,1.0,none,eq,,VFD has Alarmed +dc_alm,hrbooster,dc_alm,5,eq,1.0,none,eq,,DC Power Failure +ups_alm,hrbooster,ups_alm,5,eq,1.0,none,eq,,UPS Alarm +ac_alm,hrbooster,ac_alm,5,eq,1.0,none,eq,,AC Power Failure +plc_io_alm,hrbooster,plc_io_alm,5,eq,1.0,none,eq,,Controller IO Failure \ No newline at end of file diff --git a/Pub_Sub/hrbooster/thingsboard/v1/hrbooster_tb_v1.cfg b/Pub_Sub/hrbooster/thingsboard/v1/hrbooster_tb_v1.cfg new file mode 100644 index 0000000..a33114b --- /dev/null +++ b/Pub_Sub/hrbooster/thingsboard/v1/hrbooster_tb_v1.cfg @@ -0,0 +1,602 @@ +{ + "controllers": [ + { + "protocol": "EtherNet/IP", + "name": "hrbooster", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.10:44818" + } + ], + "measures": [ + { + "name": "suction", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "AIn_SuctionPressure.Val", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "discharge", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "AIn_DischargePressure.Val", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "flowrate", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Flow_Rate_MBS", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "today_total", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Today_Totalizer.Total", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "month_total", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Month_Totalizer.Total", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "output_current", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "VFD_OutCurrent", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "speed_feedback", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "VFD_SpeedFdbk", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "running_status", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "VFD_753:I.DriveStatus_Running", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "suction_alm", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "alarm_SuctionPressure", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "discharge_alm", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "alarm_DischargePressure", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "vfd_alm", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "alarm_VFD", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "dc_alm", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "DC_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "ups_alm", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "UPS_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "ac_alm", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "AC_Power_Fail", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "plc_io_alm", + "ctrlName": "hrbooster", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "ControllerFault_IO", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + } + ], + "alarmLables": [ + "default" + ], + "alarms": [ + { + "name": "suction_alm", + "ctrlName": "hrbooster", + "measureName": "suction_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Suction Pressure Alarm" + }, + { + "name": "discharge_alm", + "ctrlName": "hrbooster", + "measureName": "discharge_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Discharge Pressure Alarm" + }, + { + "name": "vfd_alm", + "ctrlName": "hrbooster", + "measureName": "vfd_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "VFD has Alarmed" + }, + { + "name": "dc_alm", + "ctrlName": "hrbooster", + "measureName": "dc_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "DC Power Failure" + }, + { + "name": "ups_alm", + "ctrlName": "hrbooster", + "measureName": "ups_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "UPS Alarm" + }, + { + "name": "ac_alm", + "ctrlName": "hrbooster", + "measureName": "ac_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "AC Power Failure" + }, + { + "name": "plc_io_alm", + "ctrlName": "hrbooster", + "measureName": "plc_io_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Controller IO Failure" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 10 + } + ], + "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", + "willQos": 0, + "willRetain": 0, + "willTopic": "", + "willPayload": "", + "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\ndef sendData(message):\n #logger.debug(message)\n try:\n checkCredentialConfig()\n except Exception as e:\n logger.error(e)\n payload = {\"ts\": (round(dt.timestamp(dt.now())/600)*600)*1000, \"values\": {}}\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"] \n except Exception as e:\n logger.error(e)\n \n publish(__topic__, json.dumps(payload), __qos__)\n publish(\"v1/devices/me/attributes\", json.dumps({\"latestReportTime\": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__)\n", + "msgType": 0, + "cloudName": "default" + } + ], + "downloadFuncs": [] + }, + "labels": [ + { + "key": "SN", + "value": "GF5022230019659" + }, + { + "key": "MAC", + "value": "00:18:05:22:e8:9d" + } + ], + "modbusSlave": { + "enable": 0, + "protocol": "Modbus-TCP", + "port": 502, + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "maxConnection": 5, + "mapping_table": [] + }, + "modbusRTUSlave": { + "enable": 0, + "protocol": "Modbus-RTU", + "coms": "rs485", + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "mapping_table": [] + }, + "iec104Server": { + "enable": 0, + "cotSize": 2, + "port": 2404, + "serverList": [ + { + "asduAddr": 1 + } + ], + "kValue": 12, + "wValue": 8, + "t0": 30, + "t1": 15, + "t2": 10, + "t3": 20, + "maximumLink": 5, + "timeSet": 1, + "byteOrder": "abcd", + "mapping_table": [] + }, + "iec104Client": { + "enable": 0, + "connectType": 2, + "serverAddr": "ipower.inhandcloud.cn", + "serverPort": 2404, + "communicationCode": "", + "protocol": 1, + "asduAddr": 1, + "tls": 0, + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "opcuaServer": { + "enable": 0, + "port": 4840, + "maximumLink": 5, + "securityMode": 0, + "identifierType": "String", + "certificate": "None", + "privateKey": "None", + "mapping_table": [] + }, + "southMetadata": {}, + "bindMetadata": { + "version": "", + "timestamp": "" + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "version": "2.4.0" +} \ No newline at end of file diff --git a/Pub_Sub/hrtankbattery/thingsboard/hrbattery_8_7.csv b/Pub_Sub/hrtankbattery/thingsboard/hrbattery_8_7.csv new file mode 100644 index 0000000..b8673e3 --- /dev/null +++ b/Pub_Sub/hrtankbattery/thingsboard/hrbattery_8_7.csv @@ -0,0 +1,154 @@ +MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,bitMap,msecSample +plc_io_fault_alm,hrtankbattery,default,periodic,BIT,IO_Fault_Alarm,,,ro,,,none,,,,,,,,,0, +plc_fault,hrtankbattery,default,periodic,BIT,PLC_FAULT,,,ro,,,none,,,,,,,,,0, +analog_01_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_01,,,ro,,,none,,,,,,,,,0, +analog_02_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_02,,,ro,,,none,,,,,,,,,0, +analog_03_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_03,,,ro,,,none,,,,,,,,,0, +analog_04_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_04,,,ro,,,none,,,,,,,,,0, +analog_05_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_05,,,ro,,,none,,,,,,,,,0, +analog_06_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_06,,,ro,,,none,,,,,,,,,0, +ac_power_alm,hrtankbattery,default,periodic,BIT,Alm_AC_Pwr.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, +ups_alm,hrtankbattery,default,periodic,BIT,Alm_UPS.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, +dc_power_alm,hrtankbattery,default,periodic,BIT,DC_Power_OK.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, +three_phase_pwr_alm,hrtankbattery,default,periodic,BIT,Three_Phase_Power_Alarm.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, +water_run_tank,hrtankbattery,default,periodic,DINT,WT_Selector,,,ro,,,none,,,,,,,,,, +water_01_level,hrtankbattery,default,periodic,FLOAT,WT_1.Val,2,,ro,,,none,,,,,,,,,, +water_01_hihi_alm,hrtankbattery,default,periodic,BIT,WT_1.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +water_01_hi_alm,hrtankbattery,default,periodic,BIT,WT_1.Alm_Hi,,,ro,,,none,,,,,,,,,0, +water_01_tx_alm,hrtankbattery,default,periodic,BIT,WT_1.Alm_Fail,,,ro,,,none,,,,,,,,,0, +water_01_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_1.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +water_01_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_1.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +water_01_max_height,hrtankbattery,default,periodic,FLOAT,WT_1.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +water_02_level,hrtankbattery,default,periodic,FLOAT,WT_2.Val,2,,ro,,,none,,,,,,,,,, +water_02_hihi_alm,hrtankbattery,default,periodic,BIT,WT_2.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +water_02_hi_alm,hrtankbattery,default,periodic,BIT,WT_2.Alm_Hi,,,ro,,,none,,,,,,,,,0, +water_02_tx_alm,hrtankbattery,default,periodic,BIT,WT_2.Alm_Fail,,,ro,,,none,,,,,,,,,0, +water_02_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_2.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +water_02_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_2.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +water_02_max_height,hrtankbattery,default,periodic,FLOAT,WT_2.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +water_03_level,hrtankbattery,default,periodic,FLOAT,WT_3.Val,2,,ro,,,none,,,,,,,,,, +water_03_hihi_alm,hrtankbattery,default,periodic,BIT,WT_3.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +water_03_hi_alm,hrtankbattery,default,periodic,BIT,WT_3.Alm_Hi,,,ro,,,none,,,,,,,,,0, +water_03_tx_alm,hrtankbattery,default,periodic,BIT,WT_3.Alm_Fail,,,ro,,,none,,,,,,,,,0, +water_03_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_3.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +water_03_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_3.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +water_03_max_height,hrtankbattery,default,periodic,FLOAT,WT_3.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +water_04_level,hrtankbattery,default,periodic,FLOAT,WT_4.Val,2,,ro,,,none,,,,,,,,,, +water_04_hihi_alm,hrtankbattery,default,periodic,BIT,WT_4.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +water_04_hi_alm,hrtankbattery,default,periodic,BIT,WT_4.Alm_Hi,,,ro,,,none,,,,,,,,,0, +water_04_tx_alm,hrtankbattery,default,periodic,BIT,WT_4.Alm_Fail,,,ro,,,none,,,,,,,,,0, +water_04_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_4.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +water_04_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_4.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +water_04_max_height,hrtankbattery,default,periodic,FLOAT,WT_4.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +water_05_level,hrtankbattery,default,periodic,FLOAT,WT_5.Val,2,,ro,,,none,,,,,,,,,, +water_05_hihi_alm,hrtankbattery,default,periodic,BIT,WT_5.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +water_05_hi_alm,hrtankbattery,default,periodic,BIT,WT_5.Alm_Hi,,,ro,,,none,,,,,,,,,0, +water_05_tx_alm,hrtankbattery,default,periodic,BIT,WT_5.Alm_Fail,,,ro,,,none,,,,,,,,,0, +water_05_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_5.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +water_05_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_5.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +water_05_max_height,hrtankbattery,default,periodic,FLOAT,WT_5.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +water_06_level,hrtankbattery,default,periodic,FLOAT,WT_6.Val,2,,ro,,,none,,,,,,,,,, +water_06_hihi_alm,hrtankbattery,default,periodic,BIT,WT_6.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +water_06_hi_alm,hrtankbattery,default,periodic,BIT,WT_6.Alm_Hi,,,ro,,,none,,,,,,,,,0, +water_06_tx_alm,hrtankbattery,default,periodic,BIT,WT_6.Alm_Fail,,,ro,,,none,,,,,,,,,0, +water_06_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_6.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +water_06_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_6.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +water_06_max_height,hrtankbattery,default,periodic,FLOAT,WT_6.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +water_07_level,hrtankbattery,default,periodic,FLOAT,WT_7.Val,2,,ro,,,none,,,,,,,,,, +water_07_hihi_alm,hrtankbattery,default,periodic,BIT,WT_7.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +water_07_hi_alm,hrtankbattery,default,periodic,BIT,WT_7.Alm_Hi,,,ro,,,none,,,,,,,,,0, +water_07_tx_alm,hrtankbattery,default,periodic,BIT,WT_7.Alm_Fail,,,ro,,,none,,,,,,,,,0, +water_07_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_7.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +water_07_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_7.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +water_07_max_height,hrtankbattery,default,periodic,FLOAT,WT_7.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +water_08_level,hrtankbattery,default,periodic,FLOAT,WT_8.Val,2,,ro,,,none,,,,,,,,,, +water_08_hihi_alm,hrtankbattery,default,periodic,BIT,WT_8.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +water_08_hi_alm,hrtankbattery,default,periodic,BIT,WT_8.Alm_Hi,,,ro,,,none,,,,,,,,,0, +water_08_tx_alm,hrtankbattery,default,periodic,BIT,WT_8.Alm_Fail,,,ro,,,none,,,,,,,,,0, +water_08_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_8.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +water_08_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_8.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +water_08_max_height,hrtankbattery,default,periodic,FLOAT,WT_8.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +oil_run_tank,hrtankbattery,default,periodic,DINT,OT_Selector,,,ro,,,none,,,,,,,,,, +oil_01_level,hrtankbattery,default,periodic,FLOAT,OT_1.Val,2,,ro,,,none,,,,,,,,,, +oil_01_hihi_alm,hrtankbattery,default,periodic,BIT,OT_1.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +oil_01_hi_alm,hrtankbattery,default,periodic,BIT,OT_1.Alm_Hi,,,ro,,,none,,,,,,,,,0, +oil_01_tx_alm,hrtankbattery,default,periodic,BIT,OT_1.Alm_Fail,,,ro,,,none,,,,,,,,,0, +oil_01_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_1.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +oil_01_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_1.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +oil_01_max_height,hrtankbattery,default,periodic,FLOAT,OT_1.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +oil_02_level,hrtankbattery,default,periodic,FLOAT,OT_2.Val,2,,ro,,,none,,,,,,,,,, +oil_02_hihi_alm,hrtankbattery,default,periodic,BIT,OT_2.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +oil_02_hi_alm,hrtankbattery,default,periodic,BIT,OT_2.Alm_Hi,,,ro,,,none,,,,,,,,,0, +oil_02_tx_alm,hrtankbattery,default,periodic,BIT,OT_2.Alm_Fail,,,ro,,,none,,,,,,,,,0, +oil_02_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_2.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +oil_02_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_2.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +oil_02_max_height,hrtankbattery,default,periodic,FLOAT,OT_2.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +oil_03_level,hrtankbattery,default,periodic,FLOAT,OT_3.Val,2,,ro,,,none,,,,,,,,,, +oil_03_hihi_alm,hrtankbattery,default,periodic,BIT,OT_3.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +oil_03_hi_alm,hrtankbattery,default,periodic,BIT,OT_3.Alm_Hi,,,ro,,,none,,,,,,,,,0, +oil_03_tx_alm,hrtankbattery,default,periodic,BIT,OT_3.Alm_Fail,,,ro,,,none,,,,,,,,,0, +oil_03_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_3.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +oil_03_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_3.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +oil_03_max_height,hrtankbattery,default,periodic,FLOAT,OT_3.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +oil_04_level,hrtankbattery,default,periodic,FLOAT,OT_4.Val,2,,ro,,,none,,,,,,,,,, +oil_04_hihi_alm,hrtankbattery,default,periodic,BIT,OT_4.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +oil_04_hi_alm,hrtankbattery,default,periodic,BIT,OT_4.Alm_Hi,,,ro,,,none,,,,,,,,,0, +oil_04_tx_alm,hrtankbattery,default,periodic,BIT,OT_4.Alm_Fail,,,ro,,,none,,,,,,,,,0, +oil_04_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_4.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +oil_04_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_4.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +oil_04_max_height,hrtankbattery,default,periodic,FLOAT,OT_4.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +oil_05_level,hrtankbattery,default,periodic,FLOAT,OT_5.Val,2,,ro,,,none,,,,,,,,,, +oil_05_hihi_alm,hrtankbattery,default,periodic,BIT,OT_5.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +oil_05_hi_alm,hrtankbattery,default,periodic,BIT,OT_5.Alm_Hi,,,ro,,,none,,,,,,,,,0, +oil_05_tx_alm,hrtankbattery,default,periodic,BIT,OT_5.Alm_Fail,,,ro,,,none,,,,,,,,,0, +oil_05_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_5.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +oil_05_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_5.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +oil_05_max_height,hrtankbattery,default,periodic,FLOAT,OT_5.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +oil_06_level,hrtankbattery,default,periodic,FLOAT,OT_6.Val,2,,ro,,,none,,,,,,,,,, +oil_06_hihi_alm,hrtankbattery,default,periodic,BIT,OT_6.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +oil_06_hi_alm,hrtankbattery,default,periodic,BIT,OT_6.Alm_Hi,,,ro,,,none,,,,,,,,,0, +oil_06_tx_alm,hrtankbattery,default,periodic,BIT,OT_6.Alm_Fail,,,ro,,,none,,,,,,,,,0, +oil_06_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_6.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +oil_06_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_6.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +oil_06_max_height,hrtankbattery,default,periodic,FLOAT,OT_6.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +oil_07_level,hrtankbattery,default,periodic,FLOAT,OT_7.Val,2,,ro,,,none,,,,,,,,,, +oil_07_hihi_alm,hrtankbattery,default,periodic,BIT,OT_7.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +oil_07_hi_alm,hrtankbattery,default,periodic,BIT,OT_7.Alm_Hi,,,ro,,,none,,,,,,,,,0, +oil_07_tx_alm,hrtankbattery,default,periodic,BIT,OT_7.Alm_Fail,,,ro,,,none,,,,,,,,,0, +oil_07_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_7.PSet_HiHiLim,2,,ro,,,none,,,,,,,,,, +oil_07_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_7.PSet_HiLim,2,,ro,,,none,,,,,,,,,, +oil_07_max_height,hrtankbattery,default,periodic,FLOAT,OT_7.Cfg_PVEUMax,2,,ro,,,none,,,,,,,,,, +transfer_01_sts,hrtankbattery,default,periodic,BIT,XFER_PUMP_Motor_01.Sts_Running,,,ro,,,none,,,,,,,,,0, +transfer_01_alm,hrtankbattery,default,periodic,BIT,XFER_PUMP_Motor_01.Alm_FailToStart,,,ro,,,none,,,,,,,,,0, +transfer_01_discharge,hrtankbattery,default,periodic,FLOAT,XferPump_01_Dis_PSI.Val,2,,ro,,,none,,,,,,,,,, +transfer_01_discharge_hihi_alm,hrtankbattery,default,periodic,BIT,XferPump_01_Dis_PSI.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +transfer_01_discharge_lolo_alm,hrtankbattery,default,periodic,BIT,XferPump_01_Dis_PSI.Alm_LoLo,,,ro,,,none,,,,,,,,,0, +transfer_01_flow_rate,hrtankbattery,default,periodic,FLOAT,XferPump_01_FlowRate.Val,2,,ro,,,none,,,,,,,,,, +transfer_01_flow_rate_hihi_alm,hrtankbattery,default,periodic,BIT,XferPump_01_FlowRate.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +transfer_01_flow_rate_lolo_alm,hrtankbattery,default,periodic,BIT,XferPump_01_FlowRate.Alm_LoLo,,,ro,,,none,,,,,,,,,0, +transfer_02_sts,hrtankbattery,default,periodic,BIT,XFER_PUMP_Motor_02.Sts_Running,,,ro,,,none,,,,,,,,,0, +transfer_02_alm,hrtankbattery,default,periodic,BIT,XFER_PUMP_Motor_02.Alm_FailToStart,,,ro,,,none,,,,,,,,,0, +transfer_02_discharge,hrtankbattery,default,periodic,FLOAT,XferPump_02_Dis_PSI.Val,2,,ro,,,none,,,,,,,,,, +transfer_02_discharge_hihi_alm,hrtankbattery,default,periodic,BIT,XferPump_02_Dis_PSI.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +transfer_02_discharge_lolo_alm,hrtankbattery,default,periodic,BIT,XferPump_02_Dis_PSI.Alm_LoLo,,,ro,,,none,,,,,,,,,0, +transfer_02_flow_rate,hrtankbattery,default,periodic,FLOAT,XferPump_02_FlowRate.Val,2,,ro,,,none,,,,,,,,,, +transfer_02_flow_rate_hihi_alm,hrtankbattery,default,periodic,BIT,XferPump_02_FlowRate.Alm_HiHi,,,ro,,,none,,,,,,,,,0, +transfer_02_flow_rate_lolo_alm,hrtankbattery,default,periodic,BIT,XferPump_02_FlowRate.Alm_LoLo,,,ro,,,none,,,,,,,,,0, +lact_01_permissive,hrtankbattery,default,periodic,BIT,LACT_01_Permissive,,,ro,,,none,,,,,,,,,0, +lact_01_sts,hrtankbattery,default,periodic,BIT,LACT_01_Run_Status,,,ro,,,none,,,,,,,,,0, +lact_01_alm,hrtankbattery,default,periodic,BIT,LACT_01_Failure,,,ro,,,none,,,,,,,,,0, +lact_01_oil_shutdown,hrtankbattery,default,periodic,BIT,LACT_01_Bad_Oil_Shutdown,,,ro,,,none,,,,,,,,,0, +lact_01_flow_rate,hrtankbattery,default,periodic,FLOAT,Lact_01_Realtime_Flow_Rate,2,,ro,,,none,,,,,,,,,, +lact_01_bs_w,hrtankbattery,default,periodic,FLOAT,Lact_01_BS_and_W_Reading,2,,ro,,,none,,,,,,,,,, +lact_01_daily_volume,hrtankbattery,default,periodic,FLOAT,Lact_01_Current_Daily_Ind_Volume_Total,2,,ro,,,none,,,,,,,,,, +lact_01_prev_day,hrtankbattery,default,periodic,FLOAT,Lact_01_History.Previous_Day_1,2,,ro,,,none,,,,,,,,,, +lact_02_permissive,hrtankbattery,default,periodic,BIT,LACT_02_Permissive,,,ro,,,none,,,,,,,,,0, +lact_02_sts,hrtankbattery,default,periodic,BIT,LACT_02_Run_Status,,,ro,,,none,,,,,,,,,0, +lact_02_alm,hrtankbattery,default,periodic,BIT,LACT_02_Failure,,,ro,,,none,,,,,,,,,0, +lact_02_oil_shutdown,hrtankbattery,default,periodic,BIT,LACT_02_Bad_Oil_Shutdown,,,ro,,,none,,,,,,,,,0, +lact_02_flow_rate,hrtankbattery,default,periodic,FLOAT,Lact_02_Realtime_Flow_Rate,2,,ro,,,none,,,,,,,,,, +lact_02_bs_w,hrtankbattery,default,periodic,FLOAT,Lact_02_BS_and_W_Reading,2,,ro,,,none,,,,,,,,,, +lact_02_daily_volume,hrtankbattery,default,periodic,FLOAT,Lact_02_Current_Daily_Ind_Volume_Total,2,,ro,,,none,,,,,,,,,, +lact_02_prev_day,hrtankbattery,default,periodic,FLOAT,Lact_02_History.Previous_Day_1,2,,ro,,,none,,,,,,,,,, +containment_high_alm,hrtankbattery,default,periodic,BIT,Contain_Hi_Level.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, +h2s_alm,hrtankbattery,default,periodic,BIT,H2s_Alarm.Alm_TgtDisagree,,,ro,,,none,,,,,,,,,0, \ No newline at end of file diff --git a/Pub_Sub/hrtankbattery/thingsboard/hrbattery_alarm.csv b/Pub_Sub/hrtankbattery/thingsboard/hrbattery_alarm.csv new file mode 100644 index 0000000..c5080f1 --- /dev/null +++ b/Pub_Sub/hrtankbattery/thingsboard/hrbattery_alarm.csv @@ -0,0 +1,64 @@ +AlarmName,ControllerName,MeasuringPointName,AlarmLevel,Condition1,Operand1,CombineMethod,Condition2,Operand2,AlarmContent +plc_io_fault_alm,hrtankbattery,plc_io_fault_alm,5,eq,1.0,none,eq,,PLC IO has faulted +plc_fault,hrtankbattery,plc_fault,5,eq,1.0,none,eq,,PLC has faulted +analog_01_alm,hrtankbattery,analog_01_alm,5,eq,1.0,none,eq,,Analog Module 1 has faulted +analog_02_alm,hrtankbattery,analog_02_alm,5,eq,1.0,none,eq,,Analog Module 2 has faulted +analog_03_alm,hrtankbattery,analog_03_alm,5,eq,1.0,none,eq,,Analog Module 3 has faulted +analog_04_alm,hrtankbattery,analog_04_alm,5,eq,1.0,none,eq,,Analog Module 4 has faulted +analog_05_alm,hrtankbattery,analog_05_alm,5,eq,1.0,none,eq,,Analog Module 5 has faulted +analog_06_alm,hrtankbattery,analog_06_alm,5,eq,1.0,none,eq,,Analog Module 6 has faulted +ac_power_alm,hrtankbattery,ac_power_alm,5,eq,1.0,none,eq,,AC Power Fault +ups_alm,hrtankbattery,ups_alm,5,eq,1.0,none,eq,,UPS Fault +dc_power_alm,hrtankbattery,dc_power_alm,5,eq,1.0,none,eq,,DC Power Fault +three_phase_pwr_alm,hrtankbattery,three_phase_pwr_alm,5,eq,1.0,none,eq,,Three Phase Power Fault +water_01_hihi_alm,hrtankbattery,water_01_hihi_alm,5,eq,1.0,none,eq,,Water Tank 1 crossed HiHi threshold +water_01_hi_alm,hrtankbattery,water_01_hi_alm,5,eq,1.0,none,eq,,Water Tank 1 crossed Hi threshold +water_01_tx_alm,hrtankbattery,water_01_tx_alm,5,eq,1.0,none,eq,,Water Tank 1 transmission error +water_02_hihi_alm,hrtankbattery,water_02_hihi_alm,5,eq,1.0,none,eq,,Water Tank 2 crossed HiHi threshold +water_02_hi_alm,hrtankbattery,water_02_hi_alm,5,eq,1.0,none,eq,,Water Tank 2 crossed Hi threshold +water_02_tx_alm,hrtankbattery,water_02_tx_alm,5,eq,1.0,none,eq,,Water Tank 2 transmission error +water_03_hihi_alm,hrtankbattery,water_03_hihi_alm,5,eq,1.0,none,eq,,Water Tank 3 crossed HiHi threshold +water_03_hi_alm,hrtankbattery,water_03_hi_alm,5,eq,1.0,none,eq,,Water Tank 3 crossed Hi threshold +water_03_tx_alm,hrtankbattery,water_03_tx_alm,5,eq,1.0,none,eq,,Water Tank 3 transmission error +water_04_hihi_alm,hrtankbattery,water_04_hihi_alm,5,eq,1.0,none,eq,,Water Tank 4 crossed HiHi threshold +water_04_hi_alm,hrtankbattery,water_04_hi_alm,5,eq,1.0,none,eq,,Water Tank 4 crossed Hi threshold +water_04_tx_alm,hrtankbattery,water_04_tx_alm,5,eq,1.0,none,eq,,Water Tank 4 transmission error +water_05_hihi_alm,hrtankbattery,water_05_hihi_alm,5,eq,1.0,none,eq,,Water Tank 5 crossed HiHi threshold +water_05_hi_alm,hrtankbattery,water_05_hi_alm,5,eq,1.0,none,eq,,Water Tank 5 crossed Hi threshold +water_05_tx_alm,hrtankbattery,water_05_tx_alm,5,eq,1.0,none,eq,,Water Tank 5 transmission error +water_06_hihi_alm,hrtankbattery,water_06_hihi_alm,5,eq,1.0,none,eq,,Water Tank 6 crossed HiHi threshold +water_06_hi_alm,hrtankbattery,water_06_hi_alm,5,eq,1.0,none,eq,,Water Tank 6 crossed Hi threshold +water_06_tx_alm,hrtankbattery,water_06_tx_alm,5,eq,1.0,none,eq,,Water Tank 6 transmission error +oil_01_hihi_alm,hrtankbattery,oil_01_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 1 crossed HiHi threshold +oil_01_hi_alm,hrtankbattery,oil_01_hi_alm,5,eq,1.0,none,eq,,Oil Tank 1 crossed Hi threshold +oil_01_tx_alm,hrtankbattery,oil_01_tx_alm,5,eq,1.0,none,eq,,Oil Tank 1 transmission error +oil_02_hihi_alm,hrtankbattery,oil_02_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 2 crossed HiHi threshold +oil_02_hi_alm,hrtankbattery,oil_02_hi_alm,5,eq,1.0,none,eq,,Oil Tank 2 crossed Hi threshold +oil_02_tx_alm,hrtankbattery,oil_02_tx_alm,5,eq,1.0,none,eq,,Oil Tank 2 transmission error +oil_03_hihi_alm,hrtankbattery,oil_03_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 3 crossed HiHi threshold +oil_03_hi_alm,hrtankbattery,oil_03_hi_alm,5,eq,1.0,none,eq,,Oil Tank 3 crossed Hi threshold +oil_03_tx_alm,hrtankbattery,oil_03_tx_alm,5,eq,1.0,none,eq,,Oil Tank 3 transmission error +oil_04_hihi_alm,hrtankbattery,oil_04_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 4 crossed HiHi threshold +oil_04_hi_alm,hrtankbattery,oil_04_hi_alm,5,eq,1.0,none,eq,,Oil Tank 4 crossed Hi threshold +oil_04_tx_alm,hrtankbattery,oil_04_tx_alm,5,eq,1.0,none,eq,,Oil Tank 4 transmission error +oil_05_hihi_alm,hrtankbattery,oil_05_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 5 crossed HiHi threshold +oil_05_hi_alm,hrtankbattery,oil_05_hi_alm,5,eq,1.0,none,eq,,Oil Tank 5 crossed Hi threshold +oil_05_tx_alm,hrtankbattery,oil_05_tx_alm,5,eq,1.0,none,eq,,Oil Tank 5 transmission error +oil_06_hihi_alm,hrtankbattery,oil_06_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 6 crossed HiHi threshold +oil_06_hi_alm,hrtankbattery,oil_06_hi_alm,5,eq,1.0,none,eq,,Oil Tank 6 crossed Hi threshold +oil_06_tx_alm,hrtankbattery,oil_06_tx_alm,5,eq,1.0,none,eq,,Oil Tank 6 transmission error +transfer_01_alm,hrtankbattery,transfer_01_alm,5,eq,1.0,none,eq,,Transfer 1 Faulted +transfer_01_discharge_hihi_alm,hrtankbattery,transfer_01_discharge_hihi_alm,5,eq,1.0,none,eq,,Transfer 1 Discharge crossed HiHi threshold +transfer_01_discharge_lolo_alm,hrtankbattery,transfer_01_discharge_lolo_alm,5,eq,1.0,none,eq,,Transfer 1 Discharge crossed LoLo threshold +transfer_01_flow_rate_hihi_alm,hrtankbattery,transfer_01_flow_rate_hihi_alm,5,eq,1.0,none,eq,,Transfer 1 Flow Rate crossed HiHi threshold +transfer_01_flow_rate_lolo_alm,hrtankbattery,transfer_01_flow_rate_lolo_alm,5,eq,1.0,none,eq,,Transfer 1 Flow Rate crossed LoLo threshold +transfer_02_alm,hrtankbattery,transfer_02_alm,5,eq,1.0,none,eq,,Transfer 2 Faulted +transfer_02_discharge_hihi_alm,hrtankbattery,transfer_02_discharge_hihi_alm,5,eq,1.0,none,eq,,Transfer 2 Discharge crossed HiHi threshold +transfer_02_discharge_lolo_alm,hrtankbattery,transfer_02_discharge_lolo_alm,5,eq,1.0,none,eq,,Transfer 2 Discharge crossed LoLo threshold +transfer_02_flow_rate_hihi_alm,hrtankbattery,transfer_02_flow_rate_hihi_alm,5,eq,1.0,none,eq,,Transfer 2 Flow Rate crossed HiHi threshold +transfer_02_flow_rate_lolo_alm,hrtankbattery,transfer_02_flow_rate_lolo_alm,5,eq,1.0,none,eq,,Transfer 2 Flow Rate crossed LoLo threshold +lact_01_alm,hrtankbattery,lact_01_alm,5,eq,1.0,none,eq,,LACT 1 Meter Failure +lact_01_oil_shutdown,hrtankbattery,lact_01_oil_shutdown,5,eq,1.0,none,eq,,LACT 1 Bad Oil +lact_02_alm,hrtankbattery,lact_02_alm,5,eq,1.0,none,eq,,LACT 2 Meter Failure +lact_02_oil_shutdown,hrtankbattery,lact_02_oil_shutdown,5,eq,1.0,none,eq,,LACT 2 Bad Oil +containment_high_alm,hrtankbattery,containment_high_alm,5,eq,1.0,none,eq,,Containment Level has crossed the Hi threshold. \ No newline at end of file diff --git a/Pub_Sub/hrtankbattery/thingsboard/hrbattery_alarm_8_7.csv b/Pub_Sub/hrtankbattery/thingsboard/hrbattery_alarm_8_7.csv new file mode 100644 index 0000000..e3a5781 --- /dev/null +++ b/Pub_Sub/hrtankbattery/thingsboard/hrbattery_alarm_8_7.csv @@ -0,0 +1,74 @@ +AlarmName,ControllerName,MeasuringPointName,AlarmLevel,Condition1,Operand1,CombineMethod,Condition2,Operand2,AlarmContent,AlarmTag +plc_io_fault_alm,hrtankbattery,plc_io_fault_alm,5,eq,1.0,none,eq,,PLC IO has faulted,default +plc_fault,hrtankbattery,plc_fault,5,eq,1.0,none,eq,,PLC has faulted,default +analog_01_alm,hrtankbattery,analog_01_alm,5,eq,1.0,none,eq,,Analog Module 1 has faulted,default +analog_02_alm,hrtankbattery,analog_02_alm,5,eq,1.0,none,eq,,Analog Module 2 has faulted,default +analog_03_alm,hrtankbattery,analog_03_alm,5,eq,1.0,none,eq,,Analog Module 3 has faulted,default +analog_04_alm,hrtankbattery,analog_04_alm,5,eq,1.0,none,eq,,Analog Module 4 has faulted,default +analog_05_alm,hrtankbattery,analog_05_alm,5,eq,1.0,none,eq,,Analog Module 5 has faulted,default +analog_06_alm,hrtankbattery,analog_06_alm,5,eq,1.0,none,eq,,Analog Module 6 has faulted,default +ac_power_alm,hrtankbattery,ac_power_alm,5,eq,1.0,none,eq,,AC Power Fault,default +ups_alm,hrtankbattery,ups_alm,5,eq,1.0,none,eq,,UPS Fault,default +dc_power_alm,hrtankbattery,dc_power_alm,5,eq,1.0,none,eq,,DC Power Fault,default +three_phase_pwr_alm,hrtankbattery,three_phase_pwr_alm,5,eq,1.0,none,eq,,Three Phase Power Fault,default +water_01_hihi_alm,hrtankbattery,water_01_hihi_alm,5,eq,1.0,none,eq,,Water Tank 1 crossed HiHi threshold,default +water_01_hi_alm,hrtankbattery,water_01_hi_alm,5,eq,1.0,none,eq,,Water Tank 1 crossed Hi threshold,default +water_01_tx_alm,hrtankbattery,water_01_tx_alm,5,eq,1.0,none,eq,,Water Tank 1 transmission error,default +water_02_hihi_alm,hrtankbattery,water_02_hihi_alm,5,eq,1.0,none,eq,,Water Tank 2 crossed HiHi threshold,default +water_02_hi_alm,hrtankbattery,water_02_hi_alm,5,eq,1.0,none,eq,,Water Tank 2 crossed Hi threshold,default +water_02_tx_alm,hrtankbattery,water_02_tx_alm,5,eq,1.0,none,eq,,Water Tank 2 transmission error,default +water_03_hihi_alm,hrtankbattery,water_03_hihi_alm,5,eq,1.0,none,eq,,Water Tank 3 crossed HiHi threshold,default +water_03_hi_alm,hrtankbattery,water_03_hi_alm,5,eq,1.0,none,eq,,Water Tank 3 crossed Hi threshold,default +water_03_tx_alm,hrtankbattery,water_03_tx_alm,5,eq,1.0,none,eq,,Water Tank 3 transmission error,default +water_04_hihi_alm,hrtankbattery,water_04_hihi_alm,5,eq,1.0,none,eq,,Water Tank 4 crossed HiHi threshold,default +water_04_hi_alm,hrtankbattery,water_04_hi_alm,5,eq,1.0,none,eq,,Water Tank 4 crossed Hi threshold,default +water_04_tx_alm,hrtankbattery,water_04_tx_alm,5,eq,1.0,none,eq,,Water Tank 4 transmission error,default +water_05_hihi_alm,hrtankbattery,water_05_hihi_alm,5,eq,1.0,none,eq,,Water Tank 5 crossed HiHi threshold,default +water_05_hi_alm,hrtankbattery,water_05_hi_alm,5,eq,1.0,none,eq,,Water Tank 5 crossed Hi threshold,default +water_05_tx_alm,hrtankbattery,water_05_tx_alm,5,eq,1.0,none,eq,,Water Tank 5 transmission error,default +water_06_hihi_alm,hrtankbattery,water_06_hihi_alm,5,eq,1.0,none,eq,,Water Tank 6 crossed HiHi threshold,default +water_06_hi_alm,hrtankbattery,water_06_hi_alm,5,eq,1.0,none,eq,,Water Tank 6 crossed Hi threshold,default +water_06_tx_alm,hrtankbattery,water_06_tx_alm,5,eq,1.0,none,eq,,Water Tank 6 transmission error,default +water_07_hihi_alm,hrtankbattery,water_07_hihi_alm,5,eq,1.0,none,eq,,Water Tank 7 crossed HiHi threshold,default +water_07_hi_alm,hrtankbattery,water_07_hi_alm,5,eq,1.0,none,eq,,Water Tank 7 crossed Hi threshold,default +water_07_tx_alm,hrtankbattery,water_07_tx_alm,5,eq,1.0,none,eq,,Water Tank 7 transmission error,default +water_08_hihi_alm,hrtankbattery,water_08_hihi_alm,5,eq,1.0,none,eq,,Water Tank 8 crossed HiHi threshold,default +water_08_hi_alm,hrtankbattery,water_08_hi_alm,5,eq,1.0,none,eq,,Water Tank 8 crossed Hi threshold,default +water_08_tx_alm,hrtankbattery,water_08_tx_alm,5,eq,1.0,none,eq,,Water Tank 8 transmission error,default +oil_01_hihi_alm,hrtankbattery,oil_01_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 1 crossed HiHi threshold,default +oil_01_hi_alm,hrtankbattery,oil_01_hi_alm,5,eq,1.0,none,eq,,Oil Tank 1 crossed Hi threshold,default +oil_01_tx_alm,hrtankbattery,oil_01_tx_alm,5,eq,1.0,none,eq,,Oil Tank 1 transmission error,default +oil_02_hihi_alm,hrtankbattery,oil_02_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 2 crossed HiHi threshold,default +oil_02_hi_alm,hrtankbattery,oil_02_hi_alm,5,eq,1.0,none,eq,,Oil Tank 2 crossed Hi threshold,default +oil_02_tx_alm,hrtankbattery,oil_02_tx_alm,5,eq,1.0,none,eq,,Oil Tank 2 transmission error,default +oil_03_hihi_alm,hrtankbattery,oil_03_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 3 crossed HiHi threshold,default +oil_03_hi_alm,hrtankbattery,oil_03_hi_alm,5,eq,1.0,none,eq,,Oil Tank 3 crossed Hi threshold,default +oil_03_tx_alm,hrtankbattery,oil_03_tx_alm,5,eq,1.0,none,eq,,Oil Tank 3 transmission error,default +oil_04_hihi_alm,hrtankbattery,oil_04_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 4 crossed HiHi threshold,default +oil_04_hi_alm,hrtankbattery,oil_04_hi_alm,5,eq,1.0,none,eq,,Oil Tank 4 crossed Hi threshold,default +oil_04_tx_alm,hrtankbattery,oil_04_tx_alm,5,eq,1.0,none,eq,,Oil Tank 4 transmission error,default +oil_05_hihi_alm,hrtankbattery,oil_05_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 5 crossed HiHi threshold,default +oil_05_hi_alm,hrtankbattery,oil_05_hi_alm,5,eq,1.0,none,eq,,Oil Tank 5 crossed Hi threshold,default +oil_05_tx_alm,hrtankbattery,oil_05_tx_alm,5,eq,1.0,none,eq,,Oil Tank 5 transmission error,default +oil_06_hihi_alm,hrtankbattery,oil_06_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 6 crossed HiHi threshold,default +oil_06_hi_alm,hrtankbattery,oil_06_hi_alm,5,eq,1.0,none,eq,,Oil Tank 6 crossed Hi threshold,default +oil_06_tx_alm,hrtankbattery,oil_06_tx_alm,5,eq,1.0,none,eq,,Oil Tank 6 transmission error,default +oil_07_hihi_alm,hrtankbattery,oil_07_hihi_alm,5,eq,1.0,none,eq,,Oil Tank 7 crossed HiHi threshold,default +oil_07_hi_alm,hrtankbattery,oil_07_hi_alm,5,eq,1.0,none,eq,,Oil Tank 7 crossed Hi threshold,default +oil_07_tx_alm,hrtankbattery,oil_07_tx_alm,5,eq,1.0,none,eq,,Oil Tank 7 transmission error,default +transfer_01_alm,hrtankbattery,transfer_01_alm,5,eq,1.0,none,eq,,Transfer 1 Faulted,default +transfer_01_discharge_hihi_alm,hrtankbattery,transfer_01_discharge_hihi_alm,5,eq,1.0,none,eq,,Transfer 1 Discharge crossed HiHi threshold,default +transfer_01_discharge_lolo_alm,hrtankbattery,transfer_01_discharge_lolo_alm,5,eq,1.0,none,eq,,Transfer 1 Discharge crossed LoLo threshold,default +transfer_01_flow_rate_hihi_alm,hrtankbattery,transfer_01_flow_rate_hihi_alm,5,eq,1.0,none,eq,,Transfer 1 Flow Rate crossed HiHi threshold,default +transfer_01_flow_rate_lolo_alm,hrtankbattery,transfer_01_flow_rate_lolo_alm,5,eq,1.0,none,eq,,Transfer 1 Flow Rate crossed LoLo threshold,default +transfer_02_alm,hrtankbattery,transfer_02_alm,5,eq,1.0,none,eq,,Transfer 2 Faulted,default +transfer_02_discharge_hihi_alm,hrtankbattery,transfer_02_discharge_hihi_alm,5,eq,1.0,none,eq,,Transfer 2 Discharge crossed HiHi threshold,default +transfer_02_discharge_lolo_alm,hrtankbattery,transfer_02_discharge_lolo_alm,5,eq,1.0,none,eq,,Transfer 2 Discharge crossed LoLo threshold,default +transfer_02_flow_rate_hihi_alm,hrtankbattery,transfer_02_flow_rate_hihi_alm,5,eq,1.0,none,eq,,Transfer 2 Flow Rate crossed HiHi threshold,default +transfer_02_flow_rate_lolo_alm,hrtankbattery,transfer_02_flow_rate_lolo_alm,5,eq,1.0,none,eq,,Transfer 2 Flow Rate crossed LoLo threshold,default +lact_01_alm,hrtankbattery,lact_01_alm,5,eq,1.0,none,eq,,LACT 1 Meter Failure,default +lact_01_oil_shutdown,hrtankbattery,lact_01_oil_shutdown,5,eq,1.0,none,eq,,LACT 1 Bad Oil,default +lact_02_alm,hrtankbattery,lact_02_alm,5,eq,1.0,none,eq,,LACT 2 Meter Failure,default +lact_02_oil_shutdown,hrtankbattery,lact_02_oil_shutdown,5,eq,1.0,none,eq,,LACT 2 Bad Oil,default +containment_high_alm,hrtankbattery,containment_high_alm,5,eq,1.0,none,eq,,Containment Level has crossed the Hi threshold.,default +h2s_alm,hrtankbattery,h2s_alm,5,eq,1.0,none,eq,,H2S Detected,default \ No newline at end of file diff --git a/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery.csv b/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery.csv new file mode 100644 index 0000000..b21c131 --- /dev/null +++ b/Pub_Sub/hrtankbattery/thingsboard/hrtankbattery.csv @@ -0,0 +1,132 @@ +MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit +plc_io_fault_alm,hrtankbattery,default,periodic,BIT,IO_Fault_Alarm,2,1,ro,,,none,,,,,,,, +plc_fault,hrtankbattery,default,periodic,BIT,PLC_FAULT,2,1,ro,,,none,,,,,,,, +analog_01_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_01,2,1,ro,,,none,,,,,,,, +analog_02_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_02,2,1,ro,,,none,,,,,,,, +analog_03_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_03,2,1,ro,,,none,,,,,,,, +analog_04_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_04,2,1,ro,,,none,,,,,,,, +analog_05_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_05,2,1,ro,,,none,,,,,,,, +analog_06_alm,hrtankbattery,default,periodic,BIT,Fault_Analog_Mod_06,2,1,ro,,,none,,,,,,,, +ac_power_alm,hrtankbattery,default,periodic,BIT,Alm_AC_Pwr.Alm_TgtDisagree,2,1,ro,,,none,,,,,,,, +ups_alm,hrtankbattery,default,periodic,BIT,Alm_UPS.Alm_TgtDisagree,2,1,ro,,,none,,,,,,,, +dc_power_alm,hrtankbattery,default,periodic,BIT,DC_Power_OK.Alm_TgtDisagree,2,1,ro,,,none,,,,,,,, +three_phase_pwr_alm,hrtankbattery,default,periodic,BIT,Three_Phase_Power_Alarm.Alm_TgtDisagree,2,1,ro,,,none,,,,,,,, +water_run_tank,hrtankbattery,default,periodic,DINT,WT_Selector,2,1,ro,,,none,,,,,,,, +water_01_level,hrtankbattery,default,periodic,FLOAT,WT_1.Val,2,1,ro,,,none,,,,,,,, +water_01_hihi_alm,hrtankbattery,default,periodic,BIT,WT_1.Alm_HiHi,2,1,ro,,,none,,,,,,,, +water_01_hi_alm,hrtankbattery,default,periodic,BIT,WT_1.Alm_Hi,2,1,ro,,,none,,,,,,,, +water_01_tx_alm,hrtankbattery,default,periodic,BIT,WT_1.Alm_Fail,2,1,ro,,,none,,,,,,,, +water_01_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_1.PSet_HiHiLim,2,1,ro,,,none,,,,,,,, +water_01_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_1.PSet_HiLim,2,1,ro,,,none,,,,,,,, +water_01_max_height,hrtankbattery,default,periodic,FLOAT,WT_1.Cfg_PVEUMax,2,1,ro,,,none,,,,,,,, +water_02_level,hrtankbattery,default,periodic,FLOAT,WT_2.Val,2,1,ro,,,none,,,,,,,, +water_02_hihi_alm,hrtankbattery,default,periodic,BIT,WT_2.Alm_HiHi,2,1,ro,,,none,,,,,,,, +water_02_hi_alm,hrtankbattery,default,periodic,BIT,WT_2.Alm_Hi,2,1,ro,,,none,,,,,,,, +water_02_tx_alm,hrtankbattery,default,periodic,BIT,WT_2.Alm_Fail,2,1,ro,,,none,,,,,,,, +water_02_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_2.PSet_HiHiLim,2,1,ro,,,none,,,,,,,, +water_02_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_2.PSet_HiLim,2,1,ro,,,none,,,,,,,, +water_02_max_height,hrtankbattery,default,periodic,FLOAT,WT_2.Cfg_PVEUMax,2,1,ro,,,none,,,,,,,, +water_03_level,hrtankbattery,default,periodic,FLOAT,WT_3.Val,2,1,ro,,,none,,,,,,,, +water_03_hihi_alm,hrtankbattery,default,periodic,BIT,WT_3.Alm_HiHi,2,1,ro,,,none,,,,,,,, +water_03_hi_alm,hrtankbattery,default,periodic,BIT,WT_3.Alm_Hi,2,1,ro,,,none,,,,,,,, +water_03_tx_alm,hrtankbattery,default,periodic,BIT,WT_3.Alm_Fail,2,1,ro,,,none,,,,,,,, +water_03_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_3.PSet_HiHiLim,2,1,ro,,,none,,,,,,,, +water_03_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_3.PSet_HiLim,2,1,ro,,,none,,,,,,,, +water_03_max_height,hrtankbattery,default,periodic,FLOAT,WT_3.Cfg_PVEUMax,2,1,ro,,,none,,,,,,,, +water_04_level,hrtankbattery,default,periodic,FLOAT,WT_4.Val,2,1,ro,,,none,,,,,,,, +water_04_hihi_alm,hrtankbattery,default,periodic,BIT,WT_4.Alm_HiHi,2,1,ro,,,none,,,,,,,, +water_04_hi_alm,hrtankbattery,default,periodic,BIT,WT_4.Alm_Hi,2,1,ro,,,none,,,,,,,, +water_04_tx_alm,hrtankbattery,default,periodic,BIT,WT_4.Alm_Fail,2,1,ro,,,none,,,,,,,, +water_04_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_4.PSet_HiHiLim,2,1,ro,,,none,,,,,,,, +water_04_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_4.PSet_HiLim,2,1,ro,,,none,,,,,,,, +water_04_max_height,hrtankbattery,default,periodic,FLOAT,WT_4.Cfg_PVEUMax,2,1,ro,,,none,,,,,,,, +water_05_level,hrtankbattery,default,periodic,FLOAT,WT_5.Val,2,1,ro,,,none,,,,,,,, +water_05_hihi_alm,hrtankbattery,default,periodic,BIT,WT_5.Alm_HiHi,2,1,ro,,,none,,,,,,,, +water_05_hi_alm,hrtankbattery,default,periodic,BIT,WT_5.Alm_Hi,2,1,ro,,,none,,,,,,,, +water_05_tx_alm,hrtankbattery,default,periodic,BIT,WT_5.Alm_Fail,2,1,ro,,,none,,,,,,,, +water_05_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_5.PSet_HiHiLim,2,1,ro,,,none,,,,,,,, +water_05_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_5.PSet_HiLim,2,1,ro,,,none,,,,,,,, +water_05_max_height,hrtankbattery,default,periodic,FLOAT,WT_5.Cfg_PVEUMax,2,1,ro,,,none,,,,,,,, +water_06_level,hrtankbattery,default,periodic,FLOAT,WT_6.Val,2,1,ro,,,none,,,,,,,, +water_06_hihi_alm,hrtankbattery,default,periodic,BIT,WT_6.Alm_HiHi,2,1,ro,,,none,,,,,,,, +water_06_hi_alm,hrtankbattery,default,periodic,BIT,WT_6.Alm_Hi,2,1,ro,,,none,,,,,,,, +water_06_tx_alm,hrtankbattery,default,periodic,BIT,WT_6.Alm_Fail,2,1,ro,,,none,,,,,,,, +water_06_hihi_spt,hrtankbattery,default,periodic,FLOAT,WT_6.PSet_HiHiLim,2,1,ro,,,none,,,,,,,, +water_06_hi_spt,hrtankbattery,default,periodic,FLOAT,WT_6.PSet_HiLim,2,1,ro,,,none,,,,,,,, +water_06_max_height,hrtankbattery,default,periodic,FLOAT,WT_6.Cfg_PVEUMax,2,1,ro,,,none,,,,,,,, +oil_run_tank,hrtankbattery,default,periodic,DINT,OT_Selector,2,1,ro,,,none,,,,,,,, +oil_01_level,hrtankbattery,default,periodic,FLOAT,OT_1.Val,2,1,ro,,,none,,,,,,,, +oil_01_hihi_alm,hrtankbattery,default,periodic,BIT,OT_1.Alm_HiHi,2,1,ro,,,none,,,,,,,, +oil_01_hi_alm,hrtankbattery,default,periodic,BIT,OT_1.Alm_Hi,2,1,ro,,,none,,,,,,,, +oil_01_tx_alm,hrtankbattery,default,periodic,BIT,OT_1.Alm_Fail,2,1,ro,,,none,,,,,,,, +oil_01_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_1.PSet_HiHiLim,2,1,ro,,,none,,,,,,,, +oil_01_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_1.PSet_HiLim,2,1,ro,,,none,,,,,,,, +oil_01_max_height,hrtankbattery,default,periodic,FLOAT,OT_1.Cfg_PVEUMax,2,1,ro,,,none,,,,,,,, +oil_02_level,hrtankbattery,default,periodic,FLOAT,OT_2.Val,2,1,ro,,,none,,,,,,,, +oil_02_hihi_alm,hrtankbattery,default,periodic,BIT,OT_2.Alm_HiHi,2,1,ro,,,none,,,,,,,, +oil_02_hi_alm,hrtankbattery,default,periodic,BIT,OT_2.Alm_Hi,2,1,ro,,,none,,,,,,,, +oil_02_tx_alm,hrtankbattery,default,periodic,BIT,OT_2.Alm_Fail,2,1,ro,,,none,,,,,,,, +oil_02_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_2.PSet_HiHiLim,2,1,ro,,,none,,,,,,,, +oil_02_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_2.PSet_HiLim,2,1,ro,,,none,,,,,,,, +oil_02_max_height,hrtankbattery,default,periodic,FLOAT,OT_2.Cfg_PVEUMax,2,1,ro,,,none,,,,,,,, +oil_03_level,hrtankbattery,default,periodic,FLOAT,OT_3.Val,2,1,ro,,,none,,,,,,,, +oil_03_hihi_alm,hrtankbattery,default,periodic,BIT,OT_3.Alm_HiHi,2,1,ro,,,none,,,,,,,, +oil_03_hi_alm,hrtankbattery,default,periodic,BIT,OT_3.Alm_Hi,2,1,ro,,,none,,,,,,,, +oil_03_tx_alm,hrtankbattery,default,periodic,BIT,OT_3.Alm_Fail,2,1,ro,,,none,,,,,,,, +oil_03_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_3.PSet_HiHiLim,2,1,ro,,,none,,,,,,,, +oil_03_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_3.PSet_HiLim,2,1,ro,,,none,,,,,,,, +oil_03_max_height,hrtankbattery,default,periodic,FLOAT,OT_3.Cfg_PVEUMax,2,1,ro,,,none,,,,,,,, +oil_04_level,hrtankbattery,default,periodic,FLOAT,OT_4.Val,2,1,ro,,,none,,,,,,,, +oil_04_hihi_alm,hrtankbattery,default,periodic,BIT,OT_4.Alm_HiHi,2,1,ro,,,none,,,,,,,, +oil_04_hi_alm,hrtankbattery,default,periodic,BIT,OT_4.Alm_Hi,2,1,ro,,,none,,,,,,,, +oil_04_tx_alm,hrtankbattery,default,periodic,BIT,OT_4.Alm_Fail,2,1,ro,,,none,,,,,,,, +oil_04_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_4.PSet_HiHiLim,2,1,ro,,,none,,,,,,,, +oil_04_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_4.PSet_HiLim,2,1,ro,,,none,,,,,,,, +oil_04_max_height,hrtankbattery,default,periodic,FLOAT,OT_4.Cfg_PVEUMax,2,1,ro,,,none,,,,,,,, +oil_05_level,hrtankbattery,default,periodic,FLOAT,OT_5.Val,2,1,ro,,,none,,,,,,,, +oil_05_hihi_alm,hrtankbattery,default,periodic,BIT,OT_5.Alm_HiHi,2,1,ro,,,none,,,,,,,, +oil_05_hi_alm,hrtankbattery,default,periodic,BIT,OT_5.Alm_Hi,2,1,ro,,,none,,,,,,,, +oil_05_tx_alm,hrtankbattery,default,periodic,BIT,OT_5.Alm_Fail,2,1,ro,,,none,,,,,,,, +oil_05_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_5.PSet_HiHiLim,2,1,ro,,,none,,,,,,,, +oil_05_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_5.PSet_HiLim,2,1,ro,,,none,,,,,,,, +oil_05_max_height,hrtankbattery,default,periodic,FLOAT,OT_5.Cfg_PVEUMax,2,1,ro,,,none,,,,,,,, +oil_06_level,hrtankbattery,default,periodic,FLOAT,OT_6.Val,2,1,ro,,,none,,,,,,,, +oil_06_hihi_alm,hrtankbattery,default,periodic,BIT,OT_6.Alm_HiHi,2,1,ro,,,none,,,,,,,, +oil_06_hi_alm,hrtankbattery,default,periodic,BIT,OT_6.Alm_Hi,2,1,ro,,,none,,,,,,,, +oil_06_tx_alm,hrtankbattery,default,periodic,BIT,OT_6.Alm_Fail,2,1,ro,,,none,,,,,,,, +oil_06_hihi_spt,hrtankbattery,default,periodic,FLOAT,OT_6.PSet_HiHiLim,2,1,ro,,,none,,,,,,,, +oil_06_hi_spt,hrtankbattery,default,periodic,FLOAT,OT_6.PSet_HiLim,2,1,ro,,,none,,,,,,,, +oil_06_max_height,hrtankbattery,default,periodic,FLOAT,OT_6.Cfg_PVEUMax,2,1,ro,,,none,,,,,,,, +transfer_01_sts,hrtankbattery,default,periodic,BIT,XFER_PUMP_Motor_01.Sts_Running,2,1,ro,,,none,,,,,,,, +transfer_01_alm,hrtankbattery,default,periodic,BIT,XFER_PUMP_Motor_01.Alm_FailToStart,2,1,ro,,,none,,,,,,,, +transfer_01_discharge,hrtankbattery,default,periodic,FLOAT,XferPump_01_Dis_PSI.Val,2,1,ro,,,none,,,,,,,, +transfer_01_discharge_hihi_alm,hrtankbattery,default,periodic,BIT,XferPump_01_Dis_PSI.Alm_HiHi,2,1,ro,,,none,,,,,,,, +transfer_01_discharge_lolo_alm,hrtankbattery,default,periodic,BIT,XferPump_01_Dis_PSI.Alm_LoLo,2,1,ro,,,none,,,,,,,, +transfer_01_flow_rate,hrtankbattery,default,periodic,FLOAT,XferPump_01_FlowRate.Val,2,1,ro,,,none,,,,,,,, +transfer_01_flow_rate_hihi_alm,hrtankbattery,default,periodic,BIT,XferPump_01_FlowRate.Alm_HiHi,2,1,ro,,,none,,,,,,,, +transfer_01_flow_rate_lolo_alm,hrtankbattery,default,periodic,BIT,XferPump_01_FlowRate.Alm_LoLo,2,1,ro,,,none,,,,,,,, +transfer_02_sts,hrtankbattery,default,periodic,BIT,XFER_PUMP_Motor_02.Sts_Running,2,1,ro,,,none,,,,,,,, +transfer_02_alm,hrtankbattery,default,periodic,BIT,XFER_PUMP_Motor_02.Alm_FailToStart,2,1,ro,,,none,,,,,,,, +transfer_02_discharge,hrtankbattery,default,periodic,FLOAT,XferPump_02_Dis_PSI.Val,2,1,ro,,,none,,,,,,,, +transfer_02_discharge_hihi_alm,hrtankbattery,default,periodic,BIT,XferPump_02_Dis_PSI.Alm_HiHi,2,1,ro,,,none,,,,,,,, +transfer_02_discharge_lolo_alm,hrtankbattery,default,periodic,BIT,XferPump_02_Dis_PSI.Alm_LoLo,2,1,ro,,,none,,,,,,,, +transfer_02_flow_rate,hrtankbattery,default,periodic,FLOAT,XferPump_02_FlowRate.Val,2,1,ro,,,none,,,,,,,, +transfer_02_flow_rate_hihi_alm,hrtankbattery,default,periodic,BIT,XferPump_02_FlowRate.Alm_HiHi,2,1,ro,,,none,,,,,,,, +transfer_02_flow_rate_lolo_alm,hrtankbattery,default,periodic,BIT,XferPump_02_FlowRate.Alm_LoLo,2,1,ro,,,none,,,,,,,, +lact_01_permissive,hrtankbattery,default,periodic,BIT,LACT_01_Permissive,2,1,ro,,,none,,,,,,,, +lact_01_sts,hrtankbattery,default,periodic,BIT,LACT_01_Run_Status,2,1,ro,,,none,,,,,,,, +lact_01_alm,hrtankbattery,default,periodic,BIT,LACT_01_Failure,2,1,ro,,,none,,,,,,,, +lact_01_oil_shutdown,hrtankbattery,default,periodic,BIT,LACT_01_Bad_Oil_Shutdown,2,1,ro,,,none,,,,,,,, +lact_01_flow_rate,hrtankbattery,default,periodic,FLOAT,Lact_01_Realtime_Flow_Rate,2,1,ro,,,none,,,,,,,, +lact_01_bs_w,hrtankbattery,default,periodic,FLOAT,Lact_01_BS_and_W_Reading,2,1,ro,,,none,,,,,,,, +lact_01_daily_volume,hrtankbattery,default,periodic,FLOAT,Lact_01_Current_Daily_Ind_Volume_Total,2,1,ro,,,none,,,,,,,, +lact_01_prev_day,hrtankbattery,default,periodic,FLOAT,Lact_01_History.Previous_Day_1,2,1,ro,,,none,,,,,,,, +lact_02_permissive,hrtankbattery,default,periodic,BIT,LACT_02_Permissive,2,1,ro,,,none,,,,,,,, +lact_02_sts,hrtankbattery,default,periodic,BIT,LACT_02_Run_Status,2,1,ro,,,none,,,,,,,, +lact_02_alm,hrtankbattery,default,periodic,BIT,LACT_02_Failure,2,1,ro,,,none,,,,,,,, +lact_02_oil_shutdown,hrtankbattery,default,periodic,BIT,LACT_02_Bad_Oil_Shutdown,2,1,ro,,,none,,,,,,,, +lact_02_flow_rate,hrtankbattery,default,periodic,FLOAT,Lact_02_Realtime_Flow_Rate,2,1,ro,,,none,,,,,,,, +lact_02_bs_w,hrtankbattery,default,periodic,FLOAT,Lact_02_BS_and_W_Reading,2,1,ro,,,none,,,,,,,, +lact_02_daily_volume,hrtankbattery,default,periodic,FLOAT,Lact_02_Current_Daily_Ind_Volume_Total,2,1,ro,,,none,,,,,,,, +lact_02_prev_day,hrtankbattery,default,periodic,FLOAT,Lact_02_History.Previous_Day_1,2,1,ro,,,none,,,,,,,, +containment_high_alm,hrtankbattery,default,periodic,BIT,Contain_Hi_Level.Alm_TgtDisagree,2,1,ro,,,none,,,,,,,, diff --git a/Pub_Sub/tankalarms/thingsboard/v1/tankalarmAlarms.csv b/Pub_Sub/tankalarms/thingsboard/v1/tankalarmAlarms.csv new file mode 100644 index 0000000..bda0d8b --- /dev/null +++ b/Pub_Sub/tankalarms/thingsboard/v1/tankalarmAlarms.csv @@ -0,0 +1,9 @@ +AlarmName,ControllerName,MeasuringPointName,AlarmLevel,Condition1,Operand1,CombineMethod,Condition2,Operand2,AlarmContent +water_hihi_alm,tankalarms,water_hihi_alm,5,eq,1.0,none,eq,,Water Tank HiHi +water_hi_alm,tankalarms,water_hi_alm,5,eq,1.0,none,eq,,Water Tank Hi +water_batt_lolo_alm,tankalarms,water_batt_lolo_alm,5,eq,1.0,none,eq,,Water Tank Battery LoLo +water_comm_fail_alm,tankalarms,water_comm_fail_alm,5,eq,1.0,none,eq,,Water Tank Comms Fail +oil_hihi_alm,tankalarms,oil_hihi_alm,5,eq,1.0,none,eq,,Oil Tank HiHi +oil_hi_alm,tankalarms,oil_hi_alm,5,eq,1.0,none,eq,,Oil Tank Hi +oil_batt_lolo_alm,tankalarms,oil_batt_lolo_alm,5,eq,1.0,none,eq,,Oil Tank Battery LoLo +oil_comm_fail_alm,tankalarms,oil_comm_fail_alm,5,eq,1.0,none,eq,,Oil Tank Comms Fail \ No newline at end of file diff --git a/Pub_Sub/tankalarms/thingsboard/v1/tankalarms.csv b/Pub_Sub/tankalarms/thingsboard/v1/tankalarms.csv new file mode 100644 index 0000000..d518115 --- /dev/null +++ b/Pub_Sub/tankalarms/thingsboard/v1/tankalarms.csv @@ -0,0 +1,20 @@ +MeasuringPointName,ControllerName,GroupName,UploadType,DataType,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit +water_level,tankalarms,default,periodic,FLOAT,WaterTxLevel,2,1,ro,,,none,,,,,,,, +water_batt_volts,tankalarms,default,periodic,FLOAT,WaterTxBatVolts,2,1,ro,,,none,,,,,,,, +water_rssi,tankalarms,default,periodic,FLOAT,WaterTxRSSI,2,1,ro,,,none,,,,,,,, +water_hihi_spt,tankalarms,default,periodic,FLOAT,WaterTx_HHSP,2,1,rw,,,none,,,,,,,, +water_hi_spt,tankalarms,default,periodic,FLOAT,WaterTx_HSp,2,1,rw,,,none,,,,,,,, +water_hihi_alm,tankalarms,default,periodic,BIT,WaterTx_HHAlrm,2,1,ro,,,none,,,,,,,, +water_hi_alm,tankalarms,default,periodic,BIT,WaterTx_HAlrm,2,1,ro,,,none,,,,,,,, +water_batt_lolo_alm,tankalarms,default,periodic,BIT,WaterTxBatVolts_LLAlrm,2,1,ro,,,none,,,,,,,, +water_comm_fail_alm,tankalarms,default,periodic,BIT,WaterTx_RF_CommFail,2,1,ro,,,none,,,,,,,, +oil_level,tankalarms,default,periodic,FLOAT,OilTxLevel,2,1,ro,,,none,,,,,,,, +oil_batt_volts,tankalarms,default,periodic,FLOAT,OilTxBatVolts,2,1,ro,,,none,,,,,,,, +oil_rssi,tankalarms,default,periodic,FLOAT,OilTxRSSI,2,1,ro,,,none,,,,,,,, +oil_hihi_spt,tankalarms,default,periodic,FLOAT,OilTx_HHSP,2,1,rw,,,none,,,,,,,, +oil_hi_spt,tankalarms,default,periodic,FLOAT,OilTx_HSp,2,1,rw,,,none,,,,,,,, +oil_hihi_alm,tankalarms,default,periodic,BIT,OilTx_HHAlrm,2,1,ro,,,none,,,,,,,, +oil_hi_alm,tankalarms,default,periodic,BIT,OilTx_HAlrm,2,1,ro,,,none,,,,,,,, +oil_batt_lolo_alm,tankalarms,default,periodic,BIT,OilTxBatVolts_LLAlrm,2,1,ro,,,none,,,,,,,, +oil_comm_fail_alm,tankalarms,default,periodic,BIT,OilTx_RF_CommFail,2,1,ro,,,none,,,,,,,, +alarmreset,tankalarms,default,periodic,BIT,Reset,2,1,rw,,,none,,,,,,,, \ No newline at end of file diff --git a/Pub_Sub/tankalarms/thingsboard/v1/tankalarms_tb_v1.cfg b/Pub_Sub/tankalarms/thingsboard/v1/tankalarms_tb_v1.cfg new file mode 100644 index 0000000..8eca50f --- /dev/null +++ b/Pub_Sub/tankalarms/thingsboard/v1/tankalarms_tb_v1.cfg @@ -0,0 +1,724 @@ +{ + "controllers": [ + { + "protocol": "EtherNet/IP", + "name": "tankalarms", + "args": {}, + "samplePeriod": 10, + "expired": 10000, + "endpoint": "192.168.1.12:44818" + } + ], + "measures": [ + { + "name": "water_level", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WaterTxLevel", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_batt_volts", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WaterTxBatVolts", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_rssi", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WaterTxRSSI", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_hihi_spt", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WaterTx_HHSP", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_hi_spt", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "WaterTx_HSp", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_hihi_alm", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "WaterTx_HHAlrm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_hi_alm", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "WaterTx_HAlrm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_batt_lolo_alm", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "WaterTxBatVolts_LLAlrm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "water_comm_fail_alm", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "WaterTx_RF_CommFail", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_level", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OilTxLevel", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_batt_volts", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OilTxBatVolts", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_rssi", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OilTxRSSI", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_hihi_spt", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OilTx_HHSP", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_hi_spt", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "OilTx_HSp", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_hihi_alm", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "OilTx_HHAlrm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_hi_alm", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "OilTx_HAlrm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_batt_lolo_alm", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "OilTxBatVolts_LLAlrm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "oil_comm_fail_alm", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "OilTx_RF_CommFail", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + }, + { + "name": "alarmreset", + "ctrlName": "tankalarms", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Reset", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "" + } + ], + "alarmLables": [ + "default" + ], + "alarms": [ + { + "name": "water_hihi_alm", + "ctrlName": "tankalarms", + "measureName": "water_hihi_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Water Tank HiHi" + }, + { + "name": "water_hi_alm", + "ctrlName": "tankalarms", + "measureName": "water_hi_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Water Tank Hi" + }, + { + "name": "water_batt_lolo_alm", + "ctrlName": "tankalarms", + "measureName": "water_batt_lolo_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Water Tank Battery LoLo" + }, + { + "name": "water_comm_fail_alm", + "ctrlName": "tankalarms", + "measureName": "water_comm_fail_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Water Tank Comms Fail" + }, + { + "name": "oil_hihi_alm", + "ctrlName": "tankalarms", + "measureName": "oil_hihi_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Oil Tank HiHi" + }, + { + "name": "oil_hi_alm", + "ctrlName": "tankalarms", + "measureName": "oil_hi_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Oil Tank Hi" + }, + { + "name": "oil_batt_lolo_alm", + "ctrlName": "tankalarms", + "measureName": "oil_batt_lolo_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Oil Tank Battery LoLo" + }, + { + "name": "oil_comm_fail_alm", + "ctrlName": "tankalarms", + "measureName": "oil_comm_fail_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Oil Tank Comms Fail" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600 + } + ], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "DEBUG", + "coms": [ + { + "name": "rs232", + "baud": 9600, + "bits": 8, + "parityChk": "n", + "stopbits": 1 + }, + { + "name": "rs485", + "baud": 19200, + "bits": 8, + "parityChk": "n", + "stopbits": 1 + } + ] + }, + "clouds": [ + { + "cacheSize": 10000, + "enable": 1, + "name": "default", + "type": "Standard MQTT", + "args": { + "host": "hp.henrypump.cloud", + "port": 1883, + "clientId": "unknown", + "auth": 1, + "tls": 0, + "cleanSession": 0, + "mqttVersion": "v3.1.1", + "keepalive": 60, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "unknown", + "passwd": "unknown", + "authType": 1 + } + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "qos": 1, + "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__)", + "name": "sendData", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "cloudName": "default", + "groups": [ + "default" + ], + "msgType": 0 + }, + { + "name": "sendAlarms", + "trigger": "warning_event", + "topic": "v1/devices/me/telemetry", + "qos": 1, + "funcName": "sendAlarm", + "script": "# Enter your python code.\nimport json, time\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\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": [ + "water_hihi_alm", + "water_hi_alm", + "water_batt_lolo_alm", + "water_comm_fail_alm", + "oil_hihi_alm", + "oil_hi_alm", + "oil_batt_lolo_alm", + "oil_comm_fail_alm" + ], + "msgType": 0, + "cloudName": "default" + } + ], + "downloadFuncs": [ + { + "name": "Receive Command", + "topic": "v1/devices/me/rpc/request/+", + "qos": 1, + "funcName": "receiveCommand", + "payload_type": "JSON", + "script": "import json, time\nfrom quickfaas.measure import recall, write\nfrom quickfaas.remotebus import publish\nfrom common.Logger import logger\n\ndef sync():\n #get new values and send\n payload = {}\n topic = \"v1/devices/me/telemetry\"\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.debug(data)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n payload[measure[\"name\"]] = measure[\"value\"]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n publish(topic, json.dumps(payload), 1)\ndef writeplctag(value):\n #value in the form {\"measurement\": , \"value\": }\n try:\n #value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n #payload format: [{\"name\": \"advvfdipp\", \"measures\": [{\"name\": \"manualfrequencysetpoint\", \"value\": 49}]}]\n message = [{\"name\": \"tankalarms\", \"measures\":[{\"name\":value[\"measurement\"], \"value\": value[\"value\"]}]}]\n resp = write(message) \n logger.debug(\"RETURN FROM WRITE: {}\".format(resp))\n return True\n except Exception as e:\n logger.debug(e)\n return False\n \ndef receiveCommand(topic, payload):\n try:\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)\n command = p[\"method\"]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n } \n if command == \"setPLCTag\":\n try:\n result = commands[\"writeplctag\"](p[\"params\"])\n logger.debug(result)\n except Exception as e:\n logger.error(e)\n #logger.debug(command)\n ack(topic.split(\"/\")[-1])\n time.sleep(5)\n sync()\n except Exception as e:\n logger.debug(e)\n \n\ndef ack(msgid):\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n publish(\"v1/devices/me/rpc/response/\" + str(msgid), json.dumps({\"msg\": {\"time\": time.time()}, \"metadata\": \"\", \"msgType\": \"\"}), 1)\n\n\n", + "msgType": 0, + "cloudName": "default", + "trigger": "command_event" + } + ] + }, + "labels": [ + { + "key": "SN", + "value": "GF5022137006251" + }, + { + "key": "MAC", + "value": "00:18:05:1a:e5:36" + } + ], + "modbusSlave": { + "enable": 0, + "protocol": "Modbus-TCP", + "port": 502, + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "maxConnection": 5, + "mapping_table": [] + }, + "modbusRTUSlave": { + "enable": 0, + "protocol": "Modbus-RTU", + "coms": "rs485", + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "mapping_table": [] + }, + "iec104Server": { + "enable": 0, + "cotSize": 2, + "port": 2404, + "serverList": [ + { + "asduAddr": 1 + } + ], + "kValue": 12, + "wValue": 8, + "t0": 30, + "t1": 15, + "t2": 10, + "t3": 20, + "maximumLink": 5, + "timeSet": 1, + "byteOrder": "abcd", + "mapping_table": [] + }, + "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/getPLCData.ipynb b/getPLCData.ipynb new file mode 100644 index 0000000..9efd2bc --- /dev/null +++ b/getPLCData.ipynb @@ -0,0 +1,562 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "from pycomm3 import LogixDriver" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "attributes = [\n", + " \"EnableIn\",\n", + " \"EnableOut\",\n", + " \"Inp_PV\",\n", + " \"Inp_PVSrcQ\",\n", + " \"Inp_PVBad\",\n", + " \"Inp_PVUncertain\",\n", + " \"Inp_Sim\",\n", + " \"Inp_HiHiGate\",\n", + " \"Inp_HiGate\",\n", + " \"Inp_LoGate\",\n", + " \"Inp_LoLoGate\",\n", + " \"Inp_FailGate\",\n", + " \"Inp_Reset\",\n", + " \"Cfg_NoSubstPV\",\n", + " \"Cfg_SetTrack\",\n", + " \"Cfg_HasChanObj\",\n", + " \"Cfg_UseChanSrcQ\",\n", + " \"Cfg_PCmdClear\",\n", + " \"Cfg_ProgDefault\",\n", + " \"Cfg_HasHiHiAlm\",\n", + " \"Cfg_HasHiAlm\",\n", + " \"Cfg_HasLoAlm\",\n", + " \"Cfg_HasLoLoAlm\",\n", + " \"Cfg_HasFailAlm\",\n", + " \"Cfg_HiHiResetReqd\",\n", + " \"Cfg_HiResetReqd\",\n", + " \"Cfg_LoResetReqd\",\n", + " \"Cfg_LoLoResetReqd\",\n", + " \"Cfg_FailResetReqd\",\n", + " \"Cfg_HiHiAckReqd\",\n", + " \"Cfg_HiAckReqd\",\n", + " \"Cfg_LoAckReqd\",\n", + " \"Cfg_LoLoAckReqd\",\n", + " \"Cfg_FailAckReqd\",\n", + " \"Cfg_HiHiSeverity\",\n", + " \"Cfg_HiSeverity\",\n", + " \"Cfg_LoSeverity\",\n", + " \"Cfg_LoLoSeverity\",\n", + " \"Cfg_FailSeverity\",\n", + " \"Cfg_InpRawMin\",\n", + " \"Cfg_InpRawMax\",\n", + " \"Cfg_PVEUMin\",\n", + " \"Cfg_PVEUMax\",\n", + " \"Cfg_FiltTC\",\n", + " \"Cfg_HiHiDB\",\n", + " \"Cfg_HiHiOnDly\",\n", + " \"Cfg_HiHiOffDly\",\n", + " \"Cfg_HiHiGateDly\",\n", + " \"Cfg_HiDB\",\n", + " \"Cfg_HiOnDly\",\n", + " \"Cfg_HiOffDly\",\n", + " \"Cfg_HiGateDly\",\n", + " \"Cfg_LoDB\",\n", + " \"Cfg_LoOnDly\",\n", + " \"Cfg_LoOffDly\",\n", + " \"Cfg_LoGateDly\",\n", + " \"Cfg_LoLoDB\",\n", + " \"Cfg_LoLoOnDly\",\n", + " \"Cfg_LoLoOffDly\",\n", + " \"Cfg_LoLoGateDly\",\n", + " \"Cfg_FailHiLim\",\n", + " \"Cfg_FailLoLim\",\n", + " \"Cfg_FailDB\",\n", + " \"Cfg_FailOnDly\",\n", + " \"Cfg_FailOffDly\",\n", + " \"Cfg_FailGateDly\",\n", + " \"PSet_Owner\",\n", + " \"PSet_HiHiLim\",\n", + " \"PSet_HiLim\",\n", + " \"PSet_LoLim\",\n", + " \"PSet_LoLoLim\",\n", + " \"MSet_SubstPV\",\n", + " \"OSet_HiHiLim\",\n", + " \"OSet_HiLim\",\n", + " \"OSet_LoLim\",\n", + " \"OSet_LoLoLim\",\n", + " \"Set_SimPV\",\n", + " \"PCmd_ClearCapt\",\n", + " \"PCmd_Acq\",\n", + " \"PCmd_Rel\",\n", + " \"PCmd_Lock\",\n", + " \"PCmd_Unlock\",\n", + " \"PCmd_Reset\",\n", + " \"PCmd_HiHiAck\",\n", + " \"PCmd_HiHiSuppress\",\n", + " \"PCmd_HiHiUnsuppress\",\n", + " \"PCmd_HiHiUnshelve\",\n", + " \"PCmd_HiAck\",\n", + " \"PCmd_HiSuppress\",\n", + " \"PCmd_HiUnsuppress\",\n", + " \"PCmd_HiUnshelve\",\n", + " \"PCmd_LoAck\",\n", + " \"PCmd_LoSuppress\",\n", + " \"PCmd_LoUnsuppress\",\n", + " \"PCmd_LoUnshelve\",\n", + " \"PCmd_LoLoAck\",\n", + " \"PCmd_LoLoSuppress\",\n", + " \"PCmd_LoLoUnsuppress\",\n", + " \"PCmd_LoLoUnshelve\",\n", + " \"PCmd_FailAck\",\n", + " \"PCmd_FailSuppress\",\n", + " \"PCmd_FailUnsuppress\",\n", + " \"PCmd_FailUnshelve\",\n", + " \"MCmd_SubstPV\",\n", + " \"MCmd_InpPV\",\n", + " \"OCmd_ClearCapt\",\n", + " \"MCmd_Acq\",\n", + " \"MCmd_Rel\",\n", + " \"OCmd_AcqLock\",\n", + " \"OCmd_Unlock\",\n", + " \"OCmd_Reset\",\n", + " \"OCmd_ResetAckAll\",\n", + " \"Val\",\n", + " \"Val_InpPV\",\n", + " \"Val_PVMinCapt\",\n", + " \"Val_PVMaxCapt\",\n", + " \"Val_PVEUMin\",\n", + " \"Val_PVEUMax\",\n", + " \"SrcQ_IO\",\n", + " \"SrcQ\",\n", + " \"Val_Fault\",\n", + " \"Val_Mode\",\n", + " \"Val_Owner\",\n", + " \"Val_Notify\",\n", + " \"Val_HiHiLim\",\n", + " \"Val_HiLim\",\n", + " \"Val_LoLim\",\n", + " \"Val_LoLoLim\",\n", + " \"Sts_SubstPV\",\n", + " \"Sts_InpPV\",\n", + " \"Sts_PVBad\",\n", + " \"Sts_PVUncertain\",\n", + " \"Sts_MaintByp\",\n", + " \"Sts_AlmInh\",\n", + " \"Sts_Err\",\n", + " \"Err_Raw\",\n", + " \"Err_EU\",\n", + " \"Err_Timer\",\n", + " \"Err_Filt\",\n", + " \"Err_DB\",\n", + " \"Err_Alarm\",\n", + " \"Sts_Maint\",\n", + " \"Sts_Prog\",\n", + " \"Sts_Oper\",\n", + " \"Sts_ProgOperLock\",\n", + " \"Sts_NoMode\",\n", + " \"Sts_MAcqRcvd\",\n", + " \"Sts_HiHiCmp\",\n", + " \"Sts_HiHiGate\",\n", + " \"Sts_HiHi\",\n", + " \"Alm_HiHi\",\n", + " \"Ack_HiHi\",\n", + " \"Sts_HiHiDisabled\",\n", + " \"Sts_HiHiSuppressed\",\n", + " \"Sts_HiHiShelved\",\n", + " \"Sts_HiCmp\",\n", + " \"Sts_HiGate\",\n", + " \"Sts_Hi\",\n", + " \"Alm_Hi\",\n", + " \"Ack_Hi\",\n", + " \"Sts_HiDisabled\",\n", + " \"Sts_HiSuppressed\",\n", + " \"Sts_HiShelved\",\n", + " \"Sts_LoCmp\",\n", + " \"Sts_LoGate\",\n", + " \"Sts_Lo\",\n", + " \"Alm_Lo\",\n", + " \"Ack_Lo\",\n", + " \"Sts_LoDisabled\",\n", + " \"Sts_LoSuppressed\",\n", + " \"Sts_LoShelved\",\n", + " \"Sts_LoLoCmp\",\n", + " \"Sts_LoLoGate\",\n", + " \"Sts_LoLo\",\n", + " \"Alm_LoLo\",\n", + " \"Ack_LoLo\",\n", + " \"Sts_LoLoDisabled\",\n", + " \"Sts_LoLoSuppressed\",\n", + " \"Sts_LoLoShelved\",\n", + " \"Sts_FailCmp\",\n", + " \"Sts_FailGate\",\n", + " \"Sts_Fail\",\n", + " \"Alm_Fail\",\n", + " \"Ack_Fail\",\n", + " \"Sts_FailDisabled\",\n", + " \"Sts_FailSuppressed\",\n", + " \"Sts_FailShelved\",\n", + " \"Rdy_SubstPV\",\n", + " \"Rdy_InpPV\",\n", + " \"Rdy_Reset\",\n", + " \"Rdy_ResetAckAll\",\n", + " \"Rdy_OSet\",\n", + " \"P_AIn\",\n", + " \"inp_ProcessRunning\",\n", + " \"LoLo\",\n", + " \"Lo\",\n", + " \"Hi\",\n", + " \"HiHi\",\n", + " \"Mode\",\n", + " \"Cfg_EU\",\n", + " \"Cfg_Tag\",\n", + " \"Cfg_Label\",\n", + " \"Cfg_Desc\",\n", + " \"Fail\",\n", + " \"Wrk_Notify\",\n", + " \"Inf_Tab\",\n", + " \"Wrk_Fault\",\n", + " \"Wrk_SrcQ\",\n", + " \"Wrk_SubstPV\",\n", + " \"Wrk_UnfiltPV\",\n", + " \"Wrk_Alpha\",\n", + " \"Wrk_ScanT\",\n", + " \"Wrk_ScanTime\",\n", + " \"Wrk_FiltPV\",\n", + " \"Wrk_ValidONS\",\n", + " \"Wrk_SelPVDINT\",\n", + " \"Wrk_SelPVInfNaN\",\n", + " \"Inf_Type\",\n", + " \"Wrk_Fail\",\n", + " \"Wrk_LoLo\",\n", + " \"Wrk_Lo\",\n", + " \"Wrk_Hi\",\n", + " \"Wrk_HiHi\",\n", + " \"FailGate\",\n", + " \"LoLoGate\",\n", + " \"LoGate\",\n", + " \"HiHiGate\",\n", + " \"HiGate\",\n", + " \"Wrk_InpInfNaN\",\n", + " \"Wrk_InpDINT\",\n", + " \"Inf_Lib\",\n", + " \"Wrk_InpFail\",\n", + " \"ONS_Supress\",\n", + " \"ONS_Unsupress\",\n", + " \"ONS_ProcessRunning\",\n", + " \"ONS_ProcessNotRunning\"\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "taglist = []\n", + "basetag = \"AIn_IntakePressure\"\n", + "for x in attributes:\n", + " taglist.append(basetag + \".\" + x)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "with LogixDriver('166.252.25.65') as plc:\n", + " r = plc.read(*taglist)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AIn_IntakePressure.EnableIn, True, BOOL, None\n", + "AIn_IntakePressure.EnableOut, True, BOOL, None\n", + "AIn_IntakePressure.Inp_PV, 6354.0, REAL, None\n", + "AIn_IntakePressure.Inp_PVSrcQ, 0, SINT, None\n", + "AIn_IntakePressure.Inp_PVBad, False, BOOL, None\n", + "AIn_IntakePressure.Inp_PVUncertain, False, BOOL, None\n", + "AIn_IntakePressure.Inp_Sim, False, BOOL, None\n", + "AIn_IntakePressure.Inp_HiHiGate, True, BOOL, None\n", + "AIn_IntakePressure.Inp_HiGate, True, BOOL, None\n", + "AIn_IntakePressure.Inp_LoGate, True, BOOL, None\n", + "AIn_IntakePressure.Inp_LoLoGate, True, BOOL, None\n", + "AIn_IntakePressure.Inp_FailGate, True, BOOL, None\n", + "AIn_IntakePressure.Inp_Reset, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_NoSubstPV, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_SetTrack, True, BOOL, None\n", + "AIn_IntakePressure.Cfg_HasChanObj, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_UseChanSrcQ, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_PCmdClear, True, BOOL, None\n", + "AIn_IntakePressure.Cfg_ProgDefault, True, BOOL, None\n", + "AIn_IntakePressure.Cfg_HasHiHiAlm, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_HasHiAlm, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_HasLoAlm, True, BOOL, None\n", + "AIn_IntakePressure.Cfg_HasLoLoAlm, True, BOOL, None\n", + "AIn_IntakePressure.Cfg_HasFailAlm, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_HiHiResetReqd, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_HiResetReqd, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_LoResetReqd, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_LoLoResetReqd, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_FailResetReqd, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_HiHiAckReqd, True, BOOL, None\n", + "AIn_IntakePressure.Cfg_HiAckReqd, True, BOOL, None\n", + "AIn_IntakePressure.Cfg_LoAckReqd, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_LoLoAckReqd, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_FailAckReqd, False, BOOL, None\n", + "AIn_IntakePressure.Cfg_HiHiSeverity, 750, INT, None\n", + "AIn_IntakePressure.Cfg_HiSeverity, 500, INT, None\n", + "AIn_IntakePressure.Cfg_LoSeverity, 500, INT, None\n", + "AIn_IntakePressure.Cfg_LoLoSeverity, 750, INT, None\n", + "AIn_IntakePressure.Cfg_FailSeverity, 1000, INT, None\n", + "AIn_IntakePressure.Cfg_InpRawMin, 4000.0, REAL, None\n", + "AIn_IntakePressure.Cfg_InpRawMax, 20000.0, REAL, None\n", + "AIn_IntakePressure.Cfg_PVEUMin, 0.0, REAL, None\n", + "AIn_IntakePressure.Cfg_PVEUMax, 30.0, REAL, None\n", + "AIn_IntakePressure.Cfg_FiltTC, 0.0, REAL, None\n", + "AIn_IntakePressure.Cfg_HiHiDB, 1.0, REAL, None\n", + "AIn_IntakePressure.Cfg_HiHiOnDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_HiHiOffDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_HiHiGateDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_HiDB, 1.0, REAL, None\n", + "AIn_IntakePressure.Cfg_HiOnDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_HiOffDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_HiGateDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_LoDB, 1.0, REAL, None\n", + "AIn_IntakePressure.Cfg_LoOnDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_LoOffDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_LoGateDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_LoLoDB, 1.0, REAL, None\n", + "AIn_IntakePressure.Cfg_LoLoOnDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_LoLoOffDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_LoLoGateDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_FailHiLim, 30.0, REAL, None\n", + "AIn_IntakePressure.Cfg_FailLoLim, 0.0, REAL, None\n", + "AIn_IntakePressure.Cfg_FailDB, 0.5, REAL, None\n", + "AIn_IntakePressure.Cfg_FailOnDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_FailOffDly, 0, DINT, None\n", + "AIn_IntakePressure.Cfg_FailGateDly, 0, DINT, None\n", + "AIn_IntakePressure.PSet_Owner, 0, DINT, None\n", + "AIn_IntakePressure.PSet_HiHiLim, 500.0, REAL, None\n", + "AIn_IntakePressure.PSet_HiLim, 30.0, REAL, None\n", + "AIn_IntakePressure.PSet_LoLim, 0.5, REAL, None\n", + "AIn_IntakePressure.PSet_LoLoLim, 0.0, REAL, None\n", + "AIn_IntakePressure.MSet_SubstPV, 4.415625095367432, REAL, None\n", + "AIn_IntakePressure.OSet_HiHiLim, 500.0, REAL, None\n", + "AIn_IntakePressure.OSet_HiLim, 30.0, REAL, None\n", + "AIn_IntakePressure.OSet_LoLim, 0.5, REAL, None\n", + "AIn_IntakePressure.OSet_LoLoLim, 0.0, REAL, None\n", + "AIn_IntakePressure.Set_SimPV, 4.415625095367432, REAL, None\n", + "AIn_IntakePressure.PCmd_ClearCapt, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_Acq, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_Rel, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_Lock, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_Unlock, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_Reset, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_HiHiAck, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_HiHiSuppress, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_HiHiUnsuppress, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_HiHiUnshelve, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_HiAck, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_HiSuppress, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_HiUnsuppress, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_HiUnshelve, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_LoAck, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_LoSuppress, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_LoUnsuppress, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_LoUnshelve, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_LoLoAck, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_LoLoSuppress, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_LoLoUnsuppress, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_LoLoUnshelve, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_FailAck, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_FailSuppress, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_FailUnsuppress, False, BOOL, None\n", + "AIn_IntakePressure.PCmd_FailUnshelve, False, BOOL, None\n", + "AIn_IntakePressure.MCmd_SubstPV, False, BOOL, None\n", + "AIn_IntakePressure.MCmd_InpPV, False, BOOL, None\n", + "AIn_IntakePressure.OCmd_ClearCapt, False, BOOL, None\n", + "AIn_IntakePressure.MCmd_Acq, False, BOOL, None\n", + "AIn_IntakePressure.MCmd_Rel, False, BOOL, None\n", + "AIn_IntakePressure.OCmd_AcqLock, False, BOOL, None\n", + "AIn_IntakePressure.OCmd_Unlock, False, BOOL, None\n", + "AIn_IntakePressure.OCmd_Reset, False, BOOL, None\n", + "AIn_IntakePressure.OCmd_ResetAckAll, False, BOOL, None\n", + "AIn_IntakePressure.Val, 4.415625095367432, REAL, None\n", + "AIn_IntakePressure.Val_InpPV, 4.415625095367432, REAL, None\n", + "AIn_IntakePressure.Val_PVMinCapt, 4.391250133514404, REAL, None\n", + "AIn_IntakePressure.Val_PVMaxCapt, 4.421249866485596, REAL, None\n", + "AIn_IntakePressure.Val_PVEUMin, 0.0, REAL, None\n", + "AIn_IntakePressure.Val_PVEUMax, 30.0, REAL, None\n", + "AIn_IntakePressure.SrcQ_IO, 1, SINT, None\n", + "AIn_IntakePressure.SrcQ, 1, SINT, None\n", + "AIn_IntakePressure.Val_Fault, 0, SINT, None\n", + "AIn_IntakePressure.Val_Mode, 8, SINT, None\n", + "AIn_IntakePressure.Val_Owner, 0, DINT, None\n", + "AIn_IntakePressure.Val_Notify, 0, SINT, None\n", + "AIn_IntakePressure.Val_HiHiLim, 500.0, REAL, None\n", + "AIn_IntakePressure.Val_HiLim, 30.0, REAL, None\n", + "AIn_IntakePressure.Val_LoLim, 0.5, REAL, None\n", + "AIn_IntakePressure.Val_LoLoLim, 0.0, REAL, None\n", + "AIn_IntakePressure.Sts_SubstPV, False, BOOL, None\n", + "AIn_IntakePressure.Sts_InpPV, True, BOOL, None\n", + "AIn_IntakePressure.Sts_PVBad, False, BOOL, None\n", + "AIn_IntakePressure.Sts_PVUncertain, False, BOOL, None\n", + "AIn_IntakePressure.Sts_MaintByp, False, BOOL, None\n", + "AIn_IntakePressure.Sts_AlmInh, False, BOOL, None\n", + "AIn_IntakePressure.Sts_Err, False, BOOL, None\n", + "AIn_IntakePressure.Err_Raw, False, BOOL, None\n", + "AIn_IntakePressure.Err_EU, False, BOOL, None\n", + "AIn_IntakePressure.Err_Timer, False, BOOL, None\n", + "AIn_IntakePressure.Err_Filt, False, BOOL, None\n", + "AIn_IntakePressure.Err_DB, False, BOOL, None\n", + "AIn_IntakePressure.Err_Alarm, False, BOOL, None\n", + "AIn_IntakePressure.Sts_Maint, False, BOOL, None\n", + "AIn_IntakePressure.Sts_Prog, True, BOOL, None\n", + "AIn_IntakePressure.Sts_Oper, False, BOOL, None\n", + "AIn_IntakePressure.Sts_ProgOperLock, False, BOOL, None\n", + "AIn_IntakePressure.Sts_NoMode, False, BOOL, None\n", + "AIn_IntakePressure.Sts_MAcqRcvd, False, BOOL, None\n", + "AIn_IntakePressure.Sts_HiHiCmp, False, BOOL, None\n", + "AIn_IntakePressure.Sts_HiHiGate, True, BOOL, None\n", + "AIn_IntakePressure.Sts_HiHi, False, BOOL, None\n", + "AIn_IntakePressure.Alm_HiHi, False, BOOL, None\n", + "AIn_IntakePressure.Ack_HiHi, True, BOOL, None\n", + "AIn_IntakePressure.Sts_HiHiDisabled, False, BOOL, None\n", + "AIn_IntakePressure.Sts_HiHiSuppressed, False, BOOL, None\n", + "AIn_IntakePressure.Sts_HiHiShelved, False, BOOL, None\n", + "AIn_IntakePressure.Sts_HiCmp, False, BOOL, None\n", + "AIn_IntakePressure.Sts_HiGate, True, BOOL, None\n", + "AIn_IntakePressure.Sts_Hi, False, BOOL, None\n", + "AIn_IntakePressure.Alm_Hi, False, BOOL, None\n", + "AIn_IntakePressure.Ack_Hi, True, BOOL, None\n", + "AIn_IntakePressure.Sts_HiDisabled, False, BOOL, None\n", + "AIn_IntakePressure.Sts_HiSuppressed, False, BOOL, None\n", + "AIn_IntakePressure.Sts_HiShelved, False, BOOL, None\n", + "AIn_IntakePressure.Sts_LoCmp, False, BOOL, None\n", + "AIn_IntakePressure.Sts_LoGate, True, BOOL, None\n", + "AIn_IntakePressure.Sts_Lo, False, BOOL, None\n", + "AIn_IntakePressure.Alm_Lo, False, BOOL, None\n", + "AIn_IntakePressure.Ack_Lo, True, BOOL, None\n", + "AIn_IntakePressure.Sts_LoDisabled, False, BOOL, None\n", + "AIn_IntakePressure.Sts_LoSuppressed, False, BOOL, None\n", + "AIn_IntakePressure.Sts_LoShelved, False, BOOL, None\n", + "AIn_IntakePressure.Sts_LoLoCmp, False, BOOL, None\n", + "AIn_IntakePressure.Sts_LoLoGate, True, BOOL, None\n", + "AIn_IntakePressure.Sts_LoLo, False, BOOL, None\n", + "AIn_IntakePressure.Alm_LoLo, False, BOOL, None\n", + "AIn_IntakePressure.Ack_LoLo, True, BOOL, None\n", + "AIn_IntakePressure.Sts_LoLoDisabled, False, BOOL, None\n", + "AIn_IntakePressure.Sts_LoLoSuppressed, False, BOOL, None\n", + "AIn_IntakePressure.Sts_LoLoShelved, False, BOOL, None\n", + "AIn_IntakePressure.Sts_FailCmp, False, BOOL, None\n", + "AIn_IntakePressure.Sts_FailGate, True, BOOL, None\n", + "AIn_IntakePressure.Sts_Fail, False, BOOL, None\n", + "AIn_IntakePressure.Alm_Fail, False, BOOL, None\n", + "AIn_IntakePressure.Ack_Fail, True, BOOL, None\n", + "AIn_IntakePressure.Sts_FailDisabled, False, BOOL, None\n", + "AIn_IntakePressure.Sts_FailSuppressed, False, BOOL, None\n", + "AIn_IntakePressure.Sts_FailShelved, False, BOOL, None\n", + "AIn_IntakePressure.Rdy_SubstPV, False, BOOL, None\n", + "AIn_IntakePressure.Rdy_InpPV, False, BOOL, None\n", + "AIn_IntakePressure.Rdy_Reset, False, BOOL, None\n", + "AIn_IntakePressure.Rdy_ResetAckAll, False, BOOL, None\n", + "AIn_IntakePressure.Rdy_OSet, False, BOOL, None\n", + "AIn_IntakePressure.P_AIn, False, BOOL, None\n", + "AIn_IntakePressure.inp_ProcessRunning, True, BOOL, None\n", + "AIn_IntakePressure.LoLo, None, None, Permission denied\n", + "AIn_IntakePressure.Lo, None, None, Permission denied\n", + "AIn_IntakePressure.Hi, None, None, Permission denied\n", + "AIn_IntakePressure.HiHi, None, None, Permission denied\n", + "AIn_IntakePressure.Mode, None, None, Permission denied\n", + "AIn_IntakePressure.Cfg_EU, 'PSI', STRING_8, None\n", + "AIn_IntakePressure.Cfg_Tag, 'AIn_IntakePressure', STRING_20, None\n", + "AIn_IntakePressure.Cfg_Label, 'Intake Pressure', STRING_20, None\n", + "AIn_IntakePressure.Cfg_Desc, 'Intake Pressure', STRING_40, None\n", + "AIn_IntakePressure.Fail, None, None, Permission denied\n", + "AIn_IntakePressure.Wrk_Notify, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Inf_Tab, 0, SINT, None\n", + "AIn_IntakePressure.Wrk_Fault, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_SrcQ, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_SubstPV, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_UnfiltPV, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_Alpha, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_ScanT, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_ScanTime, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_FiltPV, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_ValidONS, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_SelPVDINT, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_SelPVInfNaN, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Inf_Type, 'P_AIn', STRING_16, None\n", + "AIn_IntakePressure.Wrk_Fail, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_LoLo, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_Lo, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_Hi, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_HiHi, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.FailGate, {'Cfg_GateCond': 'Gating Condition', 'Cfg_GateDly': 0, 'Cfg_InpCond': 'Input Failure', 'Cfg_OffDly': 0, ...}, P_Gate, None\n", + "AIn_IntakePressure.LoLoGate, {'Cfg_GateCond': 'n/a', 'Cfg_GateDly': 0, 'Cfg_InpCond': 'Low-Low Pressure', 'Cfg_OffDly': 0, ...}, P_Gate, None\n", + "AIn_IntakePressure.LoGate, {'Cfg_GateCond': 'n/a', 'Cfg_GateDly': 0, 'Cfg_InpCond': 'Low Pressure', 'Cfg_OffDly': 0, ...}, P_Gate, None\n", + "AIn_IntakePressure.HiHiGate, {'Cfg_GateCond': 'n/a', 'Cfg_GateDly': 0, 'Cfg_InpCond': 'High-High Pressure', 'Cfg_OffDly': 0, ...}, P_Gate, None\n", + "AIn_IntakePressure.HiGate, {'Cfg_GateCond': 'n/a', 'Cfg_GateDly': 0, 'Cfg_InpCond': 'Startup Pressure', 'Cfg_OffDly': 0, ...}, P_Gate, None\n", + "AIn_IntakePressure.Wrk_InpInfNaN, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Wrk_InpDINT, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.Inf_Lib, 'RA-BAS', STRING_12, None\n", + "AIn_IntakePressure.Wrk_InpFail, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.ONS_Supress, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.ONS_Unsupress, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.ONS_ProcessRunning, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n", + "AIn_IntakePressure.ONS_ProcessNotRunning, None, None, IOI syntax error. A syntax error was detected decoding the Request Path (see extended status) - Extended status out of memory (04, 00)\n" + ] + } + ], + "source": [ + "\n", + "for x in r:\n", + " print(x)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.10.5 ('tbDataCollector')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.5" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "1ff24bb78522b54a2b0b4d6825921b0b6e3118b5057a0b6390d4ff598478e38b" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}