added new device types
This commit is contained in:
BIN
Pub_Sub/.DS_Store
vendored
BIN
Pub_Sub/.DS_Store
vendored
Binary file not shown.
BIN
Pub_Sub/advvfdipp/.DS_Store
vendored
BIN
Pub_Sub/advvfdipp/.DS_Store
vendored
Binary file not shown.
@@ -1,190 +1,213 @@
|
||||
MeasuringPointName,ControllerName,GroupName,UploadType,DeadZonePercent,DataType,ArrayIndex,EnableBit,BitIndex,reverseBit,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,Pt,Ct,Mapping_table,TransDecimal,bitMap,msecSample,storageLwTSDB,DataEndianReverse,ReadOffset,ReadLength,WriteOffset,WriteLength,DataParseMethod,BitId
|
||||
a_current,ek_facility,default,periodic,,FLOAT,,,,,Val_A_Current,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
ab_volt,ek_facility,default,periodic,,FLOAT,,,,,Val_AB_Volt,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
ac_volt,ek_facility,default,periodic,,FLOAT,,,,,Val_AC_Volt,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
ait_102a_turbitity,ek_facility,default,periodic,,FLOAT,,,,,AI_102A.Scaled_Out,2,,ro,,Inlet Turbitity Value,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
ait_102b_h2s,ek_facility,default,periodic,,FLOAT,,,,,AI_102B.Scaled_Out,2,,ro,,Inlet H2S Value,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
ait_102c_ph,ek_facility,default,periodic,,FLOAT,,,,,AI_102C.Scaled_Out,2,,ro,,Inlet pH Value,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
ait_102d_oil_in_water,ek_facility,default,periodic,,FLOAT,,,,,AI_102D.Scaled_Out,2,,ro,,Inlet Oil In Water,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
ait_114a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
ait_114b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
ait_114c_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114C.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
ait_114d_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114D.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
ait_114e_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114E.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
at_109a_turbidity,ek_facility,default,periodic,,FLOAT,,,,,AI_109A.Scaled_Out,2,,ro,,Outlet Turbidity Value,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
at_109b_h2s,ek_facility,default,periodic,,FLOAT,,,,,AI_109B.Scaled_Out,2,,ro,,Outlet H2S Value,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
at_109c_oil_in_water,ek_facility,default,periodic,,FLOAT,,,,,AI_109C.Scaled_Out,2,,ro,,Outlet Oil In Water Value,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
at_109d_o2_in_water,ek_facility,default,periodic,,FLOAT,,,,,AI_109D.Scaled_Out,2,,ro,,Outlet O2 In Water Value,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
at_109e_orp,ek_facility,default,periodic,,FLOAT,,,,,AI_109E.Scaled_Out,2,,ro,,Outlet ORP Value,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
b_current,ek_facility,default,periodic,,FLOAT,,,,,Val_B_Current,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
bc_volt,ek_facility,default,periodic,,FLOAT,,,,,Val_BC_Volt,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
bp_3a_auto,ek_facility,default,periodic,,BIT,,,,0,BP_3A_Auto,,,ro,,M107A HOA Hand Feedback,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
bp_3a_fault,ek_facility,default,periodic,,BIT,,,,0,BP_3A_Fault_FBK,,,ro,,M107A Fault Feedback,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
bp_3a_hand,ek_facility,default,periodic,,BIT,,,,0,BP_3A_Hand,,,ro,,M107A HOA Auto Feedback,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
bp_3a_run,ek_facility,default,periodic,,BIT,,,,0,BP_3A_RUN_FDBK,,,ro,,M107A Run Status,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
bp_3a_run_cmd,ek_facility,default,periodic,,BIT,,,,0,BP_3A,,,ro,,M107A Run Command,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
bp_3a_run_fail_alm,ek_facility,default,periodic,,BIT,,,,0,BP_3A_RUN_FAIL,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
bp_3b_auto,ek_facility,default,periodic,,BIT,,,,0,BP_3B_Auto,,,ro,,M107B HOA Hand Feedback,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
bp_3b_fault,ek_facility,default,periodic,,BIT,,,,0,BP_3B_Fault_FBK,,,ro,,M107B Fault Feedback,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
bp_3b_hand,ek_facility,default,periodic,,BIT,,,,0,BP_3B_Hand,,,ro,,M107B HOA Auto Feedback,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
bp_3b_run,ek_facility,default,periodic,,BIT,,,,0,BP_3B_RUN_FDBK,,,ro,,M107B Run Status,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
bp_3b_run_cmd,ek_facility,default,periodic,,BIT,,,,0,BP_3B,,,ro,,M107B Run Command,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
bp_3b_run_fail_alm,ek_facility,default,periodic,,BIT,,,,0,BP_3B_RUN_FAIL,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
c_current,ek_facility,default,periodic,,FLOAT,,,,,Val_C_Current,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
chemical_pump_01_rate_offset,ek_facility,default,periodic,,FLOAT,,,,,SPT_Chemical_Pump_1_Rate_Offset,2,,ro,%,Operator Adjustment,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
chemical_pump_01_run_status,ek_facility,default,periodic,,BIT,,,,0,FBK_Chemical_Pump_1_Running,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
chemical_pump_auto,ek_facility,default,periodic,,BIT,,,,0,CMD_Chemical_Pump_Auto,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
compressor_ambient_temp,ek_facility,default,periodic,,FLOAT,,,,,Val_Air_Compressor_Ambient_Temp,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
compressor_controller_temp,ek_facility,default,periodic,,FLOAT,,,,,Val_Air_Compressor_Controller_Temp,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
compressor_outlet_pressure,ek_facility,default,periodic,,FLOAT,,,,,Val_Air_Compressor_Outlet_PSI,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
compressor_outlet_temp,ek_facility,default,periodic,,FLOAT,,,,,Val_Air_Compressor_Outlet_Element_Temp,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
ct_200_current,ek_facility,default,periodic,,FLOAT,,,,,CT_200.Scaled_Out,2,,ro,,M-105 Motor Amperage,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
dpi_108a_pressure,ek_facility,default,periodic,,FLOAT,,,,,DPI_108A,2,,ro,,Differential PSI Across Sock Filter,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
dpi_108b_pressure,ek_facility,default,periodic,,FLOAT,,,,,DPI_108B,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
esd_exists,ek_facility,default,periodic,,BIT,,,,0,ESD_Exists,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
fcv_001_valve,ek_facility,default,periodic,,FLOAT,,,,,FCV_001_PRESCALE,2,,ro,,M107A Control Valve Setpoint,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fcv_002_valve,ek_facility,default,periodic,,FLOAT,,,,,FCV_002_PRESCALE,2,,ro,,M107B Control Valve Setpoint,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fcv_101a_valve,ek_facility,default,periodic,,FLOAT,,,,,FCV_101A.Scaled_Out,2,,ro,,Reject Stream Throttling Valve Position Feedback,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fcv_101b_valve,ek_facility,default,periodic,,FLOAT,,,,,FCV_101B.Scaled_Out,2,,ro,,Inlet Stream Throttling Valve Position Feedback,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fi_101b_popoff,ek_facility,default,periodic,,BIT,,,,0,FI_101B.Discrete_Input,,,ro,,Reject Stream Popoff Flow Switch,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
fis_112_h2o2_popoff,ek_facility,default,periodic,,BIT,,,,0,FIS_112_FBK,,,ro,,H2O2 Popoff Flow Switch,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
fit_004_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_004.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
fit_100_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_100.Scaled_Out,2,,ro,,Inlet Flow Rate To ACW,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_100_hi_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_100.AH,,,ro,,Inlet Flow Rate To ACW Hi,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
fit_100_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_100.AHH,,,ro,,Inlet Flow Rate To ACW HiHi,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
fit_100_lo_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_100.AL,,,ro,,Inlet Flow Rate To ACW Lo,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
fit_100_water_job,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_100_Job_Total,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_100_water_last_month,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_100_Water_LastMonth,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_100_water_lifetime,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_100_Water_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_100_water_month,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_100_Water_Month,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_100_water_today,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_100_Water_Todays,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_100_water_yesterday,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_100_Water_Yest,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_101_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_101.Scaled_Out,2,,ro,bbls,Reject Stream Flow Rate,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_102_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_102.Scaled_Out,2,,ro,,Inlet Slip Stream Flow Rate,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_104_n2_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_004.Scaled_Out,2,,ro,,M-104 Onyx Pump N2 Injection Rate,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_106a_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_106A.Scaled_Out,2,,ro,,M-106A Flow Rate,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_106a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_106A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
fit_106b_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_106B.Scaled_Out,2,,ro,,M-106B Flow Rate,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_106b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_106B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
fit_107a_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_107A.Scaled_Out,2,,ro,,M107A Flow Rate,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_107a_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_107A.ALL,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
fit_107b_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_107B.Scaled_Out,2,,ro,,M107B Flow Rate,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_107b_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_107B.ALL,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
fit_109a_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_109A.Scaled_Out,2,,ro,,Outlet Slip Stream Flow Rate,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_109b_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_109B.Scaled_Out,2,,ro,,Outlet Sales Meter,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_109b_water_job,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_109B_Job_Total,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_109b_water_last_month,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_109B_Water_LastMonth,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_109b_water_lifetime,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_109B_Water_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_109b_water_month,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_109B_Water_Month,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_109b_water_today,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_109B_Water_Todays,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_109b_water_yesterday,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_109B_Water_Yest,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_111_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_111.Scaled_Out,2,,ro,,FIT_111 Inlet Gas Flow Rate To ACW,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_112a_h2o2_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_112A.Scaled_Out,2,,ro,,H2O2 Flow Rate,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fit_112b_nahso3_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_112B.Scaled_Out,2,,ro,,NaHSO3 Flow Rate,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
h2o2_chemical_rate,ek_facility,default,periodic,,INT,,0,,,Chemical_Pump_1_Rate,,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
li_103D_level_alm,ek_facility,default,periodic,,BIT,,,,0,LI_103D_FBK,,,ro,,ACW Containment Level Tripped (Red When Tripped Please),none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
lit_101_level,ek_facility,default,periodic,,FLOAT,,,,,LIT_101.Scaled_Out,2,,ro,,Chamber 5 Skim Level In Weir,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
lit_112a_h2o2_level,ek_facility,default,periodic,,FLOAT,,,,,LIT_112A.Scaled_Out,2,,ro,,H2O2 Chemical Level,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
lit_112b_nahso3_level,ek_facility,default,periodic,,FLOAT,,,,,LIT_112B.Scaled_Out,2,,ro,,NaHSO3 Chemical Level,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
lit_170_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,LIT_170.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
lit_170_level,ek_facility,default,periodic,,FLOAT,,,,,LIT_170.Scaled_Out,2,,ro,,Chamber 5 Level GWR,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
lit_200_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,LIT_200.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
lit_200_level,ek_facility,default,periodic,,FLOAT,,,,,LIT_200.Scaled_Out,2,,ro,,Chamber 5 Level DP,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
lsh_114_alm,ek_facility,default,periodic,,BIT,,,,0,LSH_114.ALARM,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
lsh_120_alm,ek_facility,default,periodic,,BIT,,,,0,LSH-120.ALARM,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
lsh_120_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,LSH_120,,,ro,,ACW Chamber 5 Level HiHi Switch Tripped (Red When Tripped Please),none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
m106a_vfd_active,ek_facility,default,periodic,,BIT,,,,0,M106A_VFD:I.Active,,,ro,,M-106A Run Status,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
m106a_vfd_faulted_alm,ek_facility,default,periodic,,BIT,,,,0,M106A_VFD:I.Faulted,,,ro,,M-106A Fault Status,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
m106a_vfd_frequency,ek_facility,default,periodic,,INT,,0,,,M106A_VFD:I.OutputFreq,,,ro,,M-106A Current Output Frequency,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
m106a_vfd_start,ek_facility,default,periodic,,BIT,,,,0,M106A_VFD:O.Start,,,ro,,M-106A Start Command,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
m106a_vfd_stop,ek_facility,default,periodic,,BIT,,,,0,M106A_VFD:O.Stop,,,ro,,M-106A Stop Command,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
m106b_vfd_active,ek_facility,default,periodic,,BIT,,,,0,M106B_VFD:I.Active,,,ro,,M-106B Run Status,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
m106b_vfd_faulted_alm,ek_facility,default,periodic,,BIT,,,,0,M106B_VFD:I.Faulted,,,ro,,M-106B Fault Status,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
m106b_vfd_frequency,ek_facility,default,periodic,,INT,,0,,,M106B_VFD:I.OutputFreq,,,ro,,M-106B Current Output Frequency,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
m106b_vfd_start,ek_facility,default,periodic,,BIT,,,,0,M106B_VFD:O.Start,,,ro,,M-106B Start Command,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
m106b_vfd_stop,ek_facility,default,periodic,,BIT,,,,0,M106B_VFD:O.Stop,,,ro,,M-106B Stop Command,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
n2_inlet_pressure,ek_facility,default,periodic,,FLOAT,,,,,Val_N2_Inlet_PSI,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
n2_outlet_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,Val_N2_Outlet_Flow_Rate,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
n2_outlet_pressure,ek_facility,default,periodic,,FLOAT,,,,,Val_ N2_Outlet_ PSI,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
n2_outlet_temp,ek_facility,default,periodic,,FLOAT,,,,,Val_N2_Outlet_Temp,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
n2_purity,ek_facility,default,periodic,,FLOAT,,,,,Val_N2_N2_Purity,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
p100_auto,ek_facility,default,periodic,,BIT,,,,0,P100_Auto,,,ro,,M-104 Onyx Pump HOA Auto Status,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
p100_hand,ek_facility,default,periodic,,BIT,,,,0,P100_Hand,,,ro,,M-104 Onyx Pump HOA Hand Status,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
p200_auto,ek_facility,default,periodic,,BIT,,,,0,P200_Auto,,,ro,,M-105 Skim Pump HOA Hand Status,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
p200_hand,ek_facility,default,periodic,,BIT,,,,0,P200_Hand,,,ro,,M-105 Skim Pump HOA Auto Status,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pdi_065_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PDI_065.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pdi_065_lo_alm,ek_facility,default,periodic,,BIT,,,,0,PDI_065.AL,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pdi_065_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,PDI_065.ALL,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pdi_065_pressure,ek_facility,default,periodic,,FLOAT,,,,,PDI_065.AI_Scaled,2,,ro,,M-104 Onyx Pump Discharge PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pdt_108a_hi_alm,ek_facility,default,periodic,,BIT,,,,0,PDT_108A.AH,,,ro,,Sock Filter High Differential PSI,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pdt_108a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PDT_108A.AHH,,,ro,,Sock Filter High High Differential PSI,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pdt_108b_hi_alm,ek_facility,default,periodic,,BIT,,,,0,PDT_108B.AH,,,ro,,Cartrige Filter #1 High Differential PSI,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pdt_108b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PDT_108B.AHH,,,ro,,Cartrige Filter #1 High High Differential PSI,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pdt_108b_pressure,ek_facility,default,periodic,,FLOAT,,,,,PDT_108B.AI_Scaled,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pdt_108c_hi_alm,ek_facility,default,periodic,,BIT,,,,0,PDT_108C.AH,,,ro,,Cartrige Filter #2 High Differential PSI,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pdt_108c_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PDT_108C.AHH,,,ro,,Cartrige Filter #2 High High Differential PSI,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pdt_108c_pressure,ek_facility,default,periodic,,FLOAT,,,,,PDT_108C.AI_Scaled,2,,ro,,Differential PSI Across Cartrige Filter #2,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_050_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_050.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_050_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_050.Scaled_Out,2,,ro,,PIT-104A Onyx Pump Suction PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_065_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_065.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_065_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_065.Scaled_Out,2,,ro,,PIT_104D Onyx Pump Discharge PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_100_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_100.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_100_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_100.Scaled_Out,2,,ro,,M-105 Skim Pump Discharge PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_100a_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_100A.Scaled_Out,2,,ro,psi,Inlet PSI External To ACW,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_101a_hi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_101A.AH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_101a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_101A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_101a_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_101A.Scaled_Out,2,,ro,psi,"Inlet PSI Internal To ACW, Before SDV-101A",none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_101a_transmitter_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_101A.XFail,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_101b_hi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_P101B.AH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_101b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_101B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_101b_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_101B.Scaled_Out,2,,ro,psi,"Inlet PSI Internal To ACW, After SDV-101A",none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_101b_transmitter_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_101B.XFail,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_101c_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_101C.Scaled_Out,2,,ro,psi,Reject Stream PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_102_hi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_102.AH,,,ro,,Indicated if PIT102 is in Hi alarm state,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_102_hi_spt,ek_facility,default,periodic,,BIT,,,,0,PIT_102.AH_SP,,,ro,,"PIT_102 Hi Alarm Setpoint, If needed",none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_102_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_102.AHH,,,ro,,Indicates if PIT102 is in HiHi alarm state,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_102_hihi_spt,ek_facility,default,periodic,,BIT,,,,0,PIT_102.AHH_SP,,,ro,,PIT_102 HiHi Alarm Setpoint If Needed,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_102_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_102.Scaled_Out,2,,ro,,Inlet PSI To Reaction Tank,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_106a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_106A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_106a_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_106A.Scaled_Out,2,,ro,,M-106A Discharge PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_106b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_106B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_106b_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_106B.Scaled_Out,2,,ro,,M-106B Discharge PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_106c_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_106C.Scaled_Out,2,,ro,,"Reject Stream Discharge Header PSI, Pre SDV 106",none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_106d_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_106D.Scaled_Out,2,,ro,,"Reject Stream Discharge Header PSI, Post SDV106",none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_107a_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_107A.ALL,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_107a_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_107A.Scaled_Out,2,,ro,,M107A & M107B Suction Header PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_107b_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_107B.ALL,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_107b_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_107B.Scaled_Out,2,,ro,,M107A Discharge PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_107c_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_107C.Scaled_Out,2,,ro,,M107A and M107B Discharge Flow Line PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_107d_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_107D.Scaled_Out,2,,ro,,M107B Discharge PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_108_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108G.Scaled_Out,2,,ro,,Post Filter Flow Line PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_108a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_108A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_108a_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108A.Scaled_Out,2,,ro,,Pre Sock Filter PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_108b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_108B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_108b_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108B.Scaled_Out,2,,ro,,Post Sock Filter PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_108c_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_108C.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_108c_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108C.Scaled_Out,2,,ro,,Pre Cartrige Filter #1 PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_108d_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108D.Scaled_Out,2,,ro,,Post Cartrige Filter #1 PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_108e_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108E.Scaled_Out,2,,ro,,Pre Cartrige Filter #2 PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_108f_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108F.Scaled_Out,2,,ro,,Post Cartrige Filter #2 PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_108g_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_108G.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_110_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_110.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_110_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_110.Scaled_Out,2,,ro,,PIT_103 ACW Vapor Space Pressure,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_111a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_111A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_111a_n2,ek_facility,default,periodic,,FLOAT,,,,,PIT_111A.Scaled_Out,2,,ro,,N2 System PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_111b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_111B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_111b_n2,ek_facility,default,periodic,,FLOAT,,,,,PIT_111B.Scaled_Out,2,,ro,,Inlet Skid N2 PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pit_111c_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_111C.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pit_111c_n2,ek_facility,default,periodic,,FLOAT,,,,,PIT_111C.Scaled_Out,2,,ro,,N2 Outlet Skid PSI,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pnl_esd_alm,ek_facility,default,periodic,,BIT,,,,0,PNL_ESD.ALARM,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
rmt_sd_alm,ek_facility,default,periodic,,BIT,,,,0,RMT_SD.ALARM,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
scada_stop_cmd,ek_facility,default,periodic,,BIT,,,,0,CMD_Scada_Stop,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
sdv_101a,ek_facility,default,periodic,,INT,,1,7,0,Local:12:I.Data,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
sdv106_closed,ek_facility,default,periodic,,BIT,,,,0,SDV106_Closed_FBK,,,ro,,SDV106 Closed Feedback Status,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
sdv106_open,ek_facility,default,periodic,,BIT,,,,0,SDV106_Open_FBK,,,ro,,SDV106 Open Feedback Status,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
skim_total_barrels,ek_facility,default,periodic,,FLOAT,,,,,SKIM_TOTAL_BARRELS,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
spt_chemical_manual_rate,ek_facility,default,periodic,,FLOAT,,,,,SPT_Chemical_Manual_Rate,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
xy_100_run,ek_facility,default,periodic,,BIT,,,,0,XY_100,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
xy_200_run,ek_facility,default,periodic,,BIT,,,,0,XY_200,,,ro,,M-105 Run Command,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
zae_111a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,ZAE_111A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
zae_111b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,ZAE_111B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
a_current,ek_facility,default,periodic,,FLOAT,,,,,Val_A_Current,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
ab_volt,ek_facility,default,periodic,,FLOAT,,,,,Val_AB_Volt,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
ac_volt,ek_facility,default,periodic,,FLOAT,,,,,Val_AC_Volt,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
ait_102a_turbitity,ek_facility,default,periodic,,FLOAT,,,,,AI_102A.Scaled_Out,2,,ro,,Inlet Turbitity Value,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
ait_102b_h2s,ek_facility,default,periodic,,FLOAT,,,,,AI_102B.Scaled_Out,2,,ro,,Inlet H2S Value,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
ait_102c_ph,ek_facility,default,periodic,,FLOAT,,,,,AI_102C.Scaled_Out,2,,ro,,Inlet pH Value,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
ait_102d_oil_in_water,ek_facility,default,periodic,,FLOAT,,,,,AI_102D.Scaled_Out,2,,ro,,Inlet Oil In Water,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
ait_114a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114a_lo_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114A.AL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114a_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114A.ALL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114c_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114C.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114c_lo_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114C.AL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114c_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114C.ALL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114d_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114D.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114e_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114E.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114l_lo_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114L.AL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114l_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114L.ALL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114r_lo_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114R.AL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114r_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114R.ALL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114x_lo_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114X.AL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114x_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114X.ALL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114z_lo_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114Z.AL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
ait_114z_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,AIT_114Z.ALL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
at_109a_turbidity,ek_facility,default,periodic,,FLOAT,,,,,AI_109A.Scaled_Out,2,,ro,,Outlet Turbidity Value,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
at_109b_h2s,ek_facility,default,periodic,,FLOAT,,,,,AI_109B.Scaled_Out,2,,ro,,Outlet H2S Value,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
at_109c_oil_in_water,ek_facility,default,periodic,,FLOAT,,,,,AI_109C.Scaled_Out,2,,ro,,Outlet Oil In Water Value,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
at_109d_o2_in_water,ek_facility,default,periodic,,FLOAT,,,,,AI_109D.Scaled_Out,2,,ro,,Outlet O2 In Water Value,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
at_109e_orp,ek_facility,default,periodic,,FLOAT,,,,,AI_109E.Scaled_Out,2,,ro,,Outlet ORP Value,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
b_current,ek_facility,default,periodic,,FLOAT,,,,,Val_B_Current,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
bc_volt,ek_facility,default,periodic,,FLOAT,,,,,Val_BC_Volt,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
bp_3a_auto,ek_facility,default,periodic,,BIT,,,,0,BP_3A_Auto,,,ro,,M107A HOA Hand Feedback,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
bp_3a_fault,ek_facility,default,periodic,,BIT,,,,0,BP_3A_Fault_FBK,,,ro,,M107A Fault Feedback,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
bp_3a_hand,ek_facility,default,periodic,,BIT,,,,0,BP_3A_Hand,,,ro,,M107A HOA Auto Feedback,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
bp_3a_run,ek_facility,default,periodic,,BIT,,,,0,BP_3A_RUN_FDBK,,,ro,,M107A Run Status,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
bp_3a_run_cmd,ek_facility,default,periodic,,BIT,,,,0,BP_3A,,,ro,,M107A Run Command,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
bp_3a_run_fail_alm,ek_facility,default,periodic,,BIT,,,,0,BP_3A_RUN_FAIL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
bp_3b_auto,ek_facility,default,periodic,,BIT,,,,0,BP_3B_Auto,,,ro,,M107B HOA Hand Feedback,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
bp_3b_fault,ek_facility,default,periodic,,BIT,,,,0,BP_3B_Fault_FBK,,,ro,,M107B Fault Feedback,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
bp_3b_hand,ek_facility,default,periodic,,BIT,,,,0,BP_3B_Hand,,,ro,,M107B HOA Auto Feedback,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
bp_3b_run,ek_facility,default,periodic,,BIT,,,,0,BP_3B_RUN_FDBK,,,ro,,M107B Run Status,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
bp_3b_run_cmd,ek_facility,default,periodic,,BIT,,,,0,BP_3B,,,ro,,M107B Run Command,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
bp_3b_run_fail_alm,ek_facility,default,periodic,,BIT,,,,0,BP_3B_RUN_FAIL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
c_current,ek_facility,default,periodic,,FLOAT,,,,,Val_C_Current,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
chemical_pump_01_rate_offset,ek_facility,default,periodic,,FLOAT,,,,,SPT_Chemical_Pump_1_Rate_Offset,2,,ro,%,Operator Adjustment,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
chemical_pump_01_run_status,ek_facility,default,periodic,,BIT,,,,0,FBK_Chemical_Pump_1_Running,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
chemical_pump_auto,ek_facility,default,periodic,,BIT,,,,0,CMD_Chemical_Pump_Auto,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
compressor_ambient_temp,ek_facility,default,periodic,,FLOAT,,,,,Val_Air_Compressor_Ambient_Temp,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
compressor_controller_temp,ek_facility,default,periodic,,FLOAT,,,,,Val_Air_Compressor_Controller_Temp,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
compressor_outlet_pressure,ek_facility,default,periodic,,FLOAT,,,,,Val_Air_Compressor_Outlet_PSI,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
compressor_outlet_temp,ek_facility,default,periodic,,FLOAT,,,,,Val_Air_Compressor_Outlet_Element_Temp,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
ct_200_current,ek_facility,default,periodic,,FLOAT,,,,,CT_200.Scaled_Out,2,,ro,,M-105 Motor Amperage,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
dpi_108a_pressure,ek_facility,default,periodic,,FLOAT,,,,,DPI_108A,2,,ro,,Differential PSI Across Sock Filter,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
dpi_108b_pressure,ek_facility,default,periodic,,FLOAT,,,,,DPI_108B,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
esd_exists,ek_facility,default,periodic,,BIT,,,,0,ESD_Exists,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
fcv_001_valve,ek_facility,default,periodic,,FLOAT,,,,,FCV_001_PRESCALE,2,,ro,,M107A Control Valve Setpoint,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fcv_002_valve,ek_facility,default,periodic,,FLOAT,,,,,FCV_002_PRESCALE,2,,ro,,M107B Control Valve Setpoint,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fcv_101a_valve,ek_facility,default,periodic,,FLOAT,,,,,FCV_101A.Scaled_Out,2,,ro,,Reject Stream Throttling Valve Position Feedback,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fcv_101b_valve,ek_facility,default,periodic,,FLOAT,,,,,FCV_101B.Scaled_Out,2,,ro,,Inlet Stream Throttling Valve Position Feedback,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fi_101b_popoff,ek_facility,default,periodic,,BIT,,,,0,FI_101B.Discrete_Input,,,ro,,Reject Stream Popoff Flow Switch,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
fis_112_h2o2_popoff,ek_facility,default,periodic,,BIT,,,,0,FIS_112_FBK,,,ro,,H2O2 Popoff Flow Switch,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
fit_004_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_004.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
fit_100_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_100.Scaled_Out,2,,ro,,Inlet Flow Rate To ACW,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_100_hi_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_100.AH,,,ro,,Inlet Flow Rate To ACW Hi,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
fit_100_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_100.AHH,,,ro,,Inlet Flow Rate To ACW HiHi,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
fit_100_lo_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_100.AL,,,ro,,Inlet Flow Rate To ACW Lo,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
fit_100_water_job,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_100_Job_Total,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_100_water_last_month,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_100_Water_LastMonth,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_100_water_lifetime,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_100_Water_T1,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_100_water_month,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_100_Water_Month,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_100_water_today,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_100_Water_Todays,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_100_water_yesterday,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_100_Water_Yest,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_101_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_101.Scaled_Out,2,,ro,bbls,Reject Stream Flow Rate,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_102_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_102.Scaled_Out,2,,ro,,Inlet Slip Stream Flow Rate,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_104_n2_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_004.Scaled_Out,2,,ro,,M-104 Onyx Pump N2 Injection Rate,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_106a_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_106A.Scaled_Out,2,,ro,,M-106A Flow Rate,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_106a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_106A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
fit_106b_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_106B.Scaled_Out,2,,ro,,M-106B Flow Rate,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_106b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_106B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
fit_107a_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_107A.Scaled_Out,2,,ro,,M107A Flow Rate,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_107a_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_107A.ALL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
fit_107b_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_107B.Scaled_Out,2,,ro,,M107B Flow Rate,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_107b_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,FIT_107B.ALL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
fit_109a_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_109A.Scaled_Out,2,,ro,,Outlet Slip Stream Flow Rate,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_109b_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_109B.Scaled_Out,2,,ro,,Outlet Sales Meter,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_109b_water_job,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_109B_Job_Total,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_109b_water_last_month,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_109B_Water_LastMonth,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_109b_water_lifetime,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_109B_Water_T1,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_109b_water_month,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_109B_Water_Month,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_109b_water_today,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_109B_Water_Todays,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_109b_water_yesterday,ek_facility,default,periodic,,FLOAT,,,,,Val_FIT_109B_Water_Yest,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_111_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_111.Scaled_Out,2,,ro,,FIT_111 Inlet Gas Flow Rate To ACW,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_112a_h2o2_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_112A.Scaled_Out,2,,ro,,H2O2 Flow Rate,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
fit_112b_nahso3_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,FIT_112B.Scaled_Out,2,,ro,,NaHSO3 Flow Rate,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
h2o2_chemical_rate,ek_facility,default,periodic,,INT,,0,,,Chemical_Pump_1_Rate,,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
li_103D_level_alm,ek_facility,default,periodic,,BIT,,,,0,LI_103D_FBK,,,ro,,ACW Containment Level Tripped (Red When Tripped Please),none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
lit_101_level,ek_facility,default,periodic,,FLOAT,,,,,LIT_101.Scaled_Out,2,,ro,,Chamber 5 Skim Level In Weir,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
lit_112a_h2o2_level,ek_facility,default,periodic,,FLOAT,,,,,LIT_112A.Scaled_Out,2,,ro,,H2O2 Chemical Level,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
lit_112b_nahso3_level,ek_facility,default,periodic,,FLOAT,,,,,LIT_112B.Scaled_Out,2,,ro,,NaHSO3 Chemical Level,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
lit_116a_hi_alm,ek_facility,default,periodic,,BIT,,,,0,LIT_116A.AH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
lit_116a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,LIT_116A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
lit_116a_level,ek_facility,default,periodic,,FLOAT,,,,,LIT_116A.Scaled_Out,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
lit_116b_hi_alm,ek_facility,default,periodic,,BIT,,,,0,LIT_116B.AH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
lit_116b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,LIT_116B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
lit_116b_level,ek_facility,default,periodic,,FLOAT,,,,,LIT_116B.Scaled_Out,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
lit_170_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,LIT_170.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
lit_170_level,ek_facility,default,periodic,,FLOAT,,,,,LIT_170.Scaled_Out,2,,ro,,Chamber 5 Level GWR,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
lit_200_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,LIT_200.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
lit_200_level,ek_facility,default,periodic,,FLOAT,,,,,LIT_200.Scaled_Out,2,,ro,,Chamber 5 Level DP,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
lsh_114_alm,ek_facility,default,periodic,,BIT,,,,0,LSH_114.ALARM,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
lsh_120_alm,ek_facility,default,periodic,,BIT,,,,0,LSH-120.ALARM,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
lsh_120_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,LSH_120,,,ro,,ACW Chamber 5 Level HiHi Switch Tripped (Red When Tripped Please),none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
m106a_vfd_active,ek_facility,default,periodic,,BIT,,,,0,M106A_VFD:I.Active,,,ro,,M-106A Run Status,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
m106a_vfd_faulted_alm,ek_facility,default,periodic,,BIT,,,,0,M106A_VFD:I.Faulted,,,ro,,M-106A Fault Status,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
m106a_vfd_frequency,ek_facility,default,periodic,,INT,,0,,,M106A_VFD:I.OutputFreq,,,ro,,M-106A Current Output Frequency,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
m106a_vfd_start,ek_facility,default,periodic,,BIT,,,,0,M106A_VFD:O.Start,,,ro,,M-106A Start Command,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
m106a_vfd_stop,ek_facility,default,periodic,,BIT,,,,0,M106A_VFD:O.Stop,,,ro,,M-106A Stop Command,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
m106b_vfd_active,ek_facility,default,periodic,,BIT,,,,0,M106B_VFD:I.Active,,,ro,,M-106B Run Status,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
m106b_vfd_faulted_alm,ek_facility,default,periodic,,BIT,,,,0,M106B_VFD:I.Faulted,,,ro,,M-106B Fault Status,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
m106b_vfd_frequency,ek_facility,default,periodic,,INT,,0,,,M106B_VFD:I.OutputFreq,,,ro,,M-106B Current Output Frequency,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
m106b_vfd_start,ek_facility,default,periodic,,BIT,,,,0,M106B_VFD:O.Start,,,ro,,M-106B Start Command,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
m106b_vfd_stop,ek_facility,default,periodic,,BIT,,,,0,M106B_VFD:O.Stop,,,ro,,M-106B Stop Command,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
n2_inlet_pressure,ek_facility,default,periodic,,FLOAT,,,,,Val_N2_Inlet_PSI,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
n2_outlet_flow_rate,ek_facility,default,periodic,,FLOAT,,,,,Val_N2_Outlet_Flow_Rate,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
n2_outlet_pressure,ek_facility,default,periodic,,FLOAT,,,,,Val_ N2_Outlet_ PSI,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
n2_outlet_temp,ek_facility,default,periodic,,FLOAT,,,,,Val_N2_Outlet_Temp,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
n2_purity,ek_facility,default,periodic,,FLOAT,,,,,Val_N2_N2_Purity,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
p100_auto,ek_facility,default,periodic,,BIT,,,,0,P100_Auto,,,ro,,M-104 Onyx Pump HOA Auto Status,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
p100_hand,ek_facility,default,periodic,,BIT,,,,0,P100_Hand,,,ro,,M-104 Onyx Pump HOA Hand Status,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
p200_auto,ek_facility,default,periodic,,BIT,,,,0,P200_Auto,,,ro,,M-105 Skim Pump HOA Hand Status,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
p200_hand,ek_facility,default,periodic,,BIT,,,,0,P200_Hand,,,ro,,M-105 Skim Pump HOA Auto Status,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pdi_065_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PDI_065.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pdi_065_lo_alm,ek_facility,default,periodic,,BIT,,,,0,PDI_065.AL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pdi_065_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,PDI_065.ALL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pdi_065_pressure,ek_facility,default,periodic,,FLOAT,,,,,PDI_065.AI_Scaled,2,,ro,,M-104 Onyx Pump Discharge PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pdt_108a_hi_alm,ek_facility,default,periodic,,BIT,,,,0,PDT_108A.AH,,,ro,,Sock Filter High Differential PSI,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pdt_108a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PDT_108A.AHH,,,ro,,Sock Filter High High Differential PSI,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pdt_108b_hi_alm,ek_facility,default,periodic,,BIT,,,,0,PDT_108B.AH,,,ro,,Cartrige Filter #1 High Differential PSI,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pdt_108b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PDT_108B.AHH,,,ro,,Cartrige Filter #1 High High Differential PSI,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pdt_108b_pressure,ek_facility,default,periodic,,FLOAT,,,,,PDT_108B.AI_Scaled,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pdt_108c_hi_alm,ek_facility,default,periodic,,BIT,,,,0,PDT_108C.AH,,,ro,,Cartrige Filter #2 High Differential PSI,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pdt_108c_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PDT_108C.AHH,,,ro,,Cartrige Filter #2 High High Differential PSI,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pdt_108c_pressure,ek_facility,default,periodic,,FLOAT,,,,,PDT_108C.AI_Scaled,2,,ro,,Differential PSI Across Cartrige Filter #2,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_050_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_050.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_050_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_050.Scaled_Out,2,,ro,,PIT-104A Onyx Pump Suction PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_065_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_065.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_065_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_065.Scaled_Out,2,,ro,,PIT_104D Onyx Pump Discharge PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_100_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_100.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_100_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_100.Scaled_Out,2,,ro,,M-105 Skim Pump Discharge PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_100a_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_100A.Scaled_Out,2,,ro,psi,Inlet PSI External To ACW,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_101a_hi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_101A.AH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_101a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_101A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_101a_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_101A.Scaled_Out,2,,ro,psi,"Inlet PSI Internal To ACW, Before SDV-101A",none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_101a_transmitter_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_101A.XFail,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_101b_hi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_P101B.AH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_101b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_101B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_101b_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_101B.Scaled_Out,2,,ro,psi,"Inlet PSI Internal To ACW, After SDV-101A",none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_101b_transmitter_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_101B.XFail,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_101c_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_101C.Scaled_Out,2,,ro,psi,Reject Stream PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_102_hi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_102.AH,,,ro,,Indicated if PIT102 is in Hi alarm state,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_102_hi_spt,ek_facility,default,periodic,,BIT,,,,0,PIT_102.AH_SP,,,ro,,"PIT_102 Hi Alarm Setpoint, If needed",none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_102_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_102.AHH,,,ro,,Indicates if PIT102 is in HiHi alarm state,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_102_hihi_spt,ek_facility,default,periodic,,BIT,,,,0,PIT_102.AHH_SP,,,ro,,PIT_102 HiHi Alarm Setpoint If Needed,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_102_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_102.Scaled_Out,2,,ro,,Inlet PSI To Reaction Tank,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_106a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_106A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_106a_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_106A.Scaled_Out,2,,ro,,M-106A Discharge PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_106b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_106B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_106b_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_106B.Scaled_Out,2,,ro,,M-106B Discharge PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_106c_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_106C.Scaled_Out,2,,ro,,"Reject Stream Discharge Header PSI, Pre SDV 106",none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_106d_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_106D.Scaled_Out,2,,ro,,"Reject Stream Discharge Header PSI, Post SDV106",none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_107a_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_107A.ALL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_107a_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_107A.Scaled_Out,2,,ro,,M107A & M107B Suction Header PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_107b_lolo_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_107B.ALL,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_107b_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_107B.Scaled_Out,2,,ro,,M107A Discharge PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_107c_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_107C.Scaled_Out,2,,ro,,M107A and M107B Discharge Flow Line PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_107d_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_107D.Scaled_Out,2,,ro,,M107B Discharge PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_108_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108G.Scaled_Out,2,,ro,,Post Filter Flow Line PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_108a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_108A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_108a_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108A.Scaled_Out,2,,ro,,Pre Sock Filter PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_108b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_108B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_108b_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108B.Scaled_Out,2,,ro,,Post Sock Filter PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_108c_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_108C.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_108c_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108C.Scaled_Out,2,,ro,,Pre Cartrige Filter #1 PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_108d_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108D.Scaled_Out,2,,ro,,Post Cartrige Filter #1 PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_108e_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108E.Scaled_Out,2,,ro,,Pre Cartrige Filter #2 PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_108f_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_108F.Scaled_Out,2,,ro,,Post Cartrige Filter #2 PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_108g_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_108G.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_110_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_110.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_110_pressure,ek_facility,default,periodic,,FLOAT,,,,,PIT_110.Scaled_Out,2,,ro,,PIT_103 ACW Vapor Space Pressure,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_111a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_111A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_111a_n2,ek_facility,default,periodic,,FLOAT,,,,,PIT_111A.Scaled_Out,2,,ro,,N2 System PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_111b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_111B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_111b_n2,ek_facility,default,periodic,,FLOAT,,,,,PIT_111B.Scaled_Out,2,,ro,,Inlet Skid N2 PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pit_111c_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,PIT_111C.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pit_111c_n2,ek_facility,default,periodic,,FLOAT,,,,,PIT_111C.Scaled_Out,2,,ro,,N2 Outlet Skid PSI,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pnl_esd_alm,ek_facility,default,periodic,,BIT,,,,0,PNL_ESD.ALARM,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
psd_alm,ek_facility,default,periodic,,BIT,,,,0,CMD_PSD,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
rmt_sd_alm,ek_facility,default,periodic,,BIT,,,,0,RMT_SD.ALARM,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
scada_stop_cmd,ek_facility,default,periodic,,BIT,,,,0,CMD_Scada_Stop,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
sdv_101a,ek_facility,default,periodic,,INT,,1,7,0,Local:12:I.Data,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
sdv106_closed,ek_facility,default,periodic,,BIT,,,,0,SDV106_Closed_FBK,,,ro,,SDV106 Closed Feedback Status,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
sdv106_open,ek_facility,default,periodic,,BIT,,,,0,SDV106_Open_FBK,,,ro,,SDV106 Open Feedback Status,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
skim_total_barrels,ek_facility,default,periodic,,FLOAT,,,,,SKIM_TOTAL_BARRELS,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
spt_chemical_manual_rate,ek_facility,default,periodic,,FLOAT,,,,,SPT_Chemical_Manual_Rate,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
xy_100_run,ek_facility,default,periodic,,BIT,,,,0,XY_100,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
xy_200_run,ek_facility,default,periodic,,BIT,,,,0,XY_200,,,ro,,M-105 Run Command,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
zae_111a_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,ZAE_111A.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
zae_111b_hihi_alm,ek_facility,default,periodic,,BIT,,,,0,ZAE_111B.AHH,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
inlet_ph_temp,ek_facility,default,periodic,,FLOAT,,,,,Val_Inlet_PH_Temp,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
inlet_turbidity_temp,ek_facility,default,periodic,,FLOAT,,,,,Val_Inlet_Turbidity_Temp,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
outlet_orp_temp,ek_facility,default,periodic,,FLOAT,,,,,Val_Outlet_ORP_Temp,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
outlet_turbidity_temp,ek_facility,default,periodic,,FLOAT,,,,,Val_Outlet_Turbidity_Temp,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
|
27
Pub_Sub/fk_transfer/thingsboard/fk_transfer_v2.csv
Normal file
27
Pub_Sub/fk_transfer/thingsboard/fk_transfer_v2.csv
Normal file
@@ -0,0 +1,27 @@
|
||||
MeasuringPointName,ControllerName,GroupName,UploadType,DeadZonePercent,DataType,ArrayIndex,EnableBit,BitIndex,reverseBit,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,Pt,Ct,Mapping_table,TransDecimal,bitMap,msecSample,storageLwTSDB,DataEndianReverse,ReadOffset,ReadLength,WriteOffset,WriteLength,DataParseMethod,BitId
|
||||
discharge_in,AA_Transfer,default,periodic,,FLOAT,,,,,DisPSI_In,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
discharge_out,AA_Transfer,default,periodic,,FLOAT,,,,,DisPSI_Out,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
discharge_hi_spt,AA_Transfer,default,periodic,,FLOAT,,,,,AlarmSpt_DisPSI_Hi,2,,rw,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
discharge_lo_spt,AA_Transfer,default,periodic,,FLOAT,,,,,AlarmSpt_DisPSI_Lo,2,,rw,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
discharge_hi_alm,AA_Transfer,default,periodic,,BIT,,,,0,Alarm_DisPSI_Hi,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
discharge_lo_alm,AA_Transfer,default,periodic,,BIT,,,,0,Alarm_DisPSI_Lo,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
alarm_enable_cmd,AA_Transfer,default,periodic,,INT,,0,,,Alarm_Enable,,,rw,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
aa_flow_rate,AA_Transfer,default,periodic,,FLOAT,,,,,Flow_Rate_AA,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
aa_totalizer_1,AA_Transfer,default,periodic,,FLOAT,,,,,Totalizer_1_AA,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
flow_rate_hi_spt,AA_Transfer,default,periodic,,FLOAT,,,,,AlarmSpt_FlowRate_Hi,2,,rw,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
flow_rate_lo_spt,AA_Transfer,default,periodic,,FLOAT,,,,,AlarmSpt_FlowRate_Lo,2,,rw,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
flow_rate_hi_alm,AA_Transfer,default,periodic,,BIT,,,,0,Alarm_FlowRate_Hi,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
flow_rate_lo_alm,AA_Transfer,default,periodic,,BIT,,,,0,Alarm_FlowRate_Lo,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pond_level,AA_Transfer,default,periodic,,FLOAT,,,,,PondLvl,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pond_level_hi_spt,AA_Transfer,default,periodic,,FLOAT,,,,,AlarmSpt_PondLvl_Hi,2,,rw,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pond_level_lo_spt,AA_Transfer,default,periodic,,FLOAT,,,,,AlarmSpt_PondLvl_Lo,2,,rw,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
pond_level_hi_alm,AA_Transfer,default,periodic,,BIT,,,,0,Alarm_PondLvl_Hi,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
pond_level_lo_alm,AA_Transfer,default,periodic,,BIT,,,,0,Alarm_Pondlvl_Lo,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
power_loss_120v_alm,AA_Transfer,default,periodic,,BIT,,,,0,Alarm_PowerLoss_120V,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
vfd_ready,AA_Transfer,default,periodic,,BIT,,,,0,VFD_Ready,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
vfd_warning,AA_Transfer,default,periodic,,BIT,,,,0,VFD_Warning,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
vfd_faulted,AA_Transfer,default,periodic,,BIT,,,,0,VFD_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
vfd_running,AA_Transfer,default,periodic,,BIT,,,,0,VFD_Running,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
vfd_frequency_reference,AA_Transfer,default,periodic,,FLOAT,,,,,VFD_Freq_Ref,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
vfd_frequency_output,AA_Transfer,default,periodic,,FLOAT,,,,,VFD_Output_Freq,2,,ro,,,none,,,,,,,,,,,,,,,1,,,,,,,
|
||||
vfd_start_stop,AA_Transfer,default,periodic,,BIT,,,,0,VFD_Start_Stop_Pushbutton,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,
|
||||
|
1067
Pub_Sub/gateway/thingsboard/aa-pond-gateway.cfg
Normal file
1067
Pub_Sub/gateway/thingsboard/aa-pond-gateway.cfg
Normal file
File diff suppressed because one or more lines are too long
292
Pub_Sub/gateway/thingsboard/pub/aa-pond.py
Normal file
292
Pub_Sub/gateway/thingsboard/pub/aa-pond.py
Normal file
@@ -0,0 +1,292 @@
|
||||
# Enter your python code.
|
||||
import json, os, time
|
||||
from datetime import datetime as dt
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
from quickfaas.global_dict import get as get_params
|
||||
from quickfaas.global_dict import _set_global_args
|
||||
|
||||
def chunk_payload(payload, chunk_size=20, is_attributes_payload=False):
|
||||
if is_attributes_payload:
|
||||
# For attributes payload, chunk the controllers
|
||||
controllers = list(payload.items())
|
||||
for i in range(0, len(controllers), chunk_size):
|
||||
yield dict(controllers[i:i + chunk_size])
|
||||
else:
|
||||
# For data payload, chunk the values within each controller
|
||||
for controller, data in payload.items():
|
||||
for entry in data:
|
||||
ts = entry['ts']
|
||||
values = entry['values']
|
||||
chunked_values = list(values.items())
|
||||
for i in range(0, len(chunked_values), chunk_size):
|
||||
yield {
|
||||
controller:[
|
||||
{
|
||||
"ts": ts,
|
||||
"values": dict(chunked_values[i:i + chunk_size])}
|
||||
]
|
||||
}
|
||||
|
||||
def sendData(message):
|
||||
#logger.info(message)
|
||||
# Extract measures and group by ctrlName
|
||||
grouped_data = {}
|
||||
grouped_attributes = {}
|
||||
now = (round(dt.timestamp(dt.now())/600)*600)*1000
|
||||
resetPayload = {"ts": "", "values": {}}
|
||||
dayReset, weekReset, monthReset, yearReset = False, False, False, False
|
||||
for measure in message['measures']:
|
||||
ctrlName = " ".join(measure['ctrlName'].split("_"))
|
||||
name = measure['name']
|
||||
value = measure['value']
|
||||
health = measure['health']
|
||||
#Add controller for telemetry if it doesn't exist
|
||||
if ctrlName not in grouped_data:
|
||||
grouped_data[ctrlName] = {}
|
||||
#Add controller for attributes if it doesn't exist
|
||||
if ctrlName not in grouped_attributes:
|
||||
grouped_attributes[ctrlName] = {}
|
||||
#Add data to temp payload if datapoint health is good
|
||||
if health:
|
||||
if "_spt" in name:
|
||||
grouped_attributes[ctrlName][name] = value
|
||||
elif "totalizer_1" in name:
|
||||
grouped_data[ctrlName]["day_volume"], dayReset = totalizeDay(value)
|
||||
grouped_data[ctrlName]["week_volume"], weekReset = totalizeWeek(value)
|
||||
grouped_data[ctrlName]["month_volume"], monthReset = totalizeMonth(value)
|
||||
grouped_data[ctrlName]["year_volume"], yearReset = totalizeYear(value)
|
||||
elif name == "alarm_enable_cmd":
|
||||
gatewayData = {"ts": now, "values": {name: value, "connected": True}}
|
||||
grouped_data[ctrlName][name] = value
|
||||
grouped_attributes[ctrlName]["latestReportTime"] = now
|
||||
#logger.info(grouped_data)
|
||||
# Transform the grouped data to desired structure
|
||||
payload = {}
|
||||
|
||||
for key, value in grouped_data.items():
|
||||
if value:
|
||||
payload[key] = [{"ts": now ,"values": value}]
|
||||
attributes_payload = {}
|
||||
for key, value in grouped_attributes.items():
|
||||
if value:
|
||||
attributes_payload[key] = value
|
||||
|
||||
if dayReset:
|
||||
logger.info("MADE IT TO DAY RESET")
|
||||
resetPayload["values"]["yesterday_volume"] = payload["values"]["day_volume"]
|
||||
resetPayload["values"]["day_volume"] = 0
|
||||
if weekReset:
|
||||
resetPayload["values"]["last_week_volume"] = payload["values"]["week_volume"]
|
||||
resetPayload["values"]["week_volume"] = 0
|
||||
if monthReset:
|
||||
resetPayload["values"]["last_month_volume"] = payload["values"]["month_volume"]
|
||||
resetPayload["values"]["month_volume"] = 0
|
||||
if yearReset:
|
||||
resetPayload["values"]["last_year_volume"] = payload["values"]["year_volume"]
|
||||
resetPayload["values"]["year_volume"] = 0
|
||||
|
||||
if resetPayload["values"]:
|
||||
logger.info("MADE IT TO APPEND RESET")
|
||||
payload["AA Transfer"].append({"ts": now + 1000 ,"values": resetPayload["values"]})
|
||||
|
||||
logger.info(json.dumps(payload, indent=4))
|
||||
#logger.info(json.dumps(payload, indent=4))
|
||||
#logger.debug(payload)
|
||||
#publish(__topic__, json.dumps(payload), __qos__,cloud_name="default")
|
||||
publish("v1/gateway/attributes", json.dumps(attributes_payload), __qos__,cloud_name="default")
|
||||
publish("v1/devices/me/telemetry", json.dumps(gatewayData), __qos__, cloud_name="default")
|
||||
|
||||
for chunk in chunk_payload(payload=payload):
|
||||
publish(__topic__, json.dumps(chunk), __qos__, cloud_name="default")
|
||||
#logger.info(json.dumps(chunk, indent=4))
|
||||
time.sleep(2)
|
||||
"""
|
||||
for chunk in chunk_payload(payload=attributes_payload, is_attributes_payload=True):
|
||||
publish("v1/gateway/attributes", json.dumps(chunk), __qos__, cloud_name="default")
|
||||
logger.info(json.dumps(chunk, indent=4))
|
||||
time.sleep(2)
|
||||
"""
|
||||
|
||||
|
||||
def initialize_totalizers():
|
||||
return {
|
||||
"day": 0,
|
||||
"week": 0,
|
||||
"month": 0,
|
||||
"year": 0,
|
||||
"lifetime": 0,
|
||||
"dayHolding": 0,
|
||||
"weekHolding": 0,
|
||||
"monthHolding": 0,
|
||||
"yearHolding": 0
|
||||
}
|
||||
|
||||
def getTotalizers(file_path="/var/user/files/totalizers.json"):
|
||||
"""
|
||||
Retrieves totalizer data from a JSON file.
|
||||
|
||||
:param file_path: Path to the JSON file storing totalizer data.
|
||||
:return: Dictionary containing totalizer values.
|
||||
"""
|
||||
try:
|
||||
with open(file_path, "r") as t:
|
||||
totalizers = json.load(t)
|
||||
if not totalizers or not isinstance(totalizers, dict):
|
||||
logger.info("Invalid data format in the file. Initializing totalizers.")
|
||||
totalizers = initialize_totalizers()
|
||||
except FileNotFoundError:
|
||||
logger.info("File not found. Initializing totalizers.")
|
||||
totalizers = initialize_totalizers()
|
||||
except json.JSONDecodeError:
|
||||
timestamp = dt.now().strftime("%Y%m%d_%H%M%S")
|
||||
# Split the file path and insert the timestamp before the extension
|
||||
file_name, file_extension = os.path.splitext(file_path)
|
||||
backup_file_path = f"{file_name}_{timestamp}{file_extension}"
|
||||
shutil.copyfile(file_path, backup_file_path)
|
||||
logger.error(f"Error decoding JSON. A backup of the file is created at {backup_file_path}. Initializing totalizers.")
|
||||
totalizers = initialize_totalizers()
|
||||
return totalizers
|
||||
|
||||
def saveTotalizers(totalizers, file_path="/var/user/files/totalizers.json"):
|
||||
"""
|
||||
Saves totalizer data to a JSON file.
|
||||
|
||||
:param totalizers: Dictionary containing totalizer values to be saved.
|
||||
:param file_path: Path to the JSON file where totalizer data will be saved.
|
||||
"""
|
||||
try:
|
||||
with open(file_path, "w") as t:
|
||||
json.dump(totalizers, t)
|
||||
except (IOError, OSError, json.JSONEncodeError) as e:
|
||||
logger.error(f"Error saving totalizers to {file_path}: {e}")
|
||||
raise # Optionally re-raise the exception if it should be handled by the caller
|
||||
|
||||
|
||||
def totalizeDay(lifetime, max_retries=3, retry_delay=2):
|
||||
"""
|
||||
Update and save daily totalizers based on the lifetime value.
|
||||
|
||||
:param lifetime: The current lifetime total.
|
||||
:param max_retries: Maximum number of save attempts.
|
||||
:param retry_delay: Delay in seconds between retries.
|
||||
:return: A tuple containing the calculated value and a boolean indicating if a reset occurred, or (None, False) if save fails.
|
||||
"""
|
||||
totalizers = getTotalizers()
|
||||
now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)
|
||||
reset = False
|
||||
value = lifetime - totalizers["dayHolding"]
|
||||
|
||||
if not int(now.strftime("%d")) == int(totalizers["day"]):
|
||||
totalizers["dayHolding"] = lifetime
|
||||
totalizers["day"] = int(now.strftime("%d"))
|
||||
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
saveTotalizers(totalizers)
|
||||
reset = True
|
||||
return (value, reset)
|
||||
except Exception as e:
|
||||
logger.error(f"Attempt {attempt + 1} failed to save totalizers: {e}")
|
||||
if attempt < max_retries - 1:
|
||||
time.sleep(retry_delay)
|
||||
else:
|
||||
logger.error("All attempts to save totalizers failed.")
|
||||
return (None, False)
|
||||
|
||||
return (value, reset)
|
||||
|
||||
def totalizeWeek(lifetime, max_retries=3, retry_delay=2):
|
||||
"""
|
||||
Update and save weekly totalizers based on the lifetime value.
|
||||
|
||||
:param lifetime: The current lifetime total.
|
||||
:param max_retries: Maximum number of save attempts.
|
||||
:param retry_delay: Delay in seconds between retries.
|
||||
:return: A tuple containing the calculated value and a boolean indicating if a reset occurred, or (None, False) if save fails.
|
||||
"""
|
||||
totalizers = getTotalizers()
|
||||
now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)
|
||||
reset = False
|
||||
value = lifetime - totalizers["weekHolding"]
|
||||
if (not now.strftime("%U") == totalizers["week"] and now.strftime("%a") == "Sun") or totalizers["week"] == 0:
|
||||
totalizers["weekHolding"] = lifetime
|
||||
totalizers["week"] = now.strftime("%U")
|
||||
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
saveTotalizers(totalizers)
|
||||
reset = True
|
||||
return (value, reset)
|
||||
except Exception as e:
|
||||
logger.error(f"Attempt {attempt + 1} failed to save totalizers: {e}")
|
||||
if attempt < max_retries - 1:
|
||||
time.sleep(retry_delay)
|
||||
else:
|
||||
logger.error("All attempts to save totalizers failed.")
|
||||
return (None, False)
|
||||
return (value, reset)
|
||||
|
||||
def totalizeMonth(lifetime, max_retries=3, retry_delay=2):
|
||||
"""
|
||||
Update and save monthly totalizers based on the lifetime value.
|
||||
|
||||
:param lifetime: The current lifetime total.
|
||||
:param max_retries: Maximum number of save attempts.
|
||||
:param retry_delay: Delay in seconds between retries.
|
||||
:return: A tuple containing the calculated value and a boolean indicating if a reset occurred, or (None, False) if save fails.
|
||||
"""
|
||||
totalizers = getTotalizers()
|
||||
now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)
|
||||
reset = False
|
||||
value = lifetime - totalizers["monthHolding"]
|
||||
if not int(now.strftime("%m")) == int(totalizers["month"]):
|
||||
totalizers["monthHolding"] = lifetime
|
||||
totalizers["month"] = now.strftime("%m")
|
||||
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
saveTotalizers(totalizers)
|
||||
reset = True
|
||||
return (value, reset)
|
||||
except Exception as e:
|
||||
logger.error(f"Attempt {attempt + 1} failed to save totalizers: {e}")
|
||||
if attempt < max_retries - 1:
|
||||
time.sleep(retry_delay)
|
||||
else:
|
||||
logger.error("All attempts to save totalizers failed.")
|
||||
return (None, False)
|
||||
|
||||
return (value,reset)
|
||||
|
||||
def totalizeYear(lifetime, max_retries=3, retry_delay=2):
|
||||
"""
|
||||
Update and save yearly totalizers based on the lifetime value.
|
||||
|
||||
:param lifetime: The current lifetime total.
|
||||
:param max_retries: Maximum number of save attempts.
|
||||
:param retry_delay: Delay in seconds between retries.
|
||||
:return: A tuple containing the calculated value and a boolean indicating if a reset occurred, or (None, False) if save fails.
|
||||
"""
|
||||
totalizers = getTotalizers()
|
||||
now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)
|
||||
reset = False
|
||||
value = lifetime - totalizers["yearHolding"]
|
||||
if not int(now.strftime("%Y")) == int(totalizers["year"]):
|
||||
totalizers["yearHolding"] = lifetime
|
||||
totalizers["year"] = now.strftime("%Y")
|
||||
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
saveTotalizers(totalizers)
|
||||
reset = True
|
||||
return (value, reset)
|
||||
except Exception as e:
|
||||
logger.error(f"Attempt {attempt + 1} failed to save totalizers: {e}")
|
||||
if attempt < max_retries - 1:
|
||||
time.sleep(retry_delay)
|
||||
else:
|
||||
logger.error("All attempts to save totalizers failed.")
|
||||
return (None, False)
|
||||
return (value, reset)
|
||||
|
||||
97
Pub_Sub/gateway/thingsboard/sub/aa-gateway-attributes.py
Normal file
97
Pub_Sub/gateway/thingsboard/sub/aa-gateway-attributes.py
Normal file
@@ -0,0 +1,97 @@
|
||||
import json, time
|
||||
from datetime import datetime as dt
|
||||
from quickfaas.measure import recall, write
|
||||
from quickfaas.remotebus import publish
|
||||
from common.Logger import logger
|
||||
|
||||
def chunk_payload(payload, chunk_size=20, is_attributes_payload=False):
|
||||
if is_attributes_payload:
|
||||
# For attributes payload, chunk the controllers
|
||||
controllers = list(payload.items())
|
||||
for i in range(0, len(controllers), chunk_size):
|
||||
yield dict(controllers[i:i + chunk_size])
|
||||
else:
|
||||
# For data payload, chunk the values within each controller
|
||||
for controller, data in payload.items():
|
||||
for entry in data:
|
||||
ts = entry['ts']
|
||||
values = entry['values']
|
||||
chunked_values = list(values.items())
|
||||
for i in range(0, len(chunked_values), chunk_size):
|
||||
yield {
|
||||
controller:[
|
||||
{
|
||||
"ts": ts,
|
||||
"values": dict(chunked_values[i:i + chunk_size])}
|
||||
]
|
||||
}
|
||||
|
||||
def sync():
|
||||
#get new values and send
|
||||
now = round(dt.timestamp(dt.now()))*1000
|
||||
topic = "v1/gateway/telemetry"
|
||||
try:
|
||||
data = recall()#json.loads(recall().decode("utf-8"))
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.debug(data)
|
||||
logger.info("SYNCING")
|
||||
grouped_data = {}
|
||||
try:
|
||||
for controller in data:
|
||||
ctrlName = " ".join(controller['name'].split("_"))
|
||||
for measure in controller["measures"]:
|
||||
if ctrlName not in grouped_data:
|
||||
grouped_data[ctrlName] = {}
|
||||
if measure["health"]:
|
||||
if measure["name"] == "alarm_enable_cmd":
|
||||
gatewayPayload = {"ts": now, "values": {measure["name"]: measure["value"]}}
|
||||
grouped_data[ctrlName][measure["name"]] = measure["value"]
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
try:
|
||||
payload = {}
|
||||
for key, value in grouped_data.items():
|
||||
if value:
|
||||
payload[key] = [{"ts": now ,"values": value}]
|
||||
publish("v1/devices/me/telemetry", json.dumps(gatewayPayload), qos=1,cloud_name="default")
|
||||
|
||||
for chunk in chunk_payload(payload=payload):
|
||||
publish(topic, json.dumps(chunk), qos=1, cloud_name="default")
|
||||
logger.info(json.dumps(chunk, indent=4))
|
||||
time.sleep(2)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
def writeplctag(value):
|
||||
#value in the form {"measurement": <measurement_name>, "value": <value to write>}
|
||||
try:
|
||||
#value = json.loads(value.replace("'",'"'))
|
||||
logger.debug(value)
|
||||
#payload format: [{"name": "advvfdipp", "measures": [{"name": "manualfrequencysetpoint", "value": 49}]}]
|
||||
message = [{"name": "AA_Transfer", "measures":[{"name":value["measurement"], "value": value["value"]}]}]
|
||||
resp = write(message)
|
||||
logger.debug("RETURN FROM WRITE: {}".format(resp))
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
return False
|
||||
|
||||
def receiveAttributes(topic, payload):
|
||||
try:
|
||||
logger.debug(topic)
|
||||
logger.debug(json.loads(payload))
|
||||
p = json.loads(payload)
|
||||
for key, value in p.items():
|
||||
try:
|
||||
result = writeplctag({"measurement":key, "value":value})
|
||||
logger.debug(result)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
#logger.debug(command)
|
||||
sync()
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
|
||||
|
||||
104
Pub_Sub/gateway/thingsboard/sub/aa-gateway-rpc.py
Normal file
104
Pub_Sub/gateway/thingsboard/sub/aa-gateway-rpc.py
Normal file
@@ -0,0 +1,104 @@
|
||||
import json, time
|
||||
from datetime import datetime as dt
|
||||
from quickfaas.measure import recall, write
|
||||
from quickfaas.remotebus import publish
|
||||
from common.Logger import logger
|
||||
|
||||
def chunk_payload(payload, chunk_size=20, is_attributes_payload=False):
|
||||
if is_attributes_payload:
|
||||
# For attributes payload, chunk the controllers
|
||||
controllers = list(payload.items())
|
||||
for i in range(0, len(controllers), chunk_size):
|
||||
yield dict(controllers[i:i + chunk_size])
|
||||
else:
|
||||
# For data payload, chunk the values within each controller
|
||||
for controller, data in payload.items():
|
||||
for entry in data:
|
||||
ts = entry['ts']
|
||||
values = entry['values']
|
||||
chunked_values = list(values.items())
|
||||
for i in range(0, len(chunked_values), chunk_size):
|
||||
yield {
|
||||
controller:[
|
||||
{
|
||||
"ts": ts,
|
||||
"values": dict(chunked_values[i:i + chunk_size])}
|
||||
]
|
||||
}
|
||||
|
||||
def sync():
|
||||
#get new values and send
|
||||
now = round(dt.timestamp(dt.now()))*1000
|
||||
topic = "v1/gateway/telemetry"
|
||||
try:
|
||||
data = recall()#json.loads(recall().decode("utf-8"))
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.debug(data)
|
||||
logger.info("SYNCING")
|
||||
grouped_data = {}
|
||||
try:
|
||||
for controller in data:
|
||||
ctrlName = " ".join(controller['name'].split("_"))
|
||||
for measure in controller["measures"]:
|
||||
if ctrlName not in grouped_data:
|
||||
grouped_data[ctrlName] = {}
|
||||
if measure["health"]:
|
||||
if measure["name"] == "alarm_enable_cmd":
|
||||
gatewayPayload = {"ts": now, "values": {measure["name"]: measure["value"]}}
|
||||
grouped_data[ctrlName][measure["name"]] = measure["value"]
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
try:
|
||||
payload = {}
|
||||
for key, value in grouped_data.items():
|
||||
if value:
|
||||
payload[key] = [{"ts": now ,"values": value}]
|
||||
publish("v1/devices/me/telemetry", json.dumps(gatewayPayload), qos=1,cloud_name="default")
|
||||
|
||||
for chunk in chunk_payload(payload=payload):
|
||||
publish(topic, json.dumps(chunk), qos=1, cloud_name="default")
|
||||
logger.info(json.dumps(chunk, indent=4))
|
||||
time.sleep(2)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
def writeplctag(value):
|
||||
#value in the form {"measurement": <measurement_name>, "value": <value to write>}
|
||||
try:
|
||||
logger.debug(value)
|
||||
#payload format: [{"name": "advvfdipp", "measures": [{"name": "manualfrequencysetpoint", "value": 49}]}]
|
||||
message = [{"name": value["entityName"], "measures":[{"name":value["measurement"], "value": value["value"]}]}]
|
||||
resp = write(message)
|
||||
logger.debug("RETURN FROM WRITE: {}".format(resp))
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
return False
|
||||
|
||||
def receiveCommand(topic, payload):
|
||||
try:
|
||||
logger.debug(topic)
|
||||
logger.debug(json.loads(payload))
|
||||
p = json.loads(payload)
|
||||
command = p["method"]
|
||||
commands = {
|
||||
"sync": sync,
|
||||
"writeplctag": writeplctag,
|
||||
}
|
||||
if command == "setPLCTag":
|
||||
try:
|
||||
result = commands["writeplctag"](p["params"])
|
||||
logger.debug(result)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
ack(topic.split("/")[-1])
|
||||
time.sleep(5)
|
||||
sync()
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
|
||||
def ack(msgid):
|
||||
publish("v1/devices/me/rpc/response/" + str(msgid), json.dumps({"msg": {"time": time.time()}, "metadata": "", "msgType": ""}), 1, cloud_name="default")
|
||||
1526
Pub_Sub/oradvvfdipp/thingsboard/intermediate_config.cfg
Normal file
1526
Pub_Sub/oradvvfdipp/thingsboard/intermediate_config.cfg
Normal file
File diff suppressed because one or more lines are too long
515
Pub_Sub/oradvvfdipp/thingsboard/pub/sendData.py
Normal file
515
Pub_Sub/oradvvfdipp/thingsboard/pub/sendData.py
Normal file
@@ -0,0 +1,515 @@
|
||||
import json, os, time, math, uuid
|
||||
from datetime import datetime as dt
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
from quickfaas.global_dict import get as get_params
|
||||
from quickfaas.global_dict import _set_global_args
|
||||
|
||||
class RuntimeStats:
|
||||
def __init__(self):
|
||||
self.runs = {}
|
||||
self.currentRun = 0
|
||||
self.today = ""
|
||||
self.todayString = ""
|
||||
|
||||
def manageTime(self):
|
||||
if self.todayString != dt.strftime(dt.today(), "%Y-%m-%d"):
|
||||
if self.runs[self.todayString]["run_" + str(self.currentRun)]["start"] and not self.runs[self.todayString]["run_" + str(self.currentRun)]["end"]:
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["end"] = time.mktime(dt.strptime(self.todayString + " 23:59:59", "%Y-%m-%d %H:%M:%S").timetuple())
|
||||
self.addDay()
|
||||
self.today = dt.today()
|
||||
self.todayString = dt.strftime(self.today, "%Y-%m-%d")
|
||||
days = list(self.runs.keys())
|
||||
days.sort()
|
||||
while (dt.strptime(days[-1],"%Y-%m-%d") - dt.strptime(days[0], "%Y-%m-%d")).days > 30:
|
||||
self.removeDay(day=days[0])
|
||||
days = list(self.runs.keys())
|
||||
days.sort()
|
||||
|
||||
def addHertzDataPoint(self, frequency):
|
||||
if frequency > 0:
|
||||
self.manageTime()
|
||||
try:
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["frequencies"].append(frequency)
|
||||
except:
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["frequencies"] = [frequency]
|
||||
|
||||
def startRun(self):
|
||||
if self.checkRunning():
|
||||
self.endRun()
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["start"] = time.time()
|
||||
|
||||
def endRun(self):
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["end"] = time.time()
|
||||
self.currentRun += 1
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)] = {"start":0, "end": 0, "frequencies":[]}
|
||||
|
||||
def checkRunning(self):
|
||||
if self.runs[self.todayString]["run_" + str(self.currentRun)]["start"] and not self.runs[self.todayString]["run_" + str(self.currentRun)]["end"]:
|
||||
return True
|
||||
return False
|
||||
|
||||
def addDay(self):
|
||||
self.today = dt.today()
|
||||
self.todayString = dt.strftime(self.today, "%Y-%m-%d")
|
||||
self.currentRun = 1
|
||||
self.runs[self.todayString] = {}
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)] = {"start":0, "end": 0, "frequencies":[]}
|
||||
|
||||
def countRunsDay(self, day=None):
|
||||
if not day:
|
||||
day = self.todayString
|
||||
return len(self.runs[day].keys())
|
||||
|
||||
def countRunsMultiDay(self, numDays=30):
|
||||
total_runs = 0
|
||||
for day in list(self.runs.keys()):
|
||||
total_runs += self.countRunsDay(day=day)
|
||||
return total_runs
|
||||
|
||||
def calculateAverageHertzDay(self, day=None, returnArray=False):
|
||||
dayFrequencies = []
|
||||
if not day:
|
||||
day = self.todayString
|
||||
for run in list(self.runs[day].keys()):
|
||||
try:
|
||||
dayFrequencies += self.runs[day][run]["frequencies"]
|
||||
except Exception as e:
|
||||
print("{} missing frequency data for {}".format(day,run))
|
||||
if returnArray:
|
||||
return dayFrequencies
|
||||
return round(math.fsum(dayFrequencies)/len(dayFrequencies),2)
|
||||
|
||||
def calculateAverageHertzMultiDay(self, numDays=30):
|
||||
self.manageTime()
|
||||
frequencies = []
|
||||
for day in list(self.runs.keys()):
|
||||
if not day == self.todayString and (dt.strptime(self.todayString, "%Y-%m-%d") - dt.strptime(day, "%Y-%m-%d")).days <= numDays:
|
||||
try:
|
||||
frequencies += self.calculateAverageHertzDay(day=day, returnArray=True)
|
||||
except Exception as e:
|
||||
print("{} missing frequency data".format(day))
|
||||
if len(frequencies):
|
||||
return round(math.fsum(frequencies)/len(frequencies), 2)
|
||||
return 0
|
||||
|
||||
def calculateRunTimeDay(self, day=None, convertToHours=True):
|
||||
total_time = 0
|
||||
if not day:
|
||||
day = self.todayString
|
||||
for run in list(self.runs[day].keys()):
|
||||
total_time = self.runs[day][run]["end"] - self.runs[day][run]["start"] + total_time
|
||||
if convertToHours:
|
||||
return self.convertSecondstoHours(total_time)
|
||||
return total_time
|
||||
|
||||
def calculateRunTimeMultiDay(self, numDays=30, convertToHours=True):
|
||||
total_time = 0
|
||||
for day in list(self.runs.keys()):
|
||||
if not day == self.todayString and (dt.strptime(self.todayString, "%Y-%m-%d") - dt.strptime(day, "%Y-%m-%d")).days <= numDays:
|
||||
total_time += self.calculateRunTimeDay(day=day, convertToHours=False)
|
||||
if convertToHours:
|
||||
return self.convertSecondstoHours(total_time)
|
||||
return total_time
|
||||
|
||||
def calculateRunPercentDay(self, day=None, precise=False):
|
||||
if not day:
|
||||
day = self.todayString
|
||||
if precise:
|
||||
return (self.calculateRunTimeDay(day=day)/24) * 100
|
||||
return round((self.calculateRunTimeDay(day=day)/24) * 100, 2)
|
||||
|
||||
|
||||
def calculateRunPercentMultiDay(self, numDays=30, precise=False):
|
||||
self.manageTime()
|
||||
if precise:
|
||||
return (self.calculateRunTimeMultiDay()/(24*numDays)) * 100
|
||||
return round((self.calculateRunTimeMultiDay()/(24*numDays)) * 100,2)
|
||||
|
||||
def removeDay(self, day=None):
|
||||
if not day:
|
||||
raise Exception("Day can not be None")
|
||||
print("removing day {}".format(day))
|
||||
del self.runs[day]
|
||||
|
||||
def convertSecondstoHours(self, seconds):
|
||||
return round(seconds / (60*60),2)
|
||||
|
||||
def loadDataFromFile(self, filePath="/var/user/files/runtimestats.json"):
|
||||
try:
|
||||
with open(filePath, "r") as f:
|
||||
temp = json.load(f)
|
||||
self.runs = temp["data"]
|
||||
self.currentRun = temp["current_run"]
|
||||
self.today = dt.strptime(temp["current_day"], "%Y-%m-%d")
|
||||
self.todayString = temp["current_day"]
|
||||
self.manageTime()
|
||||
except:
|
||||
print("Could not find file at {}".format(filePath))
|
||||
print("creating file")
|
||||
self.addDay()
|
||||
try:
|
||||
with open(filePath, "w") as f:
|
||||
d = {
|
||||
"current_run": self.currentRun,
|
||||
"current_day": self.todayString,
|
||||
"data": self.runs
|
||||
}
|
||||
json.dump(d, f, indent=4)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
def saveDataToFile(self, filePath="/var/user/files/runtimestats.json"):
|
||||
try:
|
||||
print("Saving Runs")
|
||||
with open(filePath, "w") as f:
|
||||
d = {
|
||||
"current_run": self.currentRun,
|
||||
"current_day": self.todayString,
|
||||
"data": self.runs
|
||||
}
|
||||
json.dump(d, f, indent=4)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
try:
|
||||
rts_path = "/var/user/files/runtimestats_tb.json"
|
||||
rts = RuntimeStats()
|
||||
rts.loadDataFromFile(filePath=rts_path)
|
||||
rts.saveDataToFile(filePath=rts_path)
|
||||
except Exception as e:
|
||||
logger.error(f"Error in TB start RTS: {e}" )
|
||||
|
||||
def reboot(reason="Rebooting for config file update"):
|
||||
#basic = Basic()
|
||||
logger.info("!" * 10 + "REBOOTING DEVICE" + "!"*10)
|
||||
logger.info(reason)
|
||||
r = os.popen("kill -s SIGHUP `cat /var/run/python/supervisord.pid`").read()
|
||||
logger.info(f"REBOOT : {r}")
|
||||
|
||||
def checkFileExist(filename):
|
||||
path = "/var/user/files"
|
||||
if not os.path.exists(path):
|
||||
logger.debug("no folder making files folder in var/user")
|
||||
os.makedirs(path)
|
||||
with open(path + "/" + filename, "a") as f:
|
||||
json.dump({}, f)
|
||||
if not os.path.exists(path + "/" + filename):
|
||||
logger.debug("no creds file making creds file")
|
||||
with open(path + "/" + filename, "a") as f:
|
||||
json.dump({}, f)
|
||||
|
||||
def convertDStoJSON(ds):
|
||||
j = dict()
|
||||
for x in ds:
|
||||
j[x["key"]] = x["value"]
|
||||
return j
|
||||
|
||||
def convertJSONtoDS(j):
|
||||
d = []
|
||||
for key in j.keys():
|
||||
d.append({"key": key, "value": j[key]})
|
||||
return d
|
||||
|
||||
def checkCredentialConfig():
|
||||
logger.debug("CHECKING CONFIG")
|
||||
cfgpath = "/var/user/cfg/device_supervisor/device_supervisor.cfg"
|
||||
credspath = "/var/user/files/creds.json"
|
||||
cfg = dict()
|
||||
with open(cfgpath, "r") as f:
|
||||
cfg = json.load(f)
|
||||
clouds = cfg.get("clouds")
|
||||
logger.debug(clouds)
|
||||
#if not configured then try to configure from stored values
|
||||
if clouds[0]["args"]["clientId"] == "unknown" or clouds[0]["args"]["username"] == "unknown" or not clouds[0]["args"]["passwd"] or clouds[0]["args"]["passwd"] == "unknown":
|
||||
checkFileExist("creds.json")
|
||||
with open(credspath, "r") as c:
|
||||
creds = json.load(c)
|
||||
if creds:
|
||||
logger.debug("updating config with stored data")
|
||||
clouds[0]["args"]["clientId"] = creds["clientId"]
|
||||
clouds[0]["args"]["username"] = creds["userName"]
|
||||
clouds[0]["args"]["passwd"] = creds["password"]
|
||||
cfg["clouds"] = clouds
|
||||
cfg = checkParameterConfig(cfg)
|
||||
with open(cfgpath, "w", encoding='utf-8') as n:
|
||||
json.dump(cfg, n, indent=1, ensure_ascii=False)
|
||||
reboot()
|
||||
else:
|
||||
#assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data
|
||||
checkFileExist("creds.json")
|
||||
with open(credspath, "r") as c:
|
||||
logger.debug("updating stored file with new data")
|
||||
cfg = checkParameterConfig(cfg)
|
||||
with open(cfgpath, "w", encoding='utf-8') as n:
|
||||
json.dump(cfg, n, indent=1, ensure_ascii=False)
|
||||
creds = json.load(c)
|
||||
if creds:
|
||||
if creds["clientId"] != clouds[0]["args"]["clientId"]:
|
||||
creds["clientId"] = clouds[0]["args"]["clientId"]
|
||||
if creds["userName"] != clouds[0]["args"]["username"]:
|
||||
creds["userName"] = clouds[0]["args"]["username"]
|
||||
if creds["password"] != clouds[0]["args"]["passwd"]:
|
||||
creds["password"] = clouds[0]["args"]["passwd"]
|
||||
else:
|
||||
creds["clientId"] = clouds[0]["args"]["clientId"]
|
||||
creds["userName"] = clouds[0]["args"]["username"]
|
||||
creds["password"] = clouds[0]["args"]["passwd"]
|
||||
with open(credspath, "w") as cw:
|
||||
json.dump(creds,cw)
|
||||
|
||||
def checkParameterConfig(cfg):
|
||||
logger.debug("Checking Parameters!!!!")
|
||||
paramspath = "/var/user/files/params.json"
|
||||
cfgparams = convertDStoJSON(cfg.get("labels"))
|
||||
#check stored values
|
||||
checkFileExist("params.json")
|
||||
with open(paramspath, "r") as f:
|
||||
logger.debug("Opened param storage file")
|
||||
params = json.load(f)
|
||||
if params:
|
||||
if cfgparams != params:
|
||||
#go through each param
|
||||
#if not "unknown" and cfg and params aren't the same take from cfg likely updated manually
|
||||
#if key in cfg but not in params copy to params
|
||||
logger.debug("equalizing params between cfg and stored")
|
||||
for key in cfgparams.keys():
|
||||
try:
|
||||
if cfgparams[key] != params[key] and cfgparams[key] != "unknown":
|
||||
params[key] = cfgparams[key]
|
||||
except:
|
||||
params[key] = cfgparams[key]
|
||||
cfg["labels"] = convertJSONtoDS(params)
|
||||
_set_global_args(convertJSONtoDS(params))
|
||||
with open(paramspath, "w") as p:
|
||||
json.dump(params, p)
|
||||
else:
|
||||
with open(paramspath, "w") as p:
|
||||
logger.debug("initializing param file with params in memory")
|
||||
json.dump(convertDStoJSON(get_params()), p)
|
||||
cfg["labels"] = get_params()
|
||||
|
||||
return cfg
|
||||
|
||||
# Helper function to split the payload into chunks
|
||||
def chunk_payload(payload, chunk_size=20):
|
||||
chunked_values = list(payload["values"].items())
|
||||
for i in range(0, len(chunked_values), chunk_size):
|
||||
yield {
|
||||
"ts": payload["ts"],
|
||||
"values": dict(chunked_values[i:i+chunk_size])
|
||||
}
|
||||
|
||||
def sendData(message):
|
||||
#logger.debug(message)
|
||||
try:
|
||||
checkCredentialConfig()
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
payload = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}}
|
||||
for measure in message["measures"]:
|
||||
try:
|
||||
logger.debug(measure)
|
||||
if abs(payload["ts"]/1000 - measure["timestamp"]) > 3600:
|
||||
reboot(reason="Poll timestamp and actual timestamp out of sync. Actual: {} Poll: {}".format(payload["ts"]/1000,measure["timestamp"]))
|
||||
if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault", "flowmeter_fault"]:
|
||||
logger.debug("Converting DINT/BOOL to STRING")
|
||||
value = convert_int(measure["name"], measure["value"])
|
||||
logger.debug("Converted {} to {}".format(measure["value"], value))
|
||||
payload["values"][measure["name"]] = value
|
||||
payload["values"][measure["name"] + "_int"] = measure["value"]
|
||||
else:
|
||||
payload["values"][measure["name"]] = measure["value"]
|
||||
if measure["name"] == "wellstatus":
|
||||
if measure["value"] == 0 and not rts.runs[rts.todayString]["run_" + str(rts.currentRun)]["start"]:
|
||||
rts.startRun()
|
||||
rts.saveDataToFile(filePath=rts_path)
|
||||
elif measure["value"] > 0 and rts.runs[rts.todayString]["run_" + str(rts.currentRun)]["start"] and not rts.runs[rts.todayString]["run_" + str(rts.currentRun)]["end"]:
|
||||
rts.endRun()
|
||||
rts.saveDataToFile(filePath=rts_path)
|
||||
logger.info(f"Adding {rts.calculateRunPercentMultiDay()} to payload as percentRunTime30Days")
|
||||
payload["values"]["percentRunTime30Days"] = rts.calculateRunPercentMultiDay()
|
||||
|
||||
|
||||
if measure["name"] == "vfdfrequency":
|
||||
if measure["value"] > 0:
|
||||
rts.addHertzDataPoint(measure["value"])
|
||||
rts.saveDataToFile(filePath=rts_path)
|
||||
logger.info(f"Adding {rts.calculateAverageHertzMultiDay()} to payload as avgFrequency30Days")
|
||||
payload["values"]["avgFrequency30Days"] = rts.calculateAverageHertzMultiDay()
|
||||
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
for chunk in chunk_payload(payload=payload):
|
||||
publish(__topic__, json.dumps(chunk), __qos__, cloud_name="ThingsBoard")
|
||||
time.sleep(2)
|
||||
publish("v1/devices/me/attributes", json.dumps({"latestReportTime": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__, cloud_name="ThingsBoard")
|
||||
|
||||
def convert_int(plc_tag, value):
|
||||
well_status_codes = {
|
||||
0: "Running",
|
||||
1: "Pumped Off",
|
||||
2: "Alarmed",
|
||||
3: "Locked Out",
|
||||
4: "Stopped"
|
||||
}
|
||||
|
||||
pid_control_codes = {
|
||||
0: "Flow",
|
||||
1: "Fluid Level",
|
||||
2: "Tubing Pressure",
|
||||
3: "Manual"
|
||||
}
|
||||
|
||||
downhole_codes = {
|
||||
0: "OK",
|
||||
1: "Connecting",
|
||||
2: "Open Circuit",
|
||||
3: "Shorted",
|
||||
4: "Cannot Decode"
|
||||
}
|
||||
|
||||
permissive_codes = {
|
||||
0: "OK",
|
||||
1: "Flow",
|
||||
2: "Intake Pressure",
|
||||
3: "Intake Temperature",
|
||||
4: "Tubing Pressure",
|
||||
5: "VFD",
|
||||
6: "Fluid Level",
|
||||
7: "Min. Downtime"
|
||||
}
|
||||
|
||||
alarm_codes = {
|
||||
0: "OK",
|
||||
1: "Alarm"
|
||||
}
|
||||
|
||||
alarm_vfd_codes = {
|
||||
0: "OK",
|
||||
1: "Locked Out"
|
||||
}
|
||||
|
||||
vfd_fault_codes = {
|
||||
0: "No Fault",
|
||||
2: "Auxiliary Input",
|
||||
3: "Power Loss",
|
||||
4: "UnderVoltage",
|
||||
5: "OverVoltage",
|
||||
7: "Motor Overload",
|
||||
8: "Heatsink OverTemp",
|
||||
9: "Thermister OverTemp",
|
||||
10: "Dynamic Brake OverTemp",
|
||||
12: "Hardware OverCurrent",
|
||||
13: "Ground Fault",
|
||||
14: "Ground Warning",
|
||||
15: "Load Loss",
|
||||
17: "Input Phase Loss",
|
||||
18: "Motor PTC Trip",
|
||||
19: "Task Overrun",
|
||||
20: "Torque Prove Speed Band",
|
||||
21: "Output Phase Loss",
|
||||
24: "Decel Inhibit",
|
||||
25: "OverSpeed Limit",
|
||||
26: "Brake Slipped",
|
||||
27: "Torque Prove Conflict",
|
||||
28: "TP Encls Confict",
|
||||
29: "Analog In Loss",
|
||||
33: "Auto Restarts Exhausted",
|
||||
35: "IPM OverCurrent",
|
||||
36: "SW OverCurrent",
|
||||
38: "Phase U to Ground",
|
||||
39: "Phase V to Ground",
|
||||
40: "Phase W to Ground",
|
||||
41: "Phase UV Short",
|
||||
42: "Phase VW Short",
|
||||
43: "Phase WU Short",
|
||||
44: "Phase UNeg to Ground",
|
||||
45: "Phase VNeg to Ground",
|
||||
46: "Phase WNeg to Ground",
|
||||
48: "System Defaulted",
|
||||
49: "Drive Powerup",
|
||||
51: "Clear Fault Queue",
|
||||
55: "Control Board Overtemp",
|
||||
59: "Invalid Code",
|
||||
61: "Shear Pin 1",
|
||||
62: "Shear Pin 2",
|
||||
64: "Drive Overload",
|
||||
66: "OW Torque Level",
|
||||
67: "Pump Off",
|
||||
71: "Port 1 Adapter",
|
||||
72: "Port 2 Adapter",
|
||||
73: "Port 3 Adapter",
|
||||
74: "Port 4 Adapter",
|
||||
75: "Port 5 Adapter",
|
||||
76: "Port 6 Adapter",
|
||||
77: "IR Volts Range",
|
||||
78: "FluxAmps Ref Range",
|
||||
79: "Excessive Load",
|
||||
80: "AutoTune Aborted",
|
||||
81: "Port 1 DPI Loss",
|
||||
82: "Port 2 DPI Loss",
|
||||
83: "Port 3 DPI Loss",
|
||||
84: "Port 4 DPI Loss",
|
||||
85: "Port 5 DPI Loss",
|
||||
86: "Port 6 DPI Loss",
|
||||
87: "IXo Voltage Range",
|
||||
91: "Primary Velocity Feedback Loss",
|
||||
93: "Hardware Enable Check",
|
||||
94: "Alternate Velocity Feedback Loss",
|
||||
95: "Auxiliary Velocity Feedback Loss",
|
||||
96: "Position Feedback Loss",
|
||||
97: "Auto Tach Switch",
|
||||
100: "Parameter Checksum",
|
||||
101: "Power Down NVS Blank",
|
||||
102: "NVS Not Blank",
|
||||
103: "Power Down NVS Incompatible",
|
||||
104: "Power Board Checksum",
|
||||
106: "Incompat MCB-PB",
|
||||
107: "Replaced MCB-PB",
|
||||
108: "Analog Calibration Checksum",
|
||||
110: "Invalid Power Board Data",
|
||||
111: "Power Board Invalid ID",
|
||||
112: "Power Board App Min Version",
|
||||
113: "Tracking DataError",
|
||||
115: "Power Down Table Full",
|
||||
116: "Power Down Entry Too Large",
|
||||
117: "Power Down Data Checksum",
|
||||
118: "Power Board Power Down Checksum",
|
||||
124: "App ID Changed",
|
||||
125: "Using Backup App",
|
||||
134: "Start on Power Up",
|
||||
137: "External Precharge Error",
|
||||
138: "Precharge Open",
|
||||
141: "Autotune Enc Angle",
|
||||
142: "Autotune Speed Restricted",
|
||||
143: "Autotune Current Regulator",
|
||||
144: "Autotune Inertia",
|
||||
145: "Autotune Travel",
|
||||
13035: "Net IO Timeout",
|
||||
13037: "Net IO Timeout"
|
||||
|
||||
}
|
||||
|
||||
plc_tags = {
|
||||
"wellstatus": well_status_codes.get(value, "Invalid Code"),
|
||||
"pidcontrolmode": pid_control_codes.get(value, "Invalid Code"),
|
||||
"downholesensorstatus": downhole_codes.get(value, "Invalid Code"),
|
||||
"alarmflowrate": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmintakepressure": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmintaketemperature": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmtubingpressure": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmvfd": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"),
|
||||
"alarmfluidlevel": alarm_codes.get(value, "Invalid Code"),
|
||||
"runpermissive": permissive_codes.get(value, "Invalid Code"),
|
||||
"startpermissive": permissive_codes.get(value, "Invalid Code"),
|
||||
"last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"),
|
||||
"vfd_fault": vfd_fault_codes.get(value, "Invalid Code"),
|
||||
"flowmeter_fault": alarm_codes.get(value, "Invalid Code")
|
||||
}
|
||||
|
||||
return plc_tags.get(plc_tag, "Invalid Tag")
|
||||
|
||||
|
||||
BIN
Pub_Sub/rigpump/.DS_Store
vendored
BIN
Pub_Sub/rigpump/.DS_Store
vendored
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
import json, time
|
||||
import json, time, os
|
||||
from datetime import datetime as dt
|
||||
from quickfaas.measure import recall, write
|
||||
from quickfaas.remotebus import publish
|
||||
@@ -48,7 +48,13 @@ def writeplctag(value):
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
return False
|
||||
|
||||
|
||||
def reboot():
|
||||
#basic = Basic()
|
||||
logger.info("!" * 10 + "REBOOTING DEVICE FROM CLOUD" + "!"*10)
|
||||
r = os.popen("kill -s SIGHUP `cat /var/run/python/supervisord.pid`").read()
|
||||
logger.info(f"REBOOT : {r}")
|
||||
|
||||
def receiveCommand(topic, payload):
|
||||
try:
|
||||
logger.debug(topic)
|
||||
@@ -58,6 +64,7 @@ def receiveCommand(topic, payload):
|
||||
commands = {
|
||||
"sync": sync,
|
||||
"writeplctag": writeplctag,
|
||||
"reboot": reboot
|
||||
}
|
||||
if command == "setPLCTag":
|
||||
try:
|
||||
@@ -65,6 +72,12 @@ def receiveCommand(topic, payload):
|
||||
logger.debug(result)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
elif command == "reboot":
|
||||
try:
|
||||
ack(topic.split("/")[-1])
|
||||
commands["reboot"]()
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
#logger.debug(command)
|
||||
ack(topic.split("/")[-1])
|
||||
time.sleep(2)
|
||||
|
||||
2888
Pub_Sub/solarpump/thingsboard/api_attributes.json
Normal file
2888
Pub_Sub/solarpump/thingsboard/api_attributes.json
Normal file
File diff suppressed because it is too large
Load Diff
111
Pub_Sub/solarpump/thingsboard/device_attributes.json
Normal file
111
Pub_Sub/solarpump/thingsboard/device_attributes.json
Normal file
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"Gateway": [
|
||||
"Bluetooth enabled",
|
||||
"gatewayID",
|
||||
"Productid",
|
||||
"MachineName",
|
||||
"Fw Version",
|
||||
"Fw Build date",
|
||||
"Machine serial number",
|
||||
"Hardware revision",
|
||||
"Remote ip address",
|
||||
"SIM card identifier",
|
||||
"Auto update",
|
||||
"Update to",
|
||||
"Update status",
|
||||
"Voltage",
|
||||
"Internal temperature",
|
||||
"Antenna Type",
|
||||
"Signal RSSI",
|
||||
"VRM Log time offset",
|
||||
"VRM Log interval",
|
||||
"Network name",
|
||||
"Latitude",
|
||||
"Longitude",
|
||||
"Relay 1 state"
|
||||
],
|
||||
"Battery Monitor": [
|
||||
"Battery custom name",
|
||||
"Model",
|
||||
"Firmware version",
|
||||
"Voltage",
|
||||
"Current",
|
||||
"Consumed Amphours",
|
||||
"State of charge",
|
||||
"Time to go",
|
||||
"Low voltage alarm",
|
||||
"High voltage alarm",
|
||||
"Low starter-voltage alarm",
|
||||
"High starter-voltage alarm",
|
||||
"Low state-of-charge alarm",
|
||||
"Low battery temperature alarm",
|
||||
"High battery temperature alarm",
|
||||
"Mid-voltage alarm",
|
||||
"Deepest discharge",
|
||||
"Last discharge",
|
||||
"Average discharge",
|
||||
"Charge cycles",
|
||||
"Full discharges",
|
||||
"Total Ah drawn",
|
||||
"Minimum voltage",
|
||||
"Maximum voltage",
|
||||
"Time since last full charge",
|
||||
"Automatic syncs",
|
||||
"Low voltage alarms",
|
||||
"High voltage alarms",
|
||||
"Minimum starter voltage",
|
||||
"Maximum starter voltage",
|
||||
"Discharged Energy",
|
||||
"Charged Energy"
|
||||
],
|
||||
"Solar Charger": [
|
||||
"Solar charger off reason",
|
||||
"Solar charger custom name",
|
||||
"Solarcharger model",
|
||||
"Solar charger version",
|
||||
"Solar charger serial number",
|
||||
"Voltage",
|
||||
"Current",
|
||||
"Battery watts",
|
||||
"Load state",
|
||||
"Charge state",
|
||||
"PV voltage",
|
||||
"PV power",
|
||||
"MPPT State",
|
||||
"Yield today",
|
||||
"Maximum charge power today",
|
||||
"Yield yesterday",
|
||||
"Maximum charge power yesterday",
|
||||
"Error code",
|
||||
"User yield"
|
||||
],
|
||||
"System overview": [
|
||||
"Solar Yield (delta)",
|
||||
"PV - DC-coupled",
|
||||
"Voltage",
|
||||
"Current",
|
||||
"Battery Power",
|
||||
"Battery SOC",
|
||||
"Battery state"
|
||||
],
|
||||
"Digital input": [
|
||||
"Digital input product id",
|
||||
"Digital input state",
|
||||
"Digital input count",
|
||||
"Digital input type",
|
||||
"Digital input product id",
|
||||
"Digital input state",
|
||||
"Digital input count",
|
||||
"Digital input type"
|
||||
],
|
||||
"SmartBatteryProtect": [
|
||||
"Product ID",
|
||||
"State",
|
||||
"Output state",
|
||||
"Error",
|
||||
"Input voltage",
|
||||
"Output voltage",
|
||||
"Off reason",
|
||||
"Custom name"
|
||||
]
|
||||
}
|
||||
215
Pub_Sub/solarpump/thingsboard/pub/sendAlarms.py
Normal file
215
Pub_Sub/solarpump/thingsboard/pub/sendAlarms.py
Normal file
@@ -0,0 +1,215 @@
|
||||
# Enter your python code.
|
||||
import json, time, math
|
||||
from datetime import datetime as dt
|
||||
from datetime import timedelta as td
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
|
||||
class RuntimeStats:
|
||||
def __init__(self):
|
||||
self.runs = {}
|
||||
self.currentRun = 0
|
||||
self.today = ""
|
||||
self.todayString = ""
|
||||
|
||||
def manageTime(self):
|
||||
if self.todayString != dt.strftime(dt.today(), "%Y-%m-%d"):
|
||||
if self.runs[self.todayString]["run_" + str(self.currentRun)]["start"] and not self.runs[self.todayString]["run_" + str(self.currentRun)]["end"]:
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["end"] = time.mktime(dt.strptime(self.todayString + " 23:59:59", "%Y-%m-%d %H:%M:%S").timetuple())
|
||||
self.addDay()
|
||||
self.today = dt.today()
|
||||
self.todayString = dt.strftime(self.today, "%Y-%m-%d")
|
||||
days = list(self.runs.keys())
|
||||
days.sort()
|
||||
while (dt.strptime(days[-1],"%Y-%m-%d") - dt.strptime(days[0], "%Y-%m-%d")).days > 40:
|
||||
self.removeDay(day=days[0])
|
||||
days = list(self.runs.keys())
|
||||
days.sort()
|
||||
self.saveDataToFile()
|
||||
|
||||
def addHertzDataPoint(self, frequency):
|
||||
if frequency > 0:
|
||||
self.manageTime()
|
||||
try:
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["frequencies"].append(frequency)
|
||||
except:
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["frequencies"] = [frequency]
|
||||
|
||||
def startRun(self):
|
||||
if self.checkRunning():
|
||||
self.endRun()
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["start"] = time.time()
|
||||
|
||||
def endRun(self):
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["end"] = time.time()
|
||||
self.currentRun += 1
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)] = {"start":0, "end": 0, "frequencies":[]}
|
||||
|
||||
def checkRunning(self):
|
||||
if self.runs[self.todayString]["run_" + str(self.currentRun)]["start"] and not self.runs[self.todayString]["run_" + str(self.currentRun)]["end"]:
|
||||
return True
|
||||
return False
|
||||
|
||||
def addDay(self):
|
||||
self.today = dt.today()
|
||||
self.todayString = dt.strftime(self.today, "%Y-%m-%d")
|
||||
self.currentRun = 1
|
||||
self.runs[self.todayString] = {}
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)] = {"start":0, "end": 0, "frequencies":[]}
|
||||
|
||||
def countRunsDay(self, day=None):
|
||||
if not day:
|
||||
day = self.todayString
|
||||
return len(self.runs[day].keys())
|
||||
|
||||
def countRunsMultiDay(self, numDays=30):
|
||||
total_runs = 0
|
||||
for day in list(self.runs.keys()):
|
||||
total_runs += self.countRunsDay(day=day)
|
||||
return total_runs
|
||||
|
||||
def calculateAverageHertzDay(self, day=None, returnArray=False):
|
||||
dayFrequencies = []
|
||||
if not day:
|
||||
day = self.todayString
|
||||
for run in list(self.runs[day].keys()):
|
||||
try:
|
||||
dayFrequencies += self.runs[day][run]["frequencies"]
|
||||
except Exception as e:
|
||||
logger.debug("{} missing frequency data for {}".format(day,run))
|
||||
if returnArray:
|
||||
return dayFrequencies
|
||||
return round(math.fsum(dayFrequencies)/len(dayFrequencies),2)
|
||||
|
||||
def calculateAverageHertzMultiDay(self, numDays=30):
|
||||
self.manageTime()
|
||||
frequencies = []
|
||||
for day in list(self.runs.keys()):
|
||||
if not day == self.todayString and (dt.strptime(self.todayString, "%Y-%m-%d") - dt.strptime(day, "%Y-%m-%d")).days <= numDays:
|
||||
try:
|
||||
frequencies += self.calculateAverageHertzDay(day=day, returnArray=True)
|
||||
except Exception as e:
|
||||
logger.debug("{} missing frequency data".format(day))
|
||||
if len(frequencies):
|
||||
return round(math.fsum(frequencies)/len(frequencies), 2)
|
||||
return 0
|
||||
|
||||
def calculateRunTimeDay(self, day=None, convertToHours=True):
|
||||
self.manageTime()
|
||||
total_time = 0
|
||||
if not day:
|
||||
day = self.todayString
|
||||
for run in list(self.runs.get(day,{}).keys()):
|
||||
if self.runs[day][run]["end"] == 0 and self.runs[day][run]["start"] != 0:
|
||||
total_time = time.time() - self.runs[day][run]["start"] + total_time
|
||||
else:
|
||||
total_time = self.runs[day][run]["end"] - self.runs[day][run]["start"] + total_time
|
||||
if convertToHours:
|
||||
return self.convertSecondstoHours(total_time)
|
||||
return total_time
|
||||
|
||||
def calculateRunTimeMultiDay(self, numDays=30, convertToHours=True):
|
||||
total_time = 0
|
||||
for day in list(self.runs.keys()):
|
||||
if (dt.strptime(self.todayString, "%Y-%m-%d") - dt.strptime(day, "%Y-%m-%d")).days <= numDays:
|
||||
total_time += self.calculateRunTimeDay(day=day, convertToHours=False)
|
||||
if convertToHours:
|
||||
return self.convertSecondstoHours(total_time)
|
||||
return total_time
|
||||
|
||||
def calculateRunPercentDay(self, day=None, precise=False):
|
||||
if not day:
|
||||
day = self.todayString
|
||||
if precise:
|
||||
return (self.calculateRunTimeDay(day=day)/24) * 100
|
||||
return round((self.calculateRunTimeDay(day=day)/24) * 100, 2)
|
||||
|
||||
|
||||
def calculateRunPercentMultiDay(self, numDays=30, precise=False):
|
||||
self.manageTime()
|
||||
if precise:
|
||||
return (self.calculateRunTimeMultiDay()/(24*numDays)) * 100
|
||||
return round((self.calculateRunTimeMultiDay()/(24*numDays)) * 100,2)
|
||||
|
||||
def removeDay(self, day=None):
|
||||
if not day:
|
||||
raise Exception("Day can not be None")
|
||||
logger.debug("removing day {}".format(day))
|
||||
del self.runs[day]
|
||||
self.saveDataToFile()
|
||||
|
||||
def convertSecondstoHours(self, seconds):
|
||||
return round(seconds / (60*60),2)
|
||||
|
||||
def resetData(self):
|
||||
logger.debug("clearing database")
|
||||
try:
|
||||
for day in list(self.runs.keys()):
|
||||
self.removeDay(day=day)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
return False
|
||||
self.runs = {}
|
||||
self.currentRun = 0
|
||||
self.today = ""
|
||||
self.todayString = ""
|
||||
self.manageTime()
|
||||
return True
|
||||
|
||||
def loadDataFromFile(self, filePath="/var/user/files/runtimestats.json"):
|
||||
try:
|
||||
with open(filePath, "r") as f:
|
||||
temp = json.load(f)
|
||||
self.runs = temp["data"]
|
||||
self.currentRun = temp["current_run"]
|
||||
self.today = dt.strptime(temp["current_day"], "%Y-%m-%d")
|
||||
self.todayString = temp["current_day"]
|
||||
self.manageTime()
|
||||
except:
|
||||
logger.debug("Could not find file at {}".format(filePath))
|
||||
logger.debug("creating file")
|
||||
self.addDay()
|
||||
try:
|
||||
with open(filePath, "w") as f:
|
||||
d = {
|
||||
"current_run": self.currentRun,
|
||||
"current_day": self.todayString,
|
||||
"data": self.runs
|
||||
}
|
||||
json.dump(d, f, indent=4)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
def saveDataToFile(self, filePath="/var/user/files/runtimestats.json"):
|
||||
try:
|
||||
logger.debug("Saving Runs")
|
||||
with open(filePath, "w") as f:
|
||||
d = {
|
||||
"current_run": self.currentRun,
|
||||
"current_day": self.todayString,
|
||||
"data": self.runs
|
||||
}
|
||||
json.dump(d, f, indent=4)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
rts = RuntimeStats()
|
||||
|
||||
|
||||
def runTime(message, wizard_api, cloudName):
|
||||
rts.loadDataFromFile()
|
||||
rts.saveDataToFile()
|
||||
logger.debug("publish topic:%s, payload: %s, cloudName: %s" % (__topic__, message, cloudName))
|
||||
payload = {}
|
||||
payload["ts"] = time.time()*1000
|
||||
payload["values"] = {message["values"]["running"]["measureName"]: message["values"]["running"]["value"]}
|
||||
rts.manageTime()
|
||||
if message["values"]["running"]["value"] == 1 and not rts.runs[rts.todayString]["run_" + str(rts.currentRun)]["start"]:
|
||||
rts.startRun()
|
||||
rts.saveDataToFile()
|
||||
elif message["values"]["running"]["value"] == 0 and rts.runs[rts.todayString]["run_" + str(rts.currentRun)]["start"] and not rts.runs[rts.todayString]["run_" + str(rts.currentRun)]["end"]:
|
||||
rts.endRun()
|
||||
rts.saveDataToFile()
|
||||
payload["values"]["today_running_hours"] = rts.calculateRunTimeDay()
|
||||
payload["values"]["month_running_hours"] = rts.calculateRunTimeMultiDay(numDays=dt.today().day)
|
||||
publish(__topic__, json.dumps(payload), __qos__, cloud_name=cloudName)
|
||||
613
Pub_Sub/solarpump/thingsboard/pub/sendData.py
Normal file
613
Pub_Sub/solarpump/thingsboard/pub/sendData.py
Normal file
@@ -0,0 +1,613 @@
|
||||
import json, os, time, shutil, math
|
||||
from datetime import datetime as dt
|
||||
from datetime import timedelta as td
|
||||
from calendar import monthrange
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
from mobiuspi_lib.gps import GPS
|
||||
from quickfaas.global_dict import get as get_params
|
||||
from quickfaas.global_dict import _set_global_args
|
||||
|
||||
|
||||
class RuntimeStats:
|
||||
def __init__(self):
|
||||
self.runs = {}
|
||||
self.currentRun = 0
|
||||
self.today = ""
|
||||
self.todayString = ""
|
||||
|
||||
def manageTime(self):
|
||||
if self.todayString != dt.strftime(dt.today(), "%Y-%m-%d"):
|
||||
if self.runs[self.todayString]["run_" + str(self.currentRun)]["start"] and not self.runs[self.todayString]["run_" + str(self.currentRun)]["end"]:
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["end"] = time.mktime(dt.strptime(self.todayString + " 23:59:59", "%Y-%m-%d %H:%M:%S").timetuple())
|
||||
self.addDay()
|
||||
self.today = dt.today()
|
||||
self.todayString = dt.strftime(self.today, "%Y-%m-%d")
|
||||
days = list(self.runs.keys())
|
||||
days.sort()
|
||||
while (dt.strptime(days[-1],"%Y-%m-%d") - dt.strptime(days[0], "%Y-%m-%d")).days > 40:
|
||||
self.removeDay(day=days[0])
|
||||
days = list(self.runs.keys())
|
||||
days.sort()
|
||||
|
||||
def addHertzDataPoint(self, frequency):
|
||||
if frequency > 0:
|
||||
self.manageTime()
|
||||
try:
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["frequencies"].append(frequency)
|
||||
except:
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["frequencies"] = [frequency]
|
||||
|
||||
def startRun(self):
|
||||
if self.checkRunning():
|
||||
self.endRun()
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["start"] = time.time()
|
||||
|
||||
def endRun(self):
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["end"] = time.time()
|
||||
self.currentRun += 1
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)] = {"start":0, "end": 0, "frequencies":[]}
|
||||
|
||||
def checkRunning(self):
|
||||
if self.runs[self.todayString]["run_" + str(self.currentRun)]["start"] and not self.runs[self.todayString]["run_" + str(self.currentRun)]["end"]:
|
||||
return True
|
||||
return False
|
||||
|
||||
def addDay(self):
|
||||
self.today = dt.today()
|
||||
self.todayString = dt.strftime(self.today, "%Y-%m-%d")
|
||||
self.currentRun = 1
|
||||
self.runs[self.todayString] = {}
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)] = {"start":0, "end": 0, "frequencies":[]}
|
||||
|
||||
def countRunsDay(self, day=None):
|
||||
if not day:
|
||||
day = self.todayString
|
||||
return len(self.runs[day].keys())
|
||||
|
||||
def countRunsMultiDay(self, numDays=30):
|
||||
total_runs = 0
|
||||
for day in list(self.runs.keys()):
|
||||
total_runs += self.countRunsDay(day=day)
|
||||
return total_runs
|
||||
|
||||
def calculateAverageHertzDay(self, day=None, returnArray=False):
|
||||
dayFrequencies = []
|
||||
if not day:
|
||||
day = self.todayString
|
||||
for run in list(self.runs[day].keys()):
|
||||
try:
|
||||
dayFrequencies += self.runs[day][run]["frequencies"]
|
||||
except Exception as e:
|
||||
logger.debug("{} missing frequency data for {}".format(day,run))
|
||||
if returnArray:
|
||||
return dayFrequencies
|
||||
return round(math.fsum(dayFrequencies)/len(dayFrequencies),2)
|
||||
|
||||
def calculateAverageHertzMultiDay(self, numDays=30):
|
||||
self.manageTime()
|
||||
frequencies = []
|
||||
for day in list(self.runs.keys()):
|
||||
if not day == self.todayString and (dt.strptime(self.todayString, "%Y-%m-%d") - dt.strptime(day, "%Y-%m-%d")).days <= numDays:
|
||||
try:
|
||||
frequencies += self.calculateAverageHertzDay(day=day, returnArray=True)
|
||||
except Exception as e:
|
||||
logger.debug("{} missing frequency data".format(day))
|
||||
if len(frequencies):
|
||||
return round(math.fsum(frequencies)/len(frequencies), 2)
|
||||
return 0
|
||||
|
||||
def calculateRunTimeDay(self, day=None, convertToHours=True):
|
||||
self.manageTime()
|
||||
total_time = 0
|
||||
if not day:
|
||||
day = self.todayString
|
||||
for run in list(self.runs.get(day,{}).keys()):
|
||||
if self.runs[day][run]["end"] == 0 and self.runs[day][run]["start"] != 0:
|
||||
total_time = time.time() - self.runs[day][run]["start"] + total_time
|
||||
else:
|
||||
total_time = self.runs[day][run]["end"] - self.runs[day][run]["start"] + total_time
|
||||
if convertToHours:
|
||||
return self.convertSecondstoHours(total_time)
|
||||
return total_time
|
||||
|
||||
def calculateRunTimeMultiDay(self, numDays=30, convertToHours=True):
|
||||
total_time = 0
|
||||
for day in list(self.runs.keys()):
|
||||
if (dt.strptime(self.todayString, "%Y-%m-%d") - dt.strptime(day, "%Y-%m-%d")).days <= numDays:
|
||||
total_time += self.calculateRunTimeDay(day=day, convertToHours=False)
|
||||
if convertToHours:
|
||||
return self.convertSecondstoHours(total_time)
|
||||
return total_time
|
||||
|
||||
def calculateRunPercentDay(self, day=None, precise=False):
|
||||
if not day:
|
||||
day = self.todayString
|
||||
if precise:
|
||||
return (self.calculateRunTimeDay(day=day)/24) * 100
|
||||
return round((self.calculateRunTimeDay(day=day)/24) * 100, 2)
|
||||
|
||||
|
||||
def calculateRunPercentMultiDay(self, numDays=30, precise=False):
|
||||
self.manageTime()
|
||||
if precise:
|
||||
return (self.calculateRunTimeMultiDay()/(24*numDays)) * 100
|
||||
return round((self.calculateRunTimeMultiDay()/(24*numDays)) * 100,2)
|
||||
|
||||
def removeDay(self, day=None):
|
||||
if not day:
|
||||
raise Exception("Day can not be None")
|
||||
logger.debug("removing day {}".format(day))
|
||||
del self.runs[day]
|
||||
self.saveDataToFile()
|
||||
|
||||
def convertSecondstoHours(self, seconds):
|
||||
return round(seconds / (60*60),2)
|
||||
|
||||
def resetData(self):
|
||||
logger.debug("clearing database")
|
||||
try:
|
||||
for day in list(self.runs.keys()):
|
||||
self.removeDay(day=day)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
return False
|
||||
self.runs = {}
|
||||
self.currentRun = 0
|
||||
self.today = ""
|
||||
self.todayString = ""
|
||||
self.manageTime()
|
||||
return True
|
||||
|
||||
def loadDataFromFile(self, filePath="/var/user/files/runtimestats.json"):
|
||||
try:
|
||||
with open(filePath, "r") as f:
|
||||
temp = json.load(f)
|
||||
self.runs = temp["data"]
|
||||
self.currentRun = temp["current_run"]
|
||||
self.today = dt.strptime(temp["current_day"], "%Y-%m-%d")
|
||||
self.todayString = temp["current_day"]
|
||||
self.manageTime()
|
||||
except:
|
||||
logger.debug("Could not find file at {}".format(filePath))
|
||||
logger.debug("creating file")
|
||||
self.addDay()
|
||||
try:
|
||||
with open(filePath, "w") as f:
|
||||
d = {
|
||||
"current_run": self.currentRun,
|
||||
"current_day": self.todayString,
|
||||
"data": self.runs
|
||||
}
|
||||
json.dump(d, f, indent=4)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
def saveDataToFile(self, filePath="/var/user/files/runtimestats.json"):
|
||||
try:
|
||||
logger.debug("Saving Runs")
|
||||
with open(filePath, "w") as f:
|
||||
d = {
|
||||
"current_run": self.currentRun,
|
||||
"current_day": self.todayString,
|
||||
"data": self.runs
|
||||
}
|
||||
json.dump(d, f, indent=4)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
rts = RuntimeStats()
|
||||
rts.loadDataFromFile()
|
||||
rts.saveDataToFile()
|
||||
|
||||
def reboot(reason="Rebooting for config file update"):
|
||||
#basic = Basic()
|
||||
logger.info("!" * 10 + "REBOOTING DEVICE" + "!"*10)
|
||||
logger.info(reason)
|
||||
r = os.popen("kill -s SIGHUP `cat /var/run/python/supervisord.pid`").read()
|
||||
logger.info(f"REBOOT : {r}")
|
||||
|
||||
def checkFileExist(filename):
|
||||
path = "/var/user/files"
|
||||
try:
|
||||
if not os.path.exists(path):
|
||||
logger.debug("no folder making files folder in var/user")
|
||||
os.makedirs(path)
|
||||
with open(path + "/" + filename, "a") as f:
|
||||
json.dump({}, f)
|
||||
except Exception as e:
|
||||
logger.error(f"Something went wrong in checkFileExist while making folder: {e}")
|
||||
|
||||
try:
|
||||
if not os.path.exists(path + "/" + filename):
|
||||
logger.debug("no creds file making creds file")
|
||||
with open(path + "/" + filename, "a") as f:
|
||||
json.dump({}, f)
|
||||
except Exception as e:
|
||||
logger.error(f"Something went wrong in checkFileExist wihle making file: {e}")
|
||||
|
||||
def convertDStoJSON(ds):
|
||||
j = dict()
|
||||
try:
|
||||
for x in ds:
|
||||
j[x["key"]] = x["value"]
|
||||
except Exception as e:
|
||||
logger.error(f"Something went wrong in convertDStoJSON: {e}")
|
||||
return j
|
||||
|
||||
def convertJSONtoDS(j):
|
||||
d = []
|
||||
try:
|
||||
for key in j.keys():
|
||||
d.append({"key": key, "value": j[key]})
|
||||
except Exception as e:
|
||||
logger.error(f"Something went wrong in convertJSONtoDS: {e}")
|
||||
return d
|
||||
|
||||
def checkCredentialConfig():
|
||||
logger.debug("CHECKING CONFIG")
|
||||
cfgpath = "/var/user/cfg/device_supervisor/device_supervisor.cfg"
|
||||
credspath = "/var/user/files/creds.json"
|
||||
cfg = dict()
|
||||
with open(cfgpath, "r") as f:
|
||||
try:
|
||||
cfg = json.load(f)
|
||||
clouds = cfg.get("clouds")
|
||||
logger.debug(clouds)
|
||||
#if not configured then try to configure from stored values
|
||||
if clouds[0]["args"]["clientId"] == "unknown" or clouds[0]["args"]["username"] == "unknown" or not clouds[0]["args"]["passwd"] or clouds[0]["args"]["passwd"] == "unknown":
|
||||
try:
|
||||
checkFileExist("creds.json")
|
||||
except Exception as e:
|
||||
logger.error(f"Error in checkFileExist: {e}")
|
||||
with open(credspath, "r") as c:
|
||||
try:
|
||||
creds = json.load(c)
|
||||
if creds:
|
||||
logger.debug("updating config with stored data")
|
||||
clouds[0]["args"]["clientId"] = creds["clientId"]
|
||||
clouds[0]["args"]["username"] = creds["userName"]
|
||||
clouds[0]["args"]["passwd"] = creds["password"]
|
||||
cfg["clouds"] = clouds
|
||||
cfg = checkParameterConfig(cfg)
|
||||
with open(cfgpath, "w", encoding='utf-8') as n:
|
||||
json.dump(cfg, n, indent=1, ensure_ascii=False)
|
||||
reboot()
|
||||
except Exception as e:
|
||||
logger.error(f"Error trying to load credentials from file: {e}")
|
||||
else:
|
||||
#assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data
|
||||
checkFileExist("creds.json")
|
||||
with open(credspath, "r") as c:
|
||||
logger.debug("updating stored file with new data")
|
||||
cfg = checkParameterConfig(cfg)
|
||||
with open(cfgpath, "w", encoding='utf-8') as n:
|
||||
json.dump(cfg, n, indent=1, ensure_ascii=False)
|
||||
creds = json.load(c)
|
||||
if creds:
|
||||
if creds["clientId"] != clouds[0]["args"]["clientId"]:
|
||||
creds["clientId"] = clouds[0]["args"]["clientId"]
|
||||
if creds["userName"] != clouds[0]["args"]["username"]:
|
||||
creds["userName"] = clouds[0]["args"]["username"]
|
||||
if creds["password"] != clouds[0]["args"]["passwd"]:
|
||||
creds["password"] = clouds[0]["args"]["passwd"]
|
||||
else:
|
||||
creds["clientId"] = clouds[0]["args"]["clientId"]
|
||||
creds["userName"] = clouds[0]["args"]["username"]
|
||||
creds["password"] = clouds[0]["args"]["passwd"]
|
||||
with open(credspath, "w") as cw:
|
||||
json.dump(creds,cw)
|
||||
except Exception as e:
|
||||
logger.error(f"Somethign went wrong in checkCredentialConfig: {e}")
|
||||
|
||||
def checkParameterConfig(cfg):
|
||||
try:
|
||||
logger.debug("Checking Parameters!!!!")
|
||||
paramspath = "/var/user/files/params.json"
|
||||
cfgparams = convertDStoJSON(cfg.get("labels"))
|
||||
#check stored values
|
||||
checkFileExist("params.json")
|
||||
with open(paramspath, "r") as f:
|
||||
logger.debug("Opened param storage file")
|
||||
params = json.load(f)
|
||||
if params:
|
||||
if cfgparams != params:
|
||||
#go through each param
|
||||
#if not "unknown" and cfg and params aren't the same take from cfg likely updated manually
|
||||
#if key in cfg but not in params copy to params
|
||||
logger.debug("equalizing params between cfg and stored")
|
||||
for key in cfgparams.keys():
|
||||
try:
|
||||
if cfgparams[key] != params[key] and cfgparams[key] != "unknown":
|
||||
params[key] = cfgparams[key]
|
||||
except:
|
||||
params[key] = cfgparams[key]
|
||||
cfg["labels"] = convertJSONtoDS(params)
|
||||
_set_global_args(convertJSONtoDS(params))
|
||||
with open(paramspath, "w") as p:
|
||||
json.dump(params, p)
|
||||
else:
|
||||
with open(paramspath, "w") as p:
|
||||
logger.debug("initializing param file with params in memory")
|
||||
json.dump(convertDStoJSON(get_params()), p)
|
||||
cfg["labels"] = get_params()
|
||||
|
||||
return cfg
|
||||
except Exception as e:
|
||||
logger.error(f"Something went wrong in checkParameterConfig: {e}")
|
||||
os.system(f'rm {paramspath}')
|
||||
return cfg
|
||||
|
||||
payload = {}
|
||||
|
||||
def initialize_totalizers():
|
||||
return {
|
||||
"day": 0,
|
||||
"week": 0,
|
||||
"month": 0,
|
||||
"year": 0,
|
||||
"lifetime": 0,
|
||||
"dayHolding": 0,
|
||||
"weekHolding": 0,
|
||||
"monthHolding": 0,
|
||||
"yearHolding": 0
|
||||
}
|
||||
|
||||
def getTotalizers(file_path="/var/user/files/totalizers.json"):
|
||||
"""
|
||||
Retrieves totalizer data from a JSON file.
|
||||
|
||||
:param file_path: Path to the JSON file storing totalizer data.
|
||||
:return: Dictionary containing totalizer values.
|
||||
"""
|
||||
try:
|
||||
with open(file_path, "r") as t:
|
||||
totalizers = json.load(t)
|
||||
if not totalizers or not isinstance(totalizers, dict):
|
||||
logger.info("Invalid data format in the file. Initializing totalizers.")
|
||||
totalizers = initialize_totalizers()
|
||||
except FileNotFoundError:
|
||||
logger.info("File not found. Initializing totalizers.")
|
||||
totalizers = initialize_totalizers()
|
||||
except json.JSONDecodeError:
|
||||
timestamp = dt.now().strftime("%Y%m%d_%H%M%S")
|
||||
# Split the file path and insert the timestamp before the extension
|
||||
file_name, file_extension = os.path.splitext(file_path)
|
||||
backup_file_path = f"{file_name}_{timestamp}{file_extension}"
|
||||
shutil.copyfile(file_path, backup_file_path)
|
||||
logger.error(f"Error decoding JSON. A backup of the file is created at {backup_file_path}. Initializing totalizers.")
|
||||
totalizers = initialize_totalizers()
|
||||
return totalizers
|
||||
|
||||
# Helper function to split the payload into chunks
|
||||
def chunk_payload(payload, chunk_size=20):
|
||||
chunked_values = list(payload["values"].items())
|
||||
for i in range(0, len(chunked_values), chunk_size):
|
||||
yield {
|
||||
"ts": payload["ts"],
|
||||
"values": dict(chunked_values[i:i+chunk_size])
|
||||
}
|
||||
|
||||
|
||||
def sendData(message,wizard_api):
|
||||
rts.loadDataFromFile()
|
||||
logger.debug(message)
|
||||
checkCredentialConfig()
|
||||
payload = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}}
|
||||
resetPayload = {"ts": "", "values": {}}
|
||||
dayReset, weekReset, monthReset, yearReset = False, False, False, False
|
||||
for controller, measures in message["values"].items():
|
||||
for measure, values in measures.items():
|
||||
try:
|
||||
if values.get("status") == 1:
|
||||
if measure in ["totalizer_1"]:
|
||||
payload["values"]["day_volume"], dayReset = totalizeDay(values.get("raw_data"))
|
||||
payload["values"]["week_volume"], weekReset = totalizeWeek(values.get("raw_data"))
|
||||
payload["values"]["month_volume"], monthReset = totalizeMonth(values.get("raw_data"))
|
||||
payload["values"]["year_volume"], yearReset = totalizeYear(values.get("raw_data"))
|
||||
if measure in ["running"]:
|
||||
rts.manageTime()
|
||||
if values.get("raw_data") == 1 and not rts.runs[rts.todayString]["run_" + str(rts.currentRun)]["start"]:
|
||||
rts.startRun()
|
||||
rts.saveDataToFile()
|
||||
elif values.get("raw_data") == 0 and rts.runs[rts.todayString]["run_" + str(rts.currentRun)]["start"] and not rts.runs[rts.todayString]["run_" + str(rts.currentRun)]["end"]:
|
||||
rts.endRun()
|
||||
rts.saveDataToFile()
|
||||
payload["values"]["today_running_hours"] = rts.calculateRunTimeDay()
|
||||
payload["values"]["month_running_hours"] = rts.calculateRunTimeMultiDay(numDays=dt.today().day)
|
||||
payload["values"][measure] = values.get("raw_data")
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
try:
|
||||
payload["values"]["latitude"], payload["values"]["longitude"], payload["values"]["speed"] = getGPS()
|
||||
except:
|
||||
logger.error("Could not get GPS coordinates")
|
||||
for chunk in chunk_payload(payload=payload):
|
||||
publish(__topic__, json.dumps(chunk), __qos__)
|
||||
time.sleep(2)
|
||||
|
||||
publish("v1/devices/me/attributes", json.dumps({"latestReportTime": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__)
|
||||
|
||||
if dayReset:
|
||||
resetPayload["values"]["yesterday_volume"] = payload["values"]["day_volume"]
|
||||
resetPayload["values"]["day_volume"] = 0
|
||||
resetPayload["values"]["yesterday_running_hours"] = rts.calculateRunTimeDay(day=dt.strftime(dt.today() - td(days=1) , "%Y-%m-%d"))
|
||||
if weekReset:
|
||||
resetPayload["values"]["last_week_volume"] = payload["values"]["week_volume"]
|
||||
resetPayload["values"]["week_volume"] = 0
|
||||
if monthReset:
|
||||
resetPayload["values"]["last_month_volume"] = payload["values"]["month_volume"]
|
||||
resetPayload["values"]["month_volume"] = 0
|
||||
resetPayload["values"]["last_month_running_hours"] = rts.calculateRunTimeMultiDay(numDays=monthrange(dt.today().year, (dt.today() - td(days=1)).month)[1])
|
||||
if yearReset:
|
||||
resetPayload["values"]["last_year_volume"] = payload["values"]["year_volume"]
|
||||
resetPayload["values"]["year_volume"] = 0
|
||||
|
||||
if resetPayload["values"]:
|
||||
resetPayload["ts"] = 1 + (round(dt.timestamp(dt.now())/600)*600)*1000
|
||||
publish(__topic__, json.dumps(resetPayload), __qos__)
|
||||
|
||||
def saveTotalizers(totalizers, file_path="/var/user/files/totalizers.json"):
|
||||
"""
|
||||
Saves totalizer data to a JSON file.
|
||||
|
||||
:param totalizers: Dictionary containing totalizer values to be saved.
|
||||
:param file_path: Path to the JSON file where totalizer data will be saved.
|
||||
"""
|
||||
try:
|
||||
with open(file_path, "w") as t:
|
||||
json.dump(totalizers, t)
|
||||
except (IOError, OSError, json.JSONEncodeError) as e:
|
||||
logger.error(f"Error saving totalizers to {file_path}: {e}")
|
||||
raise # Optionally re-raise the exception if it should be handled by the caller
|
||||
|
||||
def getGPS():
|
||||
# Create a gps instance
|
||||
gps = GPS()
|
||||
|
||||
# Retrieve GPS information
|
||||
position_status = gps.get_position_status()
|
||||
logger.debug("position_status: ")
|
||||
logger.debug(position_status)
|
||||
latitude = position_status["latitude"].split(" ")
|
||||
longitude = position_status["longitude"].split(" ")
|
||||
lat_dec = int(latitude[0][:-1]) + (float(latitude[1][:-1])/60)
|
||||
lon_dec = int(longitude[0][:-1]) + (float(longitude[1][:-1])/60)
|
||||
if latitude[2] == "S":
|
||||
lat_dec = lat_dec * -1
|
||||
if longitude[2] == "W":
|
||||
lon_dec = lon_dec * -1
|
||||
#lat_dec = round(lat_dec, 7)
|
||||
#lon_dec = round(lon_dec, 7)
|
||||
logger.info("HERE IS THE GPS COORDS")
|
||||
logger.info(f"LATITUDE: {lat_dec}, LONGITUDE: {lon_dec}")
|
||||
speedKnots = position_status["speed"].split(" ")
|
||||
speedMPH = float(speedKnots[0]) * 1.151
|
||||
return (f"{lat_dec:.8f}",f"{lon_dec:.8f}",f"{speedMPH:.2f}")
|
||||
|
||||
def totalizeDay(lifetime, max_retries=3, retry_delay=2):
|
||||
"""
|
||||
Update and save daily totalizers based on the lifetime value.
|
||||
|
||||
:param lifetime: The current lifetime total.
|
||||
:param max_retries: Maximum number of save attempts.
|
||||
:param retry_delay: Delay in seconds between retries.
|
||||
:return: A tuple containing the calculated value and a boolean indicating if a reset occurred, or (None, False) if save fails.
|
||||
"""
|
||||
totalizers = getTotalizers()
|
||||
now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)
|
||||
reset = False
|
||||
value = lifetime - totalizers["dayHolding"]
|
||||
|
||||
if not int(now.strftime("%d")) == int(totalizers["day"]):
|
||||
totalizers["dayHolding"] = lifetime
|
||||
totalizers["day"] = int(now.strftime("%d"))
|
||||
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
saveTotalizers(totalizers)
|
||||
reset = True
|
||||
return (value, reset)
|
||||
except Exception as e:
|
||||
logger.error(f"Attempt {attempt + 1} failed to save totalizers: {e}")
|
||||
if attempt < max_retries - 1:
|
||||
time.sleep(retry_delay)
|
||||
else:
|
||||
logger.error("All attempts to save totalizers failed.")
|
||||
return (None, False)
|
||||
|
||||
return (value, reset)
|
||||
|
||||
def totalizeWeek(lifetime, max_retries=3, retry_delay=2):
|
||||
"""
|
||||
Update and save weekly totalizers based on the lifetime value.
|
||||
|
||||
:param lifetime: The current lifetime total.
|
||||
:param max_retries: Maximum number of save attempts.
|
||||
:param retry_delay: Delay in seconds between retries.
|
||||
:return: A tuple containing the calculated value and a boolean indicating if a reset occurred, or (None, False) if save fails.
|
||||
"""
|
||||
totalizers = getTotalizers()
|
||||
now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)
|
||||
reset = False
|
||||
value = lifetime - totalizers["weekHolding"]
|
||||
if (not now.strftime("%U") == totalizers["week"] and now.strftime("%a") == "Sun") or totalizers["week"] == 0:
|
||||
totalizers["weekHolding"] = lifetime
|
||||
totalizers["week"] = now.strftime("%U")
|
||||
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
saveTotalizers(totalizers)
|
||||
reset = True
|
||||
return (value, reset)
|
||||
except Exception as e:
|
||||
logger.error(f"Attempt {attempt + 1} failed to save totalizers: {e}")
|
||||
if attempt < max_retries - 1:
|
||||
time.sleep(retry_delay)
|
||||
else:
|
||||
logger.error("All attempts to save totalizers failed.")
|
||||
return (None, False)
|
||||
return (value, reset)
|
||||
|
||||
def totalizeMonth(lifetime, max_retries=3, retry_delay=2):
|
||||
"""
|
||||
Update and save monthly totalizers based on the lifetime value.
|
||||
|
||||
:param lifetime: The current lifetime total.
|
||||
:param max_retries: Maximum number of save attempts.
|
||||
:param retry_delay: Delay in seconds between retries.
|
||||
:return: A tuple containing the calculated value and a boolean indicating if a reset occurred, or (None, False) if save fails.
|
||||
"""
|
||||
totalizers = getTotalizers()
|
||||
now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)
|
||||
reset = False
|
||||
value = lifetime - totalizers["monthHolding"]
|
||||
if not int(now.strftime("%m")) == int(totalizers["month"]):
|
||||
totalizers["monthHolding"] = lifetime
|
||||
totalizers["month"] = now.strftime("%m")
|
||||
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
saveTotalizers(totalizers)
|
||||
reset = True
|
||||
return (value, reset)
|
||||
except Exception as e:
|
||||
logger.error(f"Attempt {attempt + 1} failed to save totalizers: {e}")
|
||||
if attempt < max_retries - 1:
|
||||
time.sleep(retry_delay)
|
||||
else:
|
||||
logger.error("All attempts to save totalizers failed.")
|
||||
return (None, False)
|
||||
|
||||
return (value,reset)
|
||||
|
||||
def totalizeYear(lifetime, max_retries=3, retry_delay=2):
|
||||
"""
|
||||
Update and save yearly totalizers based on the lifetime value.
|
||||
|
||||
:param lifetime: The current lifetime total.
|
||||
:param max_retries: Maximum number of save attempts.
|
||||
:param retry_delay: Delay in seconds between retries.
|
||||
:return: A tuple containing the calculated value and a boolean indicating if a reset occurred, or (None, False) if save fails.
|
||||
"""
|
||||
totalizers = getTotalizers()
|
||||
now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)
|
||||
reset = False
|
||||
value = lifetime - totalizers["yearHolding"]
|
||||
if not int(now.strftime("%Y")) == int(totalizers["year"]):
|
||||
totalizers["yearHolding"] = lifetime
|
||||
totalizers["year"] = now.strftime("%Y")
|
||||
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
saveTotalizers(totalizers)
|
||||
reset = True
|
||||
return (value, reset)
|
||||
except Exception as e:
|
||||
logger.error(f"Attempt {attempt + 1} failed to save totalizers: {e}")
|
||||
if attempt < max_retries - 1:
|
||||
time.sleep(retry_delay)
|
||||
else:
|
||||
logger.error("All attempts to save totalizers failed.")
|
||||
return (None, False)
|
||||
return (value, reset)
|
||||
309
Pub_Sub/solarpump/thingsboard/sub/receiveCommand.py
Normal file
309
Pub_Sub/solarpump/thingsboard/sub/receiveCommand.py
Normal file
@@ -0,0 +1,309 @@
|
||||
import json, math, time, os
|
||||
from datetime import datetime as dt
|
||||
from common.Logger import logger
|
||||
from quickfaas.measure import write
|
||||
from quickfaas.remotebus import publish
|
||||
|
||||
class RuntimeStats:
|
||||
def __init__(self):
|
||||
self.runs = {}
|
||||
self.currentRun = 0
|
||||
self.today = ""
|
||||
self.todayString = ""
|
||||
|
||||
def manageTime(self):
|
||||
if self.todayString != dt.strftime(dt.today(), "%Y-%m-%d"):
|
||||
if self.runs[self.todayString]["run_" + str(self.currentRun)]["start"] and not self.runs[self.todayString]["run_" + str(self.currentRun)]["end"]:
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["end"] = time.mktime(dt.strptime(self.todayString + " 23:59:59", "%Y-%m-%d %H:%M:%S").timetuple())
|
||||
self.addDay()
|
||||
self.today = dt.today()
|
||||
self.todayString = dt.strftime(self.today, "%Y-%m-%d")
|
||||
days = list(self.runs.keys())
|
||||
days.sort()
|
||||
while (dt.strptime(days[-1],"%Y-%m-%d") - dt.strptime(days[0], "%Y-%m-%d")).days > 40:
|
||||
self.removeDay(day=days[0])
|
||||
days = list(self.runs.keys())
|
||||
days.sort()
|
||||
|
||||
def addHertzDataPoint(self, frequency):
|
||||
if frequency > 0:
|
||||
self.manageTime()
|
||||
try:
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["frequencies"].append(frequency)
|
||||
except:
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["frequencies"] = [frequency]
|
||||
|
||||
def startRun(self):
|
||||
if self.checkRunning():
|
||||
self.endRun()
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["start"] = time.time()
|
||||
|
||||
def endRun(self):
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)]["end"] = time.time()
|
||||
self.currentRun += 1
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)] = {"start":0, "end": 0, "frequencies":[]}
|
||||
|
||||
def checkRunning(self):
|
||||
if self.runs[self.todayString]["run_" + str(self.currentRun)]["start"] and not self.runs[self.todayString]["run_" + str(self.currentRun)]["end"]:
|
||||
return True
|
||||
return False
|
||||
|
||||
def addDay(self):
|
||||
self.today = dt.today()
|
||||
self.todayString = dt.strftime(self.today, "%Y-%m-%d")
|
||||
self.currentRun = 1
|
||||
self.runs[self.todayString] = {}
|
||||
self.runs[self.todayString]["run_" + str(self.currentRun)] = {"start":0, "end": 0, "frequencies":[]}
|
||||
|
||||
def countRunsDay(self, day=None):
|
||||
if not day:
|
||||
day = self.todayString
|
||||
return len(self.runs[day].keys())
|
||||
|
||||
def countRunsMultiDay(self, numDays=30):
|
||||
total_runs = 0
|
||||
for day in list(self.runs.keys()):
|
||||
total_runs += self.countRunsDay(day=day)
|
||||
return total_runs
|
||||
|
||||
def calculateAverageHertzDay(self, day=None, returnArray=False):
|
||||
dayFrequencies = []
|
||||
if not day:
|
||||
day = self.todayString
|
||||
for run in list(self.runs[day].keys()):
|
||||
try:
|
||||
dayFrequencies += self.runs[day][run]["frequencies"]
|
||||
except Exception as e:
|
||||
logger.debug("{} missing frequency data for {}".format(day,run))
|
||||
if returnArray:
|
||||
return dayFrequencies
|
||||
return round(math.fsum(dayFrequencies)/len(dayFrequencies),2)
|
||||
|
||||
def calculateAverageHertzMultiDay(self, numDays=30):
|
||||
self.manageTime()
|
||||
frequencies = []
|
||||
for day in list(self.runs.keys()):
|
||||
if not day == self.todayString and (dt.strptime(self.todayString, "%Y-%m-%d") - dt.strptime(day, "%Y-%m-%d")).days <= numDays:
|
||||
try:
|
||||
frequencies += self.calculateAverageHertzDay(day=day, returnArray=True)
|
||||
except Exception as e:
|
||||
logger.debug("{} missing frequency data".format(day))
|
||||
if len(frequencies):
|
||||
return round(math.fsum(frequencies)/len(frequencies), 2)
|
||||
return 0
|
||||
|
||||
def calculateRunTimeDay(self, day=None, convertToHours=True):
|
||||
self.manageTime()
|
||||
total_time = 0
|
||||
if not day:
|
||||
day = self.todayString
|
||||
for run in list(self.runs.get(day,{}).keys()):
|
||||
if self.runs[day][run]["end"] == 0 and self.runs[day][run]["start"] != 0:
|
||||
total_time = time.time() - self.runs[day][run]["start"] + total_time
|
||||
else:
|
||||
total_time = self.runs[day][run]["end"] - self.runs[day][run]["start"] + total_time
|
||||
if convertToHours:
|
||||
return self.convertSecondstoHours(total_time)
|
||||
return total_time
|
||||
|
||||
def calculateRunTimeMultiDay(self, numDays=30, convertToHours=True):
|
||||
total_time = 0
|
||||
for day in list(self.runs.keys()):
|
||||
if (dt.strptime(self.todayString, "%Y-%m-%d") - dt.strptime(day, "%Y-%m-%d")).days <= numDays:
|
||||
total_time += self.calculateRunTimeDay(day=day, convertToHours=False)
|
||||
if convertToHours:
|
||||
return self.convertSecondstoHours(total_time)
|
||||
return total_time
|
||||
|
||||
def calculateRunPercentDay(self, day=None, precise=False):
|
||||
if not day:
|
||||
day = self.todayString
|
||||
if precise:
|
||||
return (self.calculateRunTimeDay(day=day)/24) * 100
|
||||
return round((self.calculateRunTimeDay(day=day)/24) * 100, 2)
|
||||
|
||||
|
||||
def calculateRunPercentMultiDay(self, numDays=30, precise=False):
|
||||
self.manageTime()
|
||||
if precise:
|
||||
return (self.calculateRunTimeMultiDay()/(24*numDays)) * 100
|
||||
return round((self.calculateRunTimeMultiDay()/(24*numDays)) * 100,2)
|
||||
|
||||
def removeDay(self, day=None):
|
||||
if not day:
|
||||
raise Exception("Day can not be None")
|
||||
logger.debug("removing day {}".format(day))
|
||||
try:
|
||||
del self.runs[day]
|
||||
except Exception as e:
|
||||
logger.error(f"Wasn't able to delete day {day}")
|
||||
logger.error(e)
|
||||
|
||||
|
||||
def convertSecondstoHours(self, seconds):
|
||||
return round(seconds / (60*60),2)
|
||||
|
||||
def resetData(self):
|
||||
logger.debug("clearing database")
|
||||
try:
|
||||
os.remove("/var/user/files/runtimestats.json")
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
return False
|
||||
self.loadDataFromFile()
|
||||
return True
|
||||
|
||||
def loadDataFromFile(self, filePath="/var/user/files/runtimestats.json"):
|
||||
try:
|
||||
with open(filePath, "r") as f:
|
||||
temp = json.load(f)
|
||||
self.runs = temp["data"]
|
||||
self.currentRun = temp["current_run"]
|
||||
self.today = dt.strptime(temp["current_day"], "%Y-%m-%d")
|
||||
self.todayString = temp["current_day"]
|
||||
self.manageTime()
|
||||
except:
|
||||
logger.debug("Could not find file at {}".format(filePath))
|
||||
logger.debug("creating file")
|
||||
self.addDay()
|
||||
try:
|
||||
with open(filePath, "w") as f:
|
||||
d = {
|
||||
"current_run": self.currentRun,
|
||||
"current_day": self.todayString,
|
||||
"data": self.runs
|
||||
}
|
||||
json.dump(d, f, indent=4)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
def saveDataToFile(self, filePath="/var/user/files/runtimestats.json"):
|
||||
try:
|
||||
logger.debug("Saving Runs")
|
||||
with open(filePath, "w") as f:
|
||||
d = {
|
||||
"current_run": self.currentRun,
|
||||
"current_day": self.todayString,
|
||||
"data": self.runs
|
||||
}
|
||||
json.dump(d, f, indent=4)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
rts = RuntimeStats()
|
||||
|
||||
|
||||
def reboot(reason="Rebooting for config file update"):
|
||||
#basic = Basic()
|
||||
logger.info("!" * 10 + "REBOOTING DEVICE" + "!"*10)
|
||||
logger.info(reason)
|
||||
r = os.popen("kill -s SIGHUP `cat /var/run/python/supervisord.pid`").read()
|
||||
logger.info(f"REBOOT : {r}")
|
||||
|
||||
def get_totalizers():
|
||||
try:
|
||||
with open("/var/user/files/totalizers.json", "r") as t:
|
||||
totalizers = json.load(t)
|
||||
if not totalizers:
|
||||
logger.info("-----INITIALIZING TOTALIZERS-----")
|
||||
totalizers = {
|
||||
"day": 0,
|
||||
"week": 0,
|
||||
"month": 0,
|
||||
"year": 0,
|
||||
"lifetime": 0,
|
||||
"dayHolding": 0,
|
||||
"weekHolding": 0,
|
||||
"monthHolding": 0,
|
||||
"yearHolding": 0
|
||||
}
|
||||
except:
|
||||
totalizers = {
|
||||
"day": 0,
|
||||
"week": 0,
|
||||
"month": 0,
|
||||
"year": 0,
|
||||
"lifetime": 0,
|
||||
"dayHolding": 0,
|
||||
"weekHolding": 0,
|
||||
"monthHolding": 0,
|
||||
"yearHolding": 0
|
||||
}
|
||||
return totalizers
|
||||
|
||||
def saveTotalizers(totalizers):
|
||||
try:
|
||||
with open("/var/user/files/totalizers.json", "w") as t:
|
||||
json.dump(totalizers,t)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
def resetTotalizers():
|
||||
try:
|
||||
totalizers = get_totalizers()
|
||||
|
||||
totalizers["dayHolding"] = 0
|
||||
totalizers["weekHolding"] = 0
|
||||
totalizers["monthHolding"] = 0
|
||||
totalizers["yearHolding"] = 0
|
||||
saveTotalizers(totalizers)
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
return e
|
||||
|
||||
def receiveCommand(topic, payload):
|
||||
|
||||
logger.debug(topic)
|
||||
logger.debug(json.loads(payload))
|
||||
p = json.loads(payload)
|
||||
command = p["method"]
|
||||
if command == "resetTotalizers":
|
||||
r = resetTotalizers()
|
||||
if r == True:
|
||||
message = [{"name": "flowmeter", "measures":[{"name":"reset_totalizers", "value": 1}]}]
|
||||
try:
|
||||
resp = write(message)
|
||||
payload = {
|
||||
"ts": (round(dt.timestamp(dt.now())/600)*600)*1000,
|
||||
"values": {
|
||||
"day_volume": 0,
|
||||
"yesterday_volume": 0,
|
||||
"week_volume": 0,
|
||||
"last_week_volume": 0,
|
||||
"month_volume": 0,
|
||||
"last_month_volume": 0,
|
||||
"year_volume": 0,
|
||||
"last_year_volume": 0
|
||||
}
|
||||
}
|
||||
publish("v1/devices/me/telemetry",json.dumps(payload))
|
||||
except Exception as e:
|
||||
logger.error("Failed to write message")
|
||||
logger.error(e)
|
||||
elif command == "resetRunTimeStats":
|
||||
rts.loadDataFromFile()
|
||||
r = rts.resetData()
|
||||
if r == True:
|
||||
payload = {
|
||||
"ts": (round(dt.timestamp(dt.now())/600)*600)*1000,
|
||||
"values": {
|
||||
"today_running_hours": 0,
|
||||
"yesterday_running_hours": 0,
|
||||
"month_running_hours": 0,
|
||||
"last_month_running_hours": 0
|
||||
}
|
||||
}
|
||||
publish("v1/devices/me/telemetry",json.dumps(payload))
|
||||
ack(topic.split("/")[-1], r)
|
||||
reboot("need to reset all softwares")
|
||||
|
||||
ack(topic.split("/")[-1], r)
|
||||
|
||||
|
||||
def ack(msgid, r):
|
||||
#logger.debug(msgid)
|
||||
#logger.debug(mac)
|
||||
#logger.debug(name)
|
||||
#logger.debug(value)
|
||||
publish("v1/devices/me/rpc/response/" + str(msgid), json.dumps({"msg": {"time": (round(dt.timestamp(dt.now())/600)*600)*1000, "response": r}, "metadata": "", "msgType": ""}))
|
||||
4538
Pub_Sub/sp_pond/thingsboard/plc_tags_2024-08-09.json
Normal file
4538
Pub_Sub/sp_pond/thingsboard/plc_tags_2024-08-09.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -200,7 +200,7 @@ def sendData(message):
|
||||
checkCredentialConfig()
|
||||
payload = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}}
|
||||
resetPayload = {"ts": "", "values": {}}
|
||||
regexPattern = r"fm_\d{2}_t\d"
|
||||
regexPattern = r"fm_\d{2}_\w*_t\d"
|
||||
pondLevels = {}
|
||||
for measure in message["measures"]:
|
||||
try:
|
||||
|
||||
@@ -1,185 +1,189 @@
|
||||
MeasuringPointName,ControllerName,GroupName,UploadType,DataType,EnableBit,BitIndex,reverseBit,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,Pt,Ct,Mapping_table,TransDecimal,bitMap,msecSample,DataEndianReverse,ReadOffset,ReadLength,DataParseMethod,BitId,storageLwTSDB
|
||||
cp_01_auto,sp_pond,default,periodic,BIT,,,0,FBK_Charge_Pump_Auto,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
cp_01_auto_alm,sp_pond,default,periodic,BIT,,,0,AL0_CP1_Not_in_Auto,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
cp_01_discharge_lo_alm,sp_pond,default,periodic,BIT,,,0,AL0_CP1_Discharge_PSI_Lo,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
cp_01_discharge_lo_lockout_alm,sp_pond,default,periodic,BIT,,,0,AL0_CP1_Low_Disch_PSI_Lock_Out,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
cp_01_discharge_lo_spt,sp_pond,default,periodic,FLOAT,,,,SPT_CP1_Low_Discharge_PSI,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
cp_01_discharge_psi,sp_pond,default,periodic,FLOAT,,,,Val_CP1_Disch_PSI,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
cp_01_faulted,sp_pond,default,periodic,BIT,,,0,FBK_Charge_Pump_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
cp_01_hand,sp_pond,default,periodic,BIT,,,0,FBK_Charge_Pump_Hand,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
cp_01_hoa_alm,sp_pond,default,periodic,BIT,,,0,AL0_CP1_HOA_Off,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
cp_01_in_hand_alm,sp_pond,default,periodic,BIT,,,0,AL0_Charge_Pump_In_Hand,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
cp_01_lo_clear_cmd,sp_pond,default,periodic,BIT,,,0,CMD_CP1_LO_Clear,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
cp_01_run_cmd,sp_pond,default,periodic,BIT,,,0,CMD_CP1_Run,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
cp_01_run_permissive,sp_pond,default,periodic,DINT,0,,,CP1_Run_Permissive,,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
cp_01_running,sp_pond,default,periodic,BIT,,,0,FBK_Charge_Pump_Running,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
cp_02_discharge_psi,sp_pond,default,periodic,FLOAT,,,,Val_CP2_Disch_PSI,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
fm_10_fr,sp_pond,default,periodic,FLOAT,,,,Val_FM_10in_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
fm_10_t1,sp_pond,default,periodic,FLOAT,,,,Val_FM_10in_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
fm_10_t2,sp_pond,default,periodic,FLOAT,,,,Val_FM_10in_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
fm_10_t3,sp_pond,default,periodic,FLOAT,,,,Val_FM_10in_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
fm_12_fr,sp_pond,default,periodic,FLOAT,,,,Val_FM_12in_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
fm_12_t1,sp_pond,default,periodic,FLOAT,,,,Val_FM_12in_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
fm_12_t2,sp_pond,default,periodic,FLOAT,,,,Val_FM_12in_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
fm_12_t3,sp_pond,default,periodic,FLOAT,,,,Val_FM_12in_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
hmi_fault_clear_cmd,sp_pond,default,periodic,BIT,,,0,CMD_HMI_Fault_Clear,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
hmi_system_start_cmd,sp_pond,default,periodic,BIT,,,0,CMD_HMI_System_Start,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
hmi_system_stop_cmd,sp_pond,default,periodic,BIT,,,0,CMD_HMI_System_Stop,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
pod_01_enable,sp_pond,default,periodic,BIT,,,0,CFG_Remote_Pod_1_Enable,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
pod_01_fm_01_fr,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM1_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_01_t1,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM1_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_01_t2,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM1_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_01_t3,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM1_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_02_fr,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM2_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_02_t1,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM2_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_02_t2,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM2_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_02_t3,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM2_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_03_fr,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM3_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_03_t1,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM3_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_03_t2,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM3_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_03_t3,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM3_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_04_fr,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM4_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_04_t1,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM4_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_04_t2,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM4_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_fm_04_t3,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_FM4_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_pond_level_01,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_Pond_Level_1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_pond_level_02,sp_pond,default,periodic,FLOAT,,,,Val_Pod1_Pond_Level_2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_pond_volume_01,sp_pond,default,periodic,FLOAT,,,,Val_Pod_1_Pond_Volume_1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_01_pond_volume_02,sp_pond,default,periodic,FLOAT,,,,Val_Pod_1_Pond_Volume_2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_enable,sp_pond,default,periodic,BIT,,,0,CFG_Remote_Pod_2_Enable,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
pod_02_fm_01_fr,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM1_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_01_t1,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM1_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_01_t2,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM1_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_01_t3,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM1_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_02_fr,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM2_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_02_t1,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM2_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_02_t2,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM2_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_02_t3,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM2_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_03_fr,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM3_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_03_t1,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM3_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_03_t2,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM3_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_03_t3,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM3_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_04_fr,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM4_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_04_t1,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM4_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_04_t2,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM4_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_fm_04_t3,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_FM4_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_pond_level_01,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_Pond_Level_1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_pond_level_02,sp_pond,default,periodic,FLOAT,,,,Val_Pod2_Pond_Level_2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_pond_volume_01,sp_pond,default,periodic,FLOAT,,,,Val_Pod_2_Pond_Volume_1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_02_pond_volume_02,sp_pond,default,periodic,FLOAT,,,,Val_Pod_2_Pond_Volume_2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_enable,sp_pond,default,periodic,BIT,,,0,CFG_Remote_Pod_3_Enable,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
pod_03_fm_01_fr,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM1_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_01_t1,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM1_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_01_t2,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM1_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_01_t3,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM1_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_02_fr,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM2_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_02_t1,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM2_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_02_t2,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM2_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_02_t3,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM2_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_03_fr,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM3_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_03_t1,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM3_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_03_t2,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM3_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_03_t3,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM3_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_04_fr,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM4_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_04_t1,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM4_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_04_t2,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM4_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_fm_04_t3,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_FM4_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_pond_level_01,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_Pond_Level_1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_pond_level_02,sp_pond,default,periodic,FLOAT,,,,Val_Pod3_Pond_Level_2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_pond_volume_01,sp_pond,default,periodic,FLOAT,,,,Val_Pod_3_Pond_Volume_1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
pod_03_pond_volume_02,sp_pond,default,periodic,FLOAT,,,,Val_Pod_3_Pond_Volume_2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
power_supply_faulted,sp_pond,default,periodic,BIT,,,0,FBK_Power_Supply_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
power_suppy_faulted,sp_pond,default,periodic,BIT,,,0,AL0_PS_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
scada_fault_clear_cmd,sp_pond,default,periodic,BIT,,,0,cmd_Scada_clear,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
scada_start_cmd,sp_pond,default,periodic,BIT,,,0,CMD_Scada_Start,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
scada_stop_cmd,sp_pond,default,periodic,BIT,,,0,CMD_Scada_Stop,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
tp_01_discharge_hi_lockout,sp_pond,default,periodic,BIT,,,0,TP1_Lockout_Counter_Hi_Disch,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
tp_01_hi_clear_cmd,sp_pond,default,periodic,BIT,,,0,CMD_TP1_Hi_Clear,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
tp_01_lo_clear_cmd,sp_pond,default,periodic,BIT,,,0,CMD_TP1_Lo_Clear,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
tp_01_pid_manual_spt,sp_pond,default,periodic,FLOAT,,,,SPT_TP1_PID_Manual_Speed,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
tp_01_pid_mode_spt,sp_pond,default,periodic,INT,0,,,SPT_TP1_Mode,,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
tp_01_pid_spt,sp_pond,default,periodic,FLOAT,,,,SPT_TP1_PID_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
tp_02_hi_clear_cmd,sp_pond,default,periodic,BIT,,,0,CMD_TP2_Hi_Clear,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
tp_02_lo_clear_cmd,sp_pond,default,periodic,BIT,,,0,CMD_TP2_Lo_Clear,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
tp_02_pid_inverse_cmd,sp_pond,default,periodic,BIT,,,0,CMD_TP2_PID_Inverse,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
tp_02_pid_loop_pv,sp_pond,default,periodic,FLOAT,,,,TP2_PID_Loop_PV,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
tp_02_pid_manual_cmd,sp_pond,default,periodic,BIT,,,0,CMD_TP2_PID_Manual,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
tp_02_pid_manual_spt,sp_pond,default,periodic,FLOAT,,,,SPT_TP2_PID_Manual_Speed,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
tp_02_pid_mode_spt,sp_pond,default,periodic,INT,0,,,SPT_TP2_Mode,,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
tp_02_pid_spt,sp_pond,default,periodic,FLOAT,,,,SPT_TP2_PID_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
tp_vfds_faulted_alm,sp_pond,default,periodic,BIT,,,0,AL0_Both_TP_VFDs_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
ups_faulted,sp_pond,default,periodic,BIT,,,0,FBK_UPS_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
ups_faulted_alm,sp_pond,default,periodic,BIT,,,0,AL0_UPS_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_alarm_lockout,sp_pond,default,periodic,INT,0,,,WTP1_Alarm_Lockout,,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_discharge_hi_alm,sp_pond,default,periodic,BIT,,,0,AL0_WTP1_High_Discharge_PSI,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_discharge_hi_lockout_alm,sp_pond,default,periodic,BIT,,,0,AL0_WTP1_Hi_Disch_Lockout,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_discharge_hi_spt,sp_pond,default,periodic,FLOAT,,,,SPT_WTP1_High_Discharge_PSI,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_discharge_lo_alm,sp_pond,default,periodic,BIT,,,0,AL0_WTP1_Low_Discharge_PSI,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_discharge_lo_lockout_alm,sp_pond,default,periodic,BIT,,,0,AL0_WTP1_Lo_Disch_Lockout,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_discharge_lo_spt,sp_pond,default,periodic,FLOAT,,,,SPT_WTP1_Low_Discharge_PSI,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_discharge_psi,sp_pond,default,periodic,FLOAT,,,,Val_WTP1_Discharge_PSI,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_fault_clear_cmd,sp_pond,default,periodic,BIT,,,0,CMD_WTP1_FaultClear,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_fault_code,sp_pond,default,periodic,INT,0,,,FBK_WTP1_FaultCode,,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_fm_01_fr,sp_pond,default,periodic,FLOAT,,,,Val_WTP1_FM1_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_fm_01_t1,sp_pond,default,periodic,FLOAT,,,,Val_WTP1_FM1_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_fm_01_t2,sp_pond,default,periodic,FLOAT,,,,Val_WTP1_FM1_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_fm_01_t3,sp_pond,default,periodic,FLOAT,,,,Val_WTP1_FM1_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_fm_02_fr,sp_pond,default,periodic,FLOAT,,,,Val_WTP1_FM2_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_fm_02_t1,sp_pond,default,periodic,FLOAT,,,,Val_WTP1_FM2_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_fm_02_t2,sp_pond,default,periodic,FLOAT,,,,Val_WTP1_FM2_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_fm_02_t3,sp_pond,default,periodic,FLOAT,,,,Val_WTP1_FM2_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_fm_active_spt,sp_pond,default,periodic,INT,0,,,SPT_WTP1_FM_Active,,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_jog_cmd,sp_pond,default,periodic,BIT,,,0,CMD_WTP1_Jog,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_run_permissive,sp_pond,default,periodic,DINT,0,,,WTP1_Run_Permissive,,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_speed_ref_cmd,sp_pond,default,periodic,FLOAT,,,,WTP1_Speed_Ref,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_start_cmd,sp_pond,default,periodic,BIT,,,0,CMD_WTP1_Start,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_stop_cmd,sp_pond,default,periodic,BIT,,,0,CMD_WTP1_Stop,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_vfd_actual_speed,sp_pond,default,periodic,FLOAT,,,,FBK_WTP1_VFD_Actual_Speed,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_vfd_cmd_speed,sp_pond,default,periodic,FLOAT,,,,FBK_WTP1_VFD_CMD_Speed,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_vfd_commsloss,sp_pond,default,periodic,BIT,,,0,FBK_WTP1_VFD_CommsLoss,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_vfd_dc_bus,sp_pond,default,periodic,FLOAT,,,,FBK_WTP1_VFD_DCBus,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_vfd_error,sp_pond,default,periodic,BIT,,,0,FBK_WTP1_VFD_Error,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_vfd_faulted,sp_pond,default,periodic,BIT,,,0,FBK_WTP1_VFD_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_vfd_output_current,sp_pond,default,periodic,FLOAT,,,,FBK_WTP1_VFD_OutputCurrent,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_vfd_output_voltage,sp_pond,default,periodic,FLOAT,,,,FBK_WTP1_VFD_OutputVoltage,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_vfd_ready,sp_pond,default,periodic,BIT,,,0,FBK_WTP1_VFD_Ready,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_vfd_running,sp_pond,default,periodic,BIT,,,0,FBK_WTP1_VFD_Running,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_01_vfd_timeout_spt,sp_pond,default,periodic,SINT,0,,,SPT_WTP1_VFD_TimeOut,,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_01_vfd_type,sp_pond,default,periodic,STRING,,,,FBK_WTP1_VFD_Type,,16,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_alarm_lockout,sp_pond,default,periodic,INT,0,,,WTP2_Alarm_Lockout,,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_discharge_hi_alm,sp_pond,default,periodic,BIT,,,0,AL0_WTP2_High_Discharge_PSI,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_discharge_hi_lockout_alm,sp_pond,default,periodic,BIT,,,0,AL0_WTP2_Hi_Disch_Lockout,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_discharge_hi_spt,sp_pond,default,periodic,FLOAT,,,,SPT_WTP2_High_Discharge_PSI,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_discharge_lo_alm,sp_pond,default,periodic,BIT,,,0,AL0_WTP2_Low_Discharge_PSI,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_discharge_lo_lockout_alm,sp_pond,default,periodic,BIT,,,0,AL0_WTP2_Lo_Disch_Lockout,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_discharge_lo_spt,sp_pond,default,periodic,FLOAT,,,,SPT_WTP2_Low_Discharge_PSI,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_discharge_psi,sp_pond,default,periodic,FLOAT,,,,Val_WTP2_Discharge_PSI,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_fault_clear_cmd,sp_pond,default,periodic,BIT,,,0,CMD_WTP2_FaultClear,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_fault_code,sp_pond,default,periodic,INT,0,,,FBK_WTP2_FaultCode,,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_fm_01_fr,sp_pond,default,periodic,FLOAT,,,,Val_WTP2_FM1_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_fm_01_t1,sp_pond,default,periodic,FLOAT,,,,Val_WTP2_FM1_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_fm_01_t2,sp_pond,default,periodic,FLOAT,,,,Val_WTP2_FM1_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_fm_01_t3,sp_pond,default,periodic,FLOAT,,,,Val_WTP2_FM1_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_fm_02_fr,sp_pond,default,periodic,FLOAT,,,,Val_WTP2_FM2_FR,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_fm_02_t1,sp_pond,default,periodic,FLOAT,,,,Val_WTP2_FM2_T1,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_fm_02_t2,sp_pond,default,periodic,FLOAT,,,,Val_WTP2_FM2_T2,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_fm_02_t3,sp_pond,default,periodic,FLOAT,,,,Val_WTP2_FM2_T3,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_fm_active_spt,sp_pond,default,periodic,INT,0,,,SPT_WTP2_FM_Active,,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_jog_cmd,sp_pond,default,periodic,BIT,,,0,CMD_WTP2_Jog,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_run_permissive,sp_pond,default,periodic,DINT,0,,,WTP2_Run_Permissive,,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_speed_ref_cmd,sp_pond,default,periodic,FLOAT,,,,WTP2_Speed_Ref,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_start_cmd,sp_pond,default,periodic,BIT,,,0,CMD_WTP2_Start,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_stop_cmd,sp_pond,default,periodic,BIT,,,0,CMD_WTP2_Stop,,,rw,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_vfd_actual_speed,sp_pond,default,periodic,FLOAT,,,,FBK_WTP2_VFD_Actual_Speed,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_vfd_cmd_speed,sp_pond,default,periodic,FLOAT,,,,FBK_WTP2_VFD_CMD_Speed,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_vfd_commsloss,sp_pond,default,periodic,BIT,,,0,FBK_WTP2_VFD_CommsLoss,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_vfd_dc_bus,sp_pond,default,periodic,FLOAT,,,,FBK_WTP2_VFD_DCBus,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_vfd_error,sp_pond,default,periodic,BIT,,,0,FBK_WTP2_VFD_Error,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_vfd_faulted,sp_pond,default,periodic,BIT,,,0,FBK_WTP2_VFD_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_vfd_output_current,sp_pond,default,periodic,FLOAT,,,,FBK_WTP2_VFD_OutputCurrent,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_vfd_output_voltage,sp_pond,default,periodic,FLOAT,,,,FBK_WTP2_VFD_OutputVoltage,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_vfd_ready,sp_pond,default,periodic,BIT,,,0,FBK_WTP2_VFD_Ready,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_vfd_running,sp_pond,default,periodic,BIT,,,0,FBK_WTP2_VFD_Running,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,0
|
||||
wtp_02_vfd_timeout_spt,sp_pond,default,periodic,SINT,0,,,SPT_WTP2_VFD_TimeOut,,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_02_vfd_type,sp_pond,default,periodic,STRING,,,,FBK_WTP2_VFD_Type,,16,ro,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
wtp_system_start_spt,sp_pond,default,periodic,FLOAT,,,,SPT_WTP_System_Start,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,0
|
||||
MeasuringPointName,ControllerName,GroupName,UploadType,DeadZonePercent,DataType,ArrayIndex,EnableBit,BitIndex,reverseBit,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,Pt,Ct,Mapping_table,TransDecimal,bitMap,msecSample,storageLwTSDB,DataEndianReverse,ReadOffset,ReadLength,WriteOffset,WriteLength,DataParseMethod,BitId
|
||||
cp_01_auto,sp_pond,default,periodic,,BIT,,,,0,FBK_Charge_Pump_Auto,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
cp_01_auto_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_CP1_Not_in_Auto,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
cp_01_discharge_lo_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_CP1_Discharge_PSI_Lo,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
cp_01_discharge_lo_lockout_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_CP1_Low_Disch_PSI_Lock_Out,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
cp_01_discharge_lo_spt,sp_pond,default,periodic,,FLOAT,,,,,SPT_CP1_Low_Discharge_PSI,2,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
cp_01_discharge_psi,sp_pond,default,periodic,,FLOAT,,,,,Val_CP1_Disch_PSI,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
cp_01_faulted,sp_pond,default,periodic,,BIT,,,,0,FBK_Charge_Pump_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
cp_01_hand,sp_pond,default,periodic,,BIT,,,,0,FBK_Charge_Pump_Hand,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
cp_01_hoa_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_CP1_HOA_Off,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
cp_01_in_hand_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_Charge_Pump_In_Hand,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
cp_01_lo_clear_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_CP1_LO_Clear,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
cp_01_run_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_CP1_Run,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
cp_01_run_permissive,sp_pond,default,periodic,,DINT,,0,,,CP1_Run_Permissive,,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
cp_01_running,sp_pond,default,periodic,,BIT,,,,0,FBK_Charge_Pump_Running,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
cp_02_discharge_psi,sp_pond,default,periodic,,FLOAT,,,,,Val_CP2_Disch_PSI,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fm_10_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_FM_10in_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fm_10_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_FM_10in_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fm_10_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_FM_10in_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fm_10_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_FM_10in_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fm_12_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_FM_12in_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fm_12_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_FM_12in_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fm_12_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_FM_12in_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fm_12_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_FM_12in_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fm_12_b_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_FM_B_12in_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fm_12_b_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_FM_B_12in_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fm_12_b_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_FM_B_12in_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
fm_12_b_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_FM_B_12in_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
hmi_fault_clear_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_HMI_Fault_Clear,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
hmi_system_start_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_HMI_System_Start,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
hmi_system_stop_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_HMI_System_Stop,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pod_01_enable,sp_pond,default,periodic,,BIT,,,,0,CFG_Remote_Pod_1_Enable,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pod_01_fm_01_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM1_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_01_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM1_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_01_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM1_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_01_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM1_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_02_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM2_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_02_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM2_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_02_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM2_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_02_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM2_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_03_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM3_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_03_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM3_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_03_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM3_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_03_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM3_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_04_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM4_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_04_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM4_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_04_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM4_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_fm_04_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_FM4_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_pond_level_01,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_Pond_Level_1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_pond_level_02,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod1_Pond_Level_2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_pond_volume_01,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod_1_Pond_Volume_1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_01_pond_volume_02,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod_1_Pond_Volume_2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_enable,sp_pond,default,periodic,,BIT,,,,0,CFG_Remote_Pod_2_Enable,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pod_02_fm_01_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM1_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_01_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM1_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_01_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM1_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_01_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM1_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_02_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM2_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_02_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM2_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_02_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM2_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_02_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM2_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_03_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM3_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_03_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM3_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_03_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM3_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_03_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM3_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_04_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM4_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_04_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM4_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_04_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM4_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_fm_04_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_FM4_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_pond_level_01,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_Pond_Level_1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_pond_level_02,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod2_Pond_Level_2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_pond_volume_01,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod_2_Pond_Volume_1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_02_pond_volume_02,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod_2_Pond_Volume_2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_enable,sp_pond,default,periodic,,BIT,,,,0,CFG_Remote_Pod_3_Enable,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
pod_03_fm_01_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM1_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_01_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM1_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_01_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM1_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_01_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM1_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_02_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM2_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_02_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM2_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_02_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM2_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_02_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM2_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_03_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM3_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_03_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM3_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_03_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM3_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_03_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM3_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_04_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM4_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_04_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM4_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_04_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM4_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_fm_04_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_FM4_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_pond_level_01,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_Pond_Level_1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_pond_level_02,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod3_Pond_Level_2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_pond_volume_01,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod_3_Pond_Volume_1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
pod_03_pond_volume_02,sp_pond,default,periodic,,FLOAT,,,,,Val_Pod_3_Pond_Volume_2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
power_supply_faulted,sp_pond,default,periodic,,BIT,,,,0,FBK_Power_Supply_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
power_suppy_faulted,sp_pond,default,periodic,,BIT,,,,0,AL0_PS_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
scada_fault_clear_cmd,sp_pond,default,periodic,,BIT,,,,0,cmd_Scada_clear,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
scada_start_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_Scada_Start,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
scada_stop_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_Scada_Stop,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
tp_01_discharge_hi_lockout,sp_pond,default,periodic,,BIT,,,,0,TP1_Lockout_Counter_Hi_Disch,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
tp_01_hi_clear_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_TP1_Hi_Clear,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
tp_01_lo_clear_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_TP1_Lo_Clear,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
tp_01_pid_manual_spt,sp_pond,default,periodic,,FLOAT,,,,,SPT_TP1_PID_Manual_Speed,2,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
tp_01_pid_mode_spt,sp_pond,default,periodic,,INT,,0,,,SPT_TP1_Mode,,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
tp_01_pid_spt,sp_pond,default,periodic,,FLOAT,,,,,SPT_TP1_PID_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
tp_02_hi_clear_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_TP2_Hi_Clear,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
tp_02_lo_clear_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_TP2_Lo_Clear,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
tp_02_pid_inverse_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_TP2_PID_Inverse,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
tp_02_pid_loop_pv,sp_pond,default,periodic,,FLOAT,,,,,TP2_PID_Loop_PV,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
tp_02_pid_manual_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_TP2_PID_Manual,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
tp_02_pid_manual_spt,sp_pond,default,periodic,,FLOAT,,,,,SPT_TP2_PID_Manual_Speed,2,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
tp_02_pid_mode_spt,sp_pond,default,periodic,,INT,,0,,,SPT_TP2_Mode,,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
tp_02_pid_spt,sp_pond,default,periodic,,FLOAT,,,,,SPT_TP2_PID_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
tp_vfds_faulted_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_Both_TP_VFDs_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
ups_faulted,sp_pond,default,periodic,,BIT,,,,0,FBK_UPS_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
ups_faulted_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_UPS_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_alarm_lockout,sp_pond,default,periodic,,INT,,0,,,WTP1_Alarm_Lockout,,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_discharge_hi_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_WTP1_High_Discharge_PSI,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_discharge_hi_lockout_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_WTP1_Hi_Disch_Lockout,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_discharge_hi_spt,sp_pond,default,periodic,,FLOAT,,,,,SPT_WTP1_High_Discharge_PSI,2,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_discharge_lo_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_WTP1_Low_Discharge_PSI,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_discharge_lo_lockout_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_WTP1_Lo_Disch_Lockout,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_discharge_lo_spt,sp_pond,default,periodic,,FLOAT,,,,,SPT_WTP1_Low_Discharge_PSI,2,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_discharge_psi,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP1_Discharge_PSI,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_fault_clear_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_WTP1_FaultClear,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_fault_code,sp_pond,default,periodic,,INT,,0,,,FBK_WTP1_FaultCode,,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_fm_01_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP1_FM1_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_fm_01_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP1_FM1_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_fm_01_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP1_FM1_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_fm_01_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP1_FM1_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_fm_02_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP1_FM2_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_fm_02_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP1_FM2_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_fm_02_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP1_FM2_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_fm_02_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP1_FM2_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_fm_active_spt,sp_pond,default,periodic,,INT,,0,,,SPT_WTP1_FM_Active,,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_jog_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_WTP1_Jog,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_run_permissive,sp_pond,default,periodic,,DINT,,0,,,WTP1_Run_Permissive,,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_speed_ref_cmd,sp_pond,default,periodic,,FLOAT,,,,,WTP1_Speed_Ref,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_start_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_WTP1_Start,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_stop_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_WTP1_Stop,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_vfd_actual_speed,sp_pond,default,periodic,,FLOAT,,,,,FBK_WTP1_VFD_Actual_Speed,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_vfd_cmd_speed,sp_pond,default,periodic,,FLOAT,,,,,FBK_WTP1_VFD_CMD_Speed,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_vfd_commsloss,sp_pond,default,periodic,,BIT,,,,0,FBK_WTP1_VFD_CommsLoss,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_vfd_dc_bus,sp_pond,default,periodic,,FLOAT,,,,,FBK_WTP1_VFD_DCBus,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_vfd_error,sp_pond,default,periodic,,BIT,,,,0,FBK_WTP1_VFD_Error,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_vfd_faulted,sp_pond,default,periodic,,BIT,,,,0,FBK_WTP1_VFD_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_vfd_output_current,sp_pond,default,periodic,,FLOAT,,,,,FBK_WTP1_VFD_OutputCurrent,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_vfd_output_voltage,sp_pond,default,periodic,,FLOAT,,,,,FBK_WTP1_VFD_OutputVoltage,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_vfd_ready,sp_pond,default,periodic,,BIT,,,,0,FBK_WTP1_VFD_Ready,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_vfd_running,sp_pond,default,periodic,,BIT,,,,0,FBK_WTP1_VFD_Running,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_01_vfd_timeout_spt,sp_pond,default,periodic,,SINT,,0,,,SPT_WTP1_VFD_TimeOut,,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_01_vfd_type,sp_pond,default,periodic,,STRING,,,,,FBK_WTP1_VFD_Type,,16,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_alarm_lockout,sp_pond,default,periodic,,INT,,0,,,WTP2_Alarm_Lockout,,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_discharge_hi_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_WTP2_High_Discharge_PSI,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_discharge_hi_lockout_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_WTP2_Hi_Disch_Lockout,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_discharge_hi_spt,sp_pond,default,periodic,,FLOAT,,,,,SPT_WTP2_High_Discharge_PSI,2,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_discharge_lo_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_WTP2_Low_Discharge_PSI,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_discharge_lo_lockout_alm,sp_pond,default,periodic,,BIT,,,,0,AL0_WTP2_Lo_Disch_Lockout,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_discharge_lo_spt,sp_pond,default,periodic,,FLOAT,,,,,SPT_WTP2_Low_Discharge_PSI,2,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_discharge_psi,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP2_Discharge_PSI,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_fault_clear_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_WTP2_FaultClear,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_fault_code,sp_pond,default,periodic,,INT,,0,,,FBK_WTP2_FaultCode,,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_fm_01_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP2_FM1_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_fm_01_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP2_FM1_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_fm_01_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP2_FM1_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_fm_01_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP2_FM1_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_fm_02_fr,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP2_FM2_FR,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_fm_02_t1,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP2_FM2_T1,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_fm_02_t2,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP2_FM2_T2,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_fm_02_t3,sp_pond,default,periodic,,FLOAT,,,,,Val_WTP2_FM2_T3,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_fm_active_spt,sp_pond,default,periodic,,INT,,0,,,SPT_WTP2_FM_Active,,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_jog_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_WTP2_Jog,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_run_permissive,sp_pond,default,periodic,,DINT,,0,,,WTP2_Run_Permissive,,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_speed_ref_cmd,sp_pond,default,periodic,,FLOAT,,,,,WTP2_Speed_Ref,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_start_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_WTP2_Start,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_stop_cmd,sp_pond,default,periodic,,BIT,,,,0,CMD_WTP2_Stop,,,rw,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_vfd_actual_speed,sp_pond,default,periodic,,FLOAT,,,,,FBK_WTP2_VFD_Actual_Speed,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_vfd_cmd_speed,sp_pond,default,periodic,,FLOAT,,,,,FBK_WTP2_VFD_CMD_Speed,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_vfd_commsloss,sp_pond,default,periodic,,BIT,,,,0,FBK_WTP2_VFD_CommsLoss,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_vfd_dc_bus,sp_pond,default,periodic,,FLOAT,,,,,FBK_WTP2_VFD_DCBus,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_vfd_error,sp_pond,default,periodic,,BIT,,,,0,FBK_WTP2_VFD_Error,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_vfd_faulted,sp_pond,default,periodic,,BIT,,,,0,FBK_WTP2_VFD_Faulted,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_vfd_output_current,sp_pond,default,periodic,,FLOAT,,,,,FBK_WTP2_VFD_OutputCurrent,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_vfd_output_voltage,sp_pond,default,periodic,,FLOAT,,,,,FBK_WTP2_VFD_OutputVoltage,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_vfd_ready,sp_pond,default,periodic,,BIT,,,,0,FBK_WTP2_VFD_Ready,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_vfd_running,sp_pond,default,periodic,,BIT,,,,0,FBK_WTP2_VFD_Running,,,ro,,,none,,,,,,,,,,,,,0,,0,,,,,,,
|
||||
wtp_02_vfd_timeout_spt,sp_pond,default,periodic,,SINT,,0,,,SPT_WTP2_VFD_TimeOut,,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_02_vfd_type,sp_pond,default,periodic,,STRING,,,,,FBK_WTP2_VFD_Type,,16,ro,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
wtp_system_start_spt,sp_pond,default,periodic,,FLOAT,,,,,SPT_WTP_System_Start,2,,rw,,,none,,,,,,,,,,,,,,,0,,,,,,,
|
||||
|
Reference in New Issue
Block a user