diff --git a/Pub_Sub/fk_leak_detection/thingsboard/leak_detection_2025_DEC_10.csv b/Pub_Sub/fk_leak_detection/thingsboard/leak_detection_2025_DEC_10.csv new file mode 100644 index 0000000..e5517bf --- /dev/null +++ b/Pub_Sub/fk_leak_detection/thingsboard/leak_detection_2025_DEC_10.csv @@ -0,0 +1,109 @@ +MeasuringPointName,ControllerName,GroupName,UploadType,DeadZoneType,DeadZonePercent,DataType,ArrayIndex,EnableBit,BitIndex,reverseBit,Address,Decimal,Len,CodeType,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,pollCycle,EnableRequestCount,RequestCount,, +fm_1_flowrate,leak_detection,fastReport,periodic,,,FLOAT,,,,,FIT1_FLOWRATE,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +fm_1_lolo_alm,leak_detection,fastReport,periodic,,,BIT,,0,0,0,FIT1_LL_ALARM,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +fm_1_lolo_reset_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,FIT1_LL_RESET_SPT,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +fm_1_lolo_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,FIT1_LL_SET_SPT,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +fm_1_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,FIT1_TOTAL_FLOWRATE,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +fm_2_flowrate,leak_detection,fastReport,periodic,,,FLOAT,,,,,FIT2_FLOWRATE,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +fm_2_lolo_alm,leak_detection,fastReport,periodic,,,BIT,,0,0,0,FIT2_LL_ALARM,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +fm_2_lolo_reset_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,FIT2_LL_RESET_SPT,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +fm_2_lolo_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,FIT2_LL_SET_SPT,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +fm_2_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,FIT2_TOTAL_FLOWRATE,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_0ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_0FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_10ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_10FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_11ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_11FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_12ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_12FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_13ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_13FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_14ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_14FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_15ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_15FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_16ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_16FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_1ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_1FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_2ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_2FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_3ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_3FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_4ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_4FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_5ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_5FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_6ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_6FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_7ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_7FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_8ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_8FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_9ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_9FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_cu_ft,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_CU_Ft,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_cubic_feet_to_barrels,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Cubic_Feet_To_Barrels,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_hi_alm,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_1_Hi_Alarm,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_hi_alm_enable,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_1_Hi_Alarm_Enable,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_hi_alm_enabled,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_1_Hi_Alarm_Enabled,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_hi_clr_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Hi_Clr_Setpoint,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_hi_reset,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_1_Hi_Reset,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_hi_set,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_1_Hi_Set,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_hi_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Hi_Setpoint,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_level,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Lev,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_level_psi,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Lev_Psi,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_lo_alm,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_1_Lo_Alarm,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_lo_clr_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Lo_Clr_Setpoint,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_lo_reset,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_1_Lo_Reset,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_lo_set,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_1_Lo_Set,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_lo_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Lo_Setpoint,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_pump_off_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Pump_Off_Spt,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_pump_on_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Pump_On_Spt,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_raw_max,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Raw_Max,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_raw_min,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Raw_Min,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_rise_multiplier,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Rise_Multiplier,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_scaled_max,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_ScaledMax,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_scaled_min,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_ScaledMin,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_stage_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Stage_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_1_total_barrels,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_1_Total_Barrels,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_0ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_0FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_10ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_10FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_11ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_11FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_12ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_12FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_13ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_13FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_14ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_14FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_15ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_15FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_16ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_16FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_1ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_1FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_2ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_2FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_3ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_3FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_4ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_4FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_5ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_5FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_6ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_6FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_7ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_7FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_8ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_8FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_9ft_volume_total,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_9FT_Volume_Total,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_cu_ft,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_CU_Ft,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_cubic_feet_to_barrels,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Cubic_Feet_To_Barrels,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_hi_alm,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_2_Hi_Alarm,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_hi_clr_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Hi_Clr_Setpoint,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_hi_reset,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_2_Hi_Reset,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_hi_set,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_2_Hi_Set,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_hi_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Hi_Setpoint,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_level,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Lev,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_level_psi,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Lev_Psi,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_lo_alm,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_2_Lo_Alarm,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_lo_clr_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Lo_Clr_Setpoint,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_lo_reset,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_2_Lo_Reset,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_lo_set,leak_detection,fastReport,periodic,,,BIT,,0,0,0,Leak_2_Lo_Set,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_lo_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Lo_Setpoint,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_pump_off_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Pump_Off_Spt,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_pump_on_spt,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Pump_On_Spt,2,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_raw_max,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Raw_Max,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_raw_min,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Raw_Min,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_rise_multiplier,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Rise_Multiplier,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_scaled_max,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_ScaledMax,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_scaled_min,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_ScaledMin,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +leak_2_total_barrels,leak_detection,fastReport,periodic,,,FLOAT,,,,,Leak_2_Total_Barrels,2,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p001_auto,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P001_AUTO_FBK,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p001_hand,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P001_HAND_FBK,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p001_overload,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P001_OVERLOAD_FBK,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p001_overload_alm,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P001_OVERLOAD_ALARM,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p001_run,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P001_RUN_FBK,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p001_run_cmd,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P001_RUN_CMD,,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p001_run_fail_alm,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P001_RUN_FAIL_ALARM,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p001_start,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P001_START_BTN_FBK,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p002_auto,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P002_AUTO_FBK,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p002_hand,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P002_HAND_FBK,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p002_overload,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P002_OVERLOAD_FBK,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p002_overload_alm,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P002_OVERLOAD_ALARM,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p002_run,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P002_RUN_FBK,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p002_run_cmd,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P002_RUN_CMD,,,,rw,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p002_run_fail_alm,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P002_RUN_FAIL_ALARM,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +p002_start,leak_detection,fastReport,periodic,,,BIT,,0,0,0,P002_START_BTN_FBK,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, +reset,leak_detection,fastReport,periodic,,,BIT,,0,0,0,RESET,,,,ro,,,none,,,,,,,,,,,,,0,,1,,,,,,,,,,,, \ No newline at end of file diff --git a/Pub_Sub/fk_leak_detection/thingsboard/tag_dump_2025_December_09.json b/Pub_Sub/fk_leak_detection/thingsboard/tag_dump_2025_December_09.json new file mode 100644 index 0000000..b3b39d0 --- /dev/null +++ b/Pub_Sub/fk_leak_detection/thingsboard/tag_dump_2025_December_09.json @@ -0,0 +1,2392 @@ +{ + "_IO_EM_DO_00": { + "tag_name": "_IO_EM_DO_00", + "dim": 0, + "alias": true, + "instance_id": 1, + "symbol_address": 1044, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DO_01": { + "tag_name": "_IO_EM_DO_01", + "dim": 0, + "alias": true, + "instance_id": 2, + "symbol_address": 1045, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DO_02": { + "tag_name": "_IO_EM_DO_02", + "dim": 0, + "alias": true, + "instance_id": 3, + "symbol_address": 1046, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DO_03": { + "tag_name": "_IO_EM_DO_03", + "dim": 0, + "alias": true, + "instance_id": 4, + "symbol_address": 1047, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DO_04": { + "tag_name": "_IO_EM_DO_04", + "dim": 0, + "alias": true, + "instance_id": 5, + "symbol_address": 1048, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DO_05": { + "tag_name": "_IO_EM_DO_05", + "dim": 0, + "alias": true, + "instance_id": 6, + "symbol_address": 1049, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DO_06": { + "tag_name": "_IO_EM_DO_06", + "dim": 0, + "alias": true, + "instance_id": 7, + "symbol_address": 1050, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_00": { + "tag_name": "_IO_EM_DI_00", + "dim": 0, + "alias": true, + "instance_id": 8, + "symbol_address": 1051, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_01": { + "tag_name": "_IO_EM_DI_01", + "dim": 0, + "alias": true, + "instance_id": 9, + "symbol_address": 1052, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_02": { + "tag_name": "_IO_EM_DI_02", + "dim": 0, + "alias": true, + "instance_id": 10, + "symbol_address": 1053, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_03": { + "tag_name": "_IO_EM_DI_03", + "dim": 0, + "alias": true, + "instance_id": 11, + "symbol_address": 1054, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_04": { + "tag_name": "_IO_EM_DI_04", + "dim": 0, + "alias": true, + "instance_id": 12, + "symbol_address": 1055, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_05": { + "tag_name": "_IO_EM_DI_05", + "dim": 0, + "alias": true, + "instance_id": 13, + "symbol_address": 1056, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_06": { + "tag_name": "_IO_EM_DI_06", + "dim": 0, + "alias": true, + "instance_id": 14, + "symbol_address": 1057, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_07": { + "tag_name": "_IO_EM_DI_07", + "dim": 0, + "alias": true, + "instance_id": 15, + "symbol_address": 1058, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_08": { + "tag_name": "_IO_EM_DI_08", + "dim": 0, + "alias": true, + "instance_id": 16, + "symbol_address": 1059, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_09": { + "tag_name": "_IO_EM_DI_09", + "dim": 0, + "alias": true, + "instance_id": 17, + "symbol_address": 1060, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_10": { + "tag_name": "_IO_EM_DI_10", + "dim": 0, + "alias": true, + "instance_id": 18, + "symbol_address": 1061, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_11": { + "tag_name": "_IO_EM_DI_11", + "dim": 0, + "alias": true, + "instance_id": 19, + "symbol_address": 1062, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_AI_00": { + "tag_name": "_IO_EM_AI_00", + "dim": 0, + "alias": true, + "instance_id": 20, + "symbol_address": 1064, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_EM_AI_01": { + "tag_name": "_IO_EM_AI_01", + "dim": 0, + "alias": true, + "instance_id": 21, + "symbol_address": 1066, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_EM_AI_02": { + "tag_name": "_IO_EM_AI_02", + "dim": 0, + "alias": true, + "instance_id": 22, + "symbol_address": 1068, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_EM_AI_03": { + "tag_name": "_IO_EM_AI_03", + "dim": 0, + "alias": true, + "instance_id": 23, + "symbol_address": 1070, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_EM_AO_00": { + "tag_name": "_IO_EM_AO_00", + "dim": 0, + "alias": true, + "instance_id": 24, + "symbol_address": 1072, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_P1_AI_00": { + "tag_name": "_IO_P1_AI_00", + "dim": 0, + "alias": true, + "instance_id": 25, + "symbol_address": 1074, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_P1_AI_01": { + "tag_name": "_IO_P1_AI_01", + "dim": 0, + "alias": true, + "instance_id": 26, + "symbol_address": 1076, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_P1_AI_02": { + "tag_name": "_IO_P1_AI_02", + "dim": 0, + "alias": true, + "instance_id": 27, + "symbol_address": 1078, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_P1_AI_03": { + "tag_name": "_IO_P1_AI_03", + "dim": 0, + "alias": true, + "instance_id": 28, + "symbol_address": 1080, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "Leak_1_Hi_Set": { + "tag_name": "Leak_1_Hi_Set", + "dim": 0, + "alias": true, + "instance_id": 29, + "symbol_address": 1124, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Hi_Reset": { + "tag_name": "Leak_1_Hi_Reset", + "dim": 0, + "alias": true, + "instance_id": 30, + "symbol_address": 1125, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Hi_Alarm": { + "tag_name": "Leak_1_Hi_Alarm", + "dim": 0, + "alias": true, + "instance_id": 31, + "symbol_address": 1126, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_2_Hi_Set": { + "tag_name": "Leak_2_Hi_Set", + "dim": 0, + "alias": true, + "instance_id": 32, + "symbol_address": 1127, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_2_Hi_Reset": { + "tag_name": "Leak_2_Hi_Reset", + "dim": 0, + "alias": true, + "instance_id": 33, + "symbol_address": 1128, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_2_Hi_Alarm": { + "tag_name": "Leak_2_Hi_Alarm", + "dim": 0, + "alias": true, + "instance_id": 34, + "symbol_address": 1129, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Lo_Set": { + "tag_name": "Leak_1_Lo_Set", + "dim": 0, + "alias": true, + "instance_id": 35, + "symbol_address": 1130, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Lo_Reset": { + "tag_name": "Leak_1_Lo_Reset", + "dim": 0, + "alias": true, + "instance_id": 36, + "symbol_address": 1131, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Lo_Alarm": { + "tag_name": "Leak_1_Lo_Alarm", + "dim": 0, + "alias": true, + "instance_id": 37, + "symbol_address": 1132, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_2_Lo_Set": { + "tag_name": "Leak_2_Lo_Set", + "dim": 0, + "alias": true, + "instance_id": 38, + "symbol_address": 1133, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_2_Lo_Reset": { + "tag_name": "Leak_2_Lo_Reset", + "dim": 0, + "alias": true, + "instance_id": 39, + "symbol_address": 1134, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_2_Lo_Alarm": { + "tag_name": "Leak_2_Lo_Alarm", + "dim": 0, + "alias": true, + "instance_id": 40, + "symbol_address": 1135, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Hi_Alarm_Enable": { + "tag_name": "Leak_1_Hi_Alarm_Enable", + "dim": 0, + "alias": true, + "instance_id": 41, + "symbol_address": 1136, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Hi_Alarm_Enabled": { + "tag_name": "Leak_1_Hi_Alarm_Enabled", + "dim": 0, + "alias": true, + "instance_id": 42, + "symbol_address": 1137, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_RUN_FAIL_ALARM": { + "tag_name": "P002_RUN_FAIL_ALARM", + "dim": 0, + "alias": true, + "instance_id": 43, + "symbol_address": 1138, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_OVERLOAD_ALARM": { + "tag_name": "P002_OVERLOAD_ALARM", + "dim": 0, + "alias": true, + "instance_id": 44, + "symbol_address": 1139, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_RUN_FAIL_ALARM": { + "tag_name": "P001_RUN_FAIL_ALARM", + "dim": 0, + "alias": true, + "instance_id": 45, + "symbol_address": 1140, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_OVERLOAD_ALARM": { + "tag_name": "P001_OVERLOAD_ALARM", + "dim": 0, + "alias": true, + "instance_id": 46, + "symbol_address": 1141, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_AUTO_FBK": { + "tag_name": "P001_AUTO_FBK", + "dim": 0, + "alias": true, + "instance_id": 47, + "symbol_address": 1142, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_HAND_FBK": { + "tag_name": "P001_HAND_FBK", + "dim": 0, + "alias": true, + "instance_id": 48, + "symbol_address": 1143, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_START_BTN_FBK": { + "tag_name": "P001_START_BTN_FBK", + "dim": 0, + "alias": true, + "instance_id": 49, + "symbol_address": 1144, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_OVERLOAD_FBK": { + "tag_name": "P001_OVERLOAD_FBK", + "dim": 0, + "alias": true, + "instance_id": 50, + "symbol_address": 1145, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_RUN_FBK": { + "tag_name": "P001_RUN_FBK", + "dim": 0, + "alias": true, + "instance_id": 51, + "symbol_address": 1146, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_AUTO_FBK": { + "tag_name": "P002_AUTO_FBK", + "dim": 0, + "alias": true, + "instance_id": 52, + "symbol_address": 1147, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_HAND_FBK": { + "tag_name": "P002_HAND_FBK", + "dim": 0, + "alias": true, + "instance_id": 53, + "symbol_address": 1148, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_START_BTN_FBK": { + "tag_name": "P002_START_BTN_FBK", + "dim": 0, + "alias": true, + "instance_id": 54, + "symbol_address": 1149, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_OVERLOAD_FBK": { + "tag_name": "P002_OVERLOAD_FBK", + "dim": 0, + "alias": true, + "instance_id": 55, + "symbol_address": 1150, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_RUN_FBK": { + "tag_name": "P002_RUN_FBK", + "dim": 0, + "alias": true, + "instance_id": 56, + "symbol_address": 1151, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_RUN_CMD": { + "tag_name": "P001_RUN_CMD", + "dim": 0, + "alias": true, + "instance_id": 57, + "symbol_address": 1152, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_RUN_CMD": { + "tag_name": "P002_RUN_CMD", + "dim": 0, + "alias": true, + "instance_id": 58, + "symbol_address": 1153, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "RESET": { + "tag_name": "RESET", + "dim": 0, + "alias": true, + "instance_id": 59, + "symbol_address": 1154, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Lev": { + "tag_name": "Leak_1_Lev", + "dim": 0, + "alias": true, + "instance_id": 60, + "symbol_address": 1160, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_ScaledMin": { + "tag_name": "Leak_1_ScaledMin", + "dim": 0, + "alias": true, + "instance_id": 61, + "symbol_address": 1164, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_ScaledMax": { + "tag_name": "Leak_1_ScaledMax", + "dim": 0, + "alias": true, + "instance_id": 62, + "symbol_address": 1168, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Lev": { + "tag_name": "Leak_2_Lev", + "dim": 0, + "alias": true, + "instance_id": 63, + "symbol_address": 1172, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_ScaledMin": { + "tag_name": "Leak_2_ScaledMin", + "dim": 0, + "alias": true, + "instance_id": 64, + "symbol_address": 1176, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_ScaledMax": { + "tag_name": "Leak_2_ScaledMax", + "dim": 0, + "alias": true, + "instance_id": 65, + "symbol_address": 1180, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Hi_Setpoint": { + "tag_name": "Leak_1_Hi_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 66, + "symbol_address": 1184, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Hi_Clr_Setpoint": { + "tag_name": "Leak_1_Hi_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 67, + "symbol_address": 1188, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Hi_Setpoint": { + "tag_name": "Leak_2_Hi_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 68, + "symbol_address": 1192, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Hi_Clr_Setpoint": { + "tag_name": "Leak_2_Hi_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 69, + "symbol_address": 1196, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_CU_Ft": { + "tag_name": "Leak_1_CU_Ft", + "dim": 0, + "alias": true, + "instance_id": 70, + "symbol_address": 1200, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Cubic_Feet_To_Barrels": { + "tag_name": "Leak_1_Cubic_Feet_To_Barrels", + "dim": 0, + "alias": true, + "instance_id": 71, + "symbol_address": 1204, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Total_Barrels": { + "tag_name": "Leak_1_Total_Barrels", + "dim": 0, + "alias": true, + "instance_id": 72, + "symbol_address": 1208, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Lo_Setpoint": { + "tag_name": "Leak_1_Lo_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 73, + "symbol_address": 1212, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Lev_Temp": { + "tag_name": "Leak_1_Lev_Temp", + "dim": 0, + "alias": true, + "instance_id": 74, + "symbol_address": 1216, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Lo_Clr_Setpoint": { + "tag_name": "Leak_1_Lo_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 75, + "symbol_address": 1220, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Lo_Setpoint": { + "tag_name": "Leak_2_Lo_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 76, + "symbol_address": 1224, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Lo_Clr_Setpoint": { + "tag_name": "Leak_2_Lo_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 77, + "symbol_address": 1228, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Tot_Bbls_Temp": { + "tag_name": "Leak_1_Tot_Bbls_Temp", + "dim": 0, + "alias": true, + "instance_id": 78, + "symbol_address": 1232, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Lev_Temp": { + "tag_name": "Leak_2_Lev_Temp", + "dim": 0, + "alias": true, + "instance_id": 79, + "symbol_address": 1236, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_CU_Ft": { + "tag_name": "Leak_2_CU_Ft", + "dim": 0, + "alias": true, + "instance_id": 80, + "symbol_address": 1240, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Tot_Bbls_Temp": { + "tag_name": "Leak_2_Tot_Bbls_Temp", + "dim": 0, + "alias": true, + "instance_id": 81, + "symbol_address": 1244, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Cubic_Feet_To_Barrels": { + "tag_name": "Leak_2_Cubic_Feet_To_Barrels", + "dim": 0, + "alias": true, + "instance_id": 82, + "symbol_address": 1248, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Total_Barrels": { + "tag_name": "Leak_2_Total_Barrels", + "dim": 0, + "alias": true, + "instance_id": 83, + "symbol_address": 1252, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_0FT_Volume_Total": { + "tag_name": "Leak_1_0FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 84, + "symbol_address": 1256, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_1FT_Volume_Total": { + "tag_name": "Leak_1_1FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 85, + "symbol_address": 1260, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_2FT_Volume_Total": { + "tag_name": "Leak_1_2FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 86, + "symbol_address": 1264, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_3FT_Volume_Total": { + "tag_name": "Leak_1_3FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 87, + "symbol_address": 1268, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_4FT_Volume_Total": { + "tag_name": "Leak_1_4FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 88, + "symbol_address": 1272, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_5FT_Volume_Total": { + "tag_name": "Leak_1_5FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 89, + "symbol_address": 1276, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_6FT_Volume_Total": { + "tag_name": "Leak_1_6FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 90, + "symbol_address": 1280, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_7FT_Volume_Total": { + "tag_name": "Leak_1_7FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 91, + "symbol_address": 1284, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_8FT_Volume_Total": { + "tag_name": "Leak_1_8FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 92, + "symbol_address": 1288, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_9FT_Volume_Total": { + "tag_name": "Leak_1_9FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 93, + "symbol_address": 1292, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_10FT_Volume_Total": { + "tag_name": "Leak_1_10FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 94, + "symbol_address": 1296, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_11FT_Volume_Total": { + "tag_name": "Leak_1_11FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 95, + "symbol_address": 1300, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_12FT_Volume_Total": { + "tag_name": "Leak_1_12FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 96, + "symbol_address": 1304, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_13FT_Volume_Total": { + "tag_name": "Leak_1_13FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 97, + "symbol_address": 1308, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_14FT_Volume_Total": { + "tag_name": "Leak_1_14FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 98, + "symbol_address": 1312, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_16FT_Volume_Total": { + "tag_name": "Leak_1_16FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 99, + "symbol_address": 1316, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_15FT_Volume_Total": { + "tag_name": "Leak_1_15FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 100, + "symbol_address": 1320, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Stage_Total": { + "tag_name": "Leak_1_Stage_Total", + "dim": 0, + "alias": true, + "instance_id": 101, + "symbol_address": 1324, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Rise_Multiplier": { + "tag_name": "Leak_1_Rise_Multiplier", + "dim": 0, + "alias": true, + "instance_id": 102, + "symbol_address": 1328, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Rise_Multiplier": { + "tag_name": "Leak_2_Rise_Multiplier", + "dim": 0, + "alias": true, + "instance_id": 103, + "symbol_address": 1332, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_0FT_Volume_Total": { + "tag_name": "Leak_2_0FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 104, + "symbol_address": 1336, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_1FT_Volume_Total": { + "tag_name": "Leak_2_1FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 105, + "symbol_address": 1340, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_2FT_Volume_Total": { + "tag_name": "Leak_2_2FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 106, + "symbol_address": 1344, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_3FT_Volume_Total": { + "tag_name": "Leak_2_3FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 107, + "symbol_address": 1348, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_4FT_Volume_Total": { + "tag_name": "Leak_2_4FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 108, + "symbol_address": 1352, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_5FT_Volume_Total": { + "tag_name": "Leak_2_5FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 109, + "symbol_address": 1356, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_6FT_Volume_Total": { + "tag_name": "Leak_2_6FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 110, + "symbol_address": 1360, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_7FT_Volume_Total": { + "tag_name": "Leak_2_7FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 111, + "symbol_address": 1364, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_8FT_Volume_Total": { + "tag_name": "Leak_2_8FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 112, + "symbol_address": 1368, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_9FT_Volume_Total": { + "tag_name": "Leak_2_9FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 113, + "symbol_address": 1372, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_10FT_Volume_Total": { + "tag_name": "Leak_2_10FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 114, + "symbol_address": 1376, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_11FT_Volume_Total": { + "tag_name": "Leak_2_11FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 115, + "symbol_address": 1380, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_12FT_Volume_Total": { + "tag_name": "Leak_2_12FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 116, + "symbol_address": 1384, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_13FT_Volume_Total": { + "tag_name": "Leak_2_13FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 117, + "symbol_address": 1388, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_14FT_Volume_Total": { + "tag_name": "Leak_2_14FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 118, + "symbol_address": 1392, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_15FT_Volume_Total": { + "tag_name": "Leak_2_15FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 119, + "symbol_address": 1396, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_16FT_Volume_Total": { + "tag_name": "Leak_2_16FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 120, + "symbol_address": 1400, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Raw_Min": { + "tag_name": "Leak_1_Raw_Min", + "dim": 0, + "alias": true, + "instance_id": 121, + "symbol_address": 1404, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Raw_Max": { + "tag_name": "Leak_1_Raw_Max", + "dim": 0, + "alias": true, + "instance_id": 122, + "symbol_address": 1408, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Raw_Min": { + "tag_name": "Leak_2_Raw_Min", + "dim": 0, + "alias": true, + "instance_id": 123, + "symbol_address": 1412, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Raw_Max": { + "tag_name": "Leak_2_Raw_Max", + "dim": 0, + "alias": true, + "instance_id": 124, + "symbol_address": 1416, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Lev_Psi": { + "tag_name": "Leak_1_Lev_Psi", + "dim": 0, + "alias": true, + "instance_id": 125, + "symbol_address": 1420, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Lev_Psi": { + "tag_name": "Leak_2_Lev_Psi", + "dim": 0, + "alias": true, + "instance_id": 126, + "symbol_address": 1424, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Pump_On_Spt": { + "tag_name": "Leak_1_Pump_On_Spt", + "dim": 0, + "alias": true, + "instance_id": 127, + "symbol_address": 1428, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Pump_Off_Spt": { + "tag_name": "Leak_1_Pump_Off_Spt", + "dim": 0, + "alias": true, + "instance_id": 128, + "symbol_address": 1432, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Pump_On_Spt": { + "tag_name": "Leak_2_Pump_On_Spt", + "dim": 0, + "alias": true, + "instance_id": 129, + "symbol_address": 1436, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Pump_Off_Spt": { + "tag_name": "Leak_2_Pump_Off_Spt", + "dim": 0, + "alias": true, + "instance_id": 130, + "symbol_address": 1440, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + } +} \ No newline at end of file diff --git a/Pub_Sub/fk_leak_detection/thingsboard/tag_dump_2025_December_10.json b/Pub_Sub/fk_leak_detection/thingsboard/tag_dump_2025_December_10.json new file mode 100644 index 0000000..b3b39d0 --- /dev/null +++ b/Pub_Sub/fk_leak_detection/thingsboard/tag_dump_2025_December_10.json @@ -0,0 +1,2392 @@ +{ + "_IO_EM_DO_00": { + "tag_name": "_IO_EM_DO_00", + "dim": 0, + "alias": true, + "instance_id": 1, + "symbol_address": 1044, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DO_01": { + "tag_name": "_IO_EM_DO_01", + "dim": 0, + "alias": true, + "instance_id": 2, + "symbol_address": 1045, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DO_02": { + "tag_name": "_IO_EM_DO_02", + "dim": 0, + "alias": true, + "instance_id": 3, + "symbol_address": 1046, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DO_03": { + "tag_name": "_IO_EM_DO_03", + "dim": 0, + "alias": true, + "instance_id": 4, + "symbol_address": 1047, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DO_04": { + "tag_name": "_IO_EM_DO_04", + "dim": 0, + "alias": true, + "instance_id": 5, + "symbol_address": 1048, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DO_05": { + "tag_name": "_IO_EM_DO_05", + "dim": 0, + "alias": true, + "instance_id": 6, + "symbol_address": 1049, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DO_06": { + "tag_name": "_IO_EM_DO_06", + "dim": 0, + "alias": true, + "instance_id": 7, + "symbol_address": 1050, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_00": { + "tag_name": "_IO_EM_DI_00", + "dim": 0, + "alias": true, + "instance_id": 8, + "symbol_address": 1051, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_01": { + "tag_name": "_IO_EM_DI_01", + "dim": 0, + "alias": true, + "instance_id": 9, + "symbol_address": 1052, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_02": { + "tag_name": "_IO_EM_DI_02", + "dim": 0, + "alias": true, + "instance_id": 10, + "symbol_address": 1053, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_03": { + "tag_name": "_IO_EM_DI_03", + "dim": 0, + "alias": true, + "instance_id": 11, + "symbol_address": 1054, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_04": { + "tag_name": "_IO_EM_DI_04", + "dim": 0, + "alias": true, + "instance_id": 12, + "symbol_address": 1055, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_05": { + "tag_name": "_IO_EM_DI_05", + "dim": 0, + "alias": true, + "instance_id": 13, + "symbol_address": 1056, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_06": { + "tag_name": "_IO_EM_DI_06", + "dim": 0, + "alias": true, + "instance_id": 14, + "symbol_address": 1057, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_07": { + "tag_name": "_IO_EM_DI_07", + "dim": 0, + "alias": true, + "instance_id": 15, + "symbol_address": 1058, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_08": { + "tag_name": "_IO_EM_DI_08", + "dim": 0, + "alias": true, + "instance_id": 16, + "symbol_address": 1059, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_09": { + "tag_name": "_IO_EM_DI_09", + "dim": 0, + "alias": true, + "instance_id": 17, + "symbol_address": 1060, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_10": { + "tag_name": "_IO_EM_DI_10", + "dim": 0, + "alias": true, + "instance_id": 18, + "symbol_address": 1061, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_DI_11": { + "tag_name": "_IO_EM_DI_11", + "dim": 0, + "alias": true, + "instance_id": 19, + "symbol_address": 1062, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "_IO_EM_AI_00": { + "tag_name": "_IO_EM_AI_00", + "dim": 0, + "alias": true, + "instance_id": 20, + "symbol_address": 1064, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_EM_AI_01": { + "tag_name": "_IO_EM_AI_01", + "dim": 0, + "alias": true, + "instance_id": 21, + "symbol_address": 1066, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_EM_AI_02": { + "tag_name": "_IO_EM_AI_02", + "dim": 0, + "alias": true, + "instance_id": 22, + "symbol_address": 1068, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_EM_AI_03": { + "tag_name": "_IO_EM_AI_03", + "dim": 0, + "alias": true, + "instance_id": 23, + "symbol_address": 1070, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_EM_AO_00": { + "tag_name": "_IO_EM_AO_00", + "dim": 0, + "alias": true, + "instance_id": 24, + "symbol_address": 1072, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_P1_AI_00": { + "tag_name": "_IO_P1_AI_00", + "dim": 0, + "alias": true, + "instance_id": 25, + "symbol_address": 1074, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_P1_AI_01": { + "tag_name": "_IO_P1_AI_01", + "dim": 0, + "alias": true, + "instance_id": 26, + "symbol_address": 1076, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_P1_AI_02": { + "tag_name": "_IO_P1_AI_02", + "dim": 0, + "alias": true, + "instance_id": 27, + "symbol_address": 1078, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "_IO_P1_AI_03": { + "tag_name": "_IO_P1_AI_03", + "dim": 0, + "alias": true, + "instance_id": 28, + "symbol_address": 1080, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "Leak_1_Hi_Set": { + "tag_name": "Leak_1_Hi_Set", + "dim": 0, + "alias": true, + "instance_id": 29, + "symbol_address": 1124, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Hi_Reset": { + "tag_name": "Leak_1_Hi_Reset", + "dim": 0, + "alias": true, + "instance_id": 30, + "symbol_address": 1125, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Hi_Alarm": { + "tag_name": "Leak_1_Hi_Alarm", + "dim": 0, + "alias": true, + "instance_id": 31, + "symbol_address": 1126, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_2_Hi_Set": { + "tag_name": "Leak_2_Hi_Set", + "dim": 0, + "alias": true, + "instance_id": 32, + "symbol_address": 1127, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_2_Hi_Reset": { + "tag_name": "Leak_2_Hi_Reset", + "dim": 0, + "alias": true, + "instance_id": 33, + "symbol_address": 1128, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_2_Hi_Alarm": { + "tag_name": "Leak_2_Hi_Alarm", + "dim": 0, + "alias": true, + "instance_id": 34, + "symbol_address": 1129, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Lo_Set": { + "tag_name": "Leak_1_Lo_Set", + "dim": 0, + "alias": true, + "instance_id": 35, + "symbol_address": 1130, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Lo_Reset": { + "tag_name": "Leak_1_Lo_Reset", + "dim": 0, + "alias": true, + "instance_id": 36, + "symbol_address": 1131, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Lo_Alarm": { + "tag_name": "Leak_1_Lo_Alarm", + "dim": 0, + "alias": true, + "instance_id": 37, + "symbol_address": 1132, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_2_Lo_Set": { + "tag_name": "Leak_2_Lo_Set", + "dim": 0, + "alias": true, + "instance_id": 38, + "symbol_address": 1133, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_2_Lo_Reset": { + "tag_name": "Leak_2_Lo_Reset", + "dim": 0, + "alias": true, + "instance_id": 39, + "symbol_address": 1134, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_2_Lo_Alarm": { + "tag_name": "Leak_2_Lo_Alarm", + "dim": 0, + "alias": true, + "instance_id": 40, + "symbol_address": 1135, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Hi_Alarm_Enable": { + "tag_name": "Leak_1_Hi_Alarm_Enable", + "dim": 0, + "alias": true, + "instance_id": 41, + "symbol_address": 1136, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Hi_Alarm_Enabled": { + "tag_name": "Leak_1_Hi_Alarm_Enabled", + "dim": 0, + "alias": true, + "instance_id": 42, + "symbol_address": 1137, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_RUN_FAIL_ALARM": { + "tag_name": "P002_RUN_FAIL_ALARM", + "dim": 0, + "alias": true, + "instance_id": 43, + "symbol_address": 1138, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_OVERLOAD_ALARM": { + "tag_name": "P002_OVERLOAD_ALARM", + "dim": 0, + "alias": true, + "instance_id": 44, + "symbol_address": 1139, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_RUN_FAIL_ALARM": { + "tag_name": "P001_RUN_FAIL_ALARM", + "dim": 0, + "alias": true, + "instance_id": 45, + "symbol_address": 1140, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_OVERLOAD_ALARM": { + "tag_name": "P001_OVERLOAD_ALARM", + "dim": 0, + "alias": true, + "instance_id": 46, + "symbol_address": 1141, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_AUTO_FBK": { + "tag_name": "P001_AUTO_FBK", + "dim": 0, + "alias": true, + "instance_id": 47, + "symbol_address": 1142, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_HAND_FBK": { + "tag_name": "P001_HAND_FBK", + "dim": 0, + "alias": true, + "instance_id": 48, + "symbol_address": 1143, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_START_BTN_FBK": { + "tag_name": "P001_START_BTN_FBK", + "dim": 0, + "alias": true, + "instance_id": 49, + "symbol_address": 1144, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_OVERLOAD_FBK": { + "tag_name": "P001_OVERLOAD_FBK", + "dim": 0, + "alias": true, + "instance_id": 50, + "symbol_address": 1145, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_RUN_FBK": { + "tag_name": "P001_RUN_FBK", + "dim": 0, + "alias": true, + "instance_id": 51, + "symbol_address": 1146, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_AUTO_FBK": { + "tag_name": "P002_AUTO_FBK", + "dim": 0, + "alias": true, + "instance_id": 52, + "symbol_address": 1147, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_HAND_FBK": { + "tag_name": "P002_HAND_FBK", + "dim": 0, + "alias": true, + "instance_id": 53, + "symbol_address": 1148, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_START_BTN_FBK": { + "tag_name": "P002_START_BTN_FBK", + "dim": 0, + "alias": true, + "instance_id": 54, + "symbol_address": 1149, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_OVERLOAD_FBK": { + "tag_name": "P002_OVERLOAD_FBK", + "dim": 0, + "alias": true, + "instance_id": 55, + "symbol_address": 1150, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_RUN_FBK": { + "tag_name": "P002_RUN_FBK", + "dim": 0, + "alias": true, + "instance_id": 56, + "symbol_address": 1151, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P001_RUN_CMD": { + "tag_name": "P001_RUN_CMD", + "dim": 0, + "alias": true, + "instance_id": 57, + "symbol_address": 1152, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "P002_RUN_CMD": { + "tag_name": "P002_RUN_CMD", + "dim": 0, + "alias": true, + "instance_id": 58, + "symbol_address": 1153, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "RESET": { + "tag_name": "RESET", + "dim": 0, + "alias": true, + "instance_id": 59, + "symbol_address": 1154, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Leak_1_Lev": { + "tag_name": "Leak_1_Lev", + "dim": 0, + "alias": true, + "instance_id": 60, + "symbol_address": 1160, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_ScaledMin": { + "tag_name": "Leak_1_ScaledMin", + "dim": 0, + "alias": true, + "instance_id": 61, + "symbol_address": 1164, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_ScaledMax": { + "tag_name": "Leak_1_ScaledMax", + "dim": 0, + "alias": true, + "instance_id": 62, + "symbol_address": 1168, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Lev": { + "tag_name": "Leak_2_Lev", + "dim": 0, + "alias": true, + "instance_id": 63, + "symbol_address": 1172, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_ScaledMin": { + "tag_name": "Leak_2_ScaledMin", + "dim": 0, + "alias": true, + "instance_id": 64, + "symbol_address": 1176, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_ScaledMax": { + "tag_name": "Leak_2_ScaledMax", + "dim": 0, + "alias": true, + "instance_id": 65, + "symbol_address": 1180, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Hi_Setpoint": { + "tag_name": "Leak_1_Hi_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 66, + "symbol_address": 1184, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Hi_Clr_Setpoint": { + "tag_name": "Leak_1_Hi_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 67, + "symbol_address": 1188, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Hi_Setpoint": { + "tag_name": "Leak_2_Hi_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 68, + "symbol_address": 1192, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Hi_Clr_Setpoint": { + "tag_name": "Leak_2_Hi_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 69, + "symbol_address": 1196, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_CU_Ft": { + "tag_name": "Leak_1_CU_Ft", + "dim": 0, + "alias": true, + "instance_id": 70, + "symbol_address": 1200, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Cubic_Feet_To_Barrels": { + "tag_name": "Leak_1_Cubic_Feet_To_Barrels", + "dim": 0, + "alias": true, + "instance_id": 71, + "symbol_address": 1204, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Total_Barrels": { + "tag_name": "Leak_1_Total_Barrels", + "dim": 0, + "alias": true, + "instance_id": 72, + "symbol_address": 1208, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Lo_Setpoint": { + "tag_name": "Leak_1_Lo_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 73, + "symbol_address": 1212, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Lev_Temp": { + "tag_name": "Leak_1_Lev_Temp", + "dim": 0, + "alias": true, + "instance_id": 74, + "symbol_address": 1216, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Lo_Clr_Setpoint": { + "tag_name": "Leak_1_Lo_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 75, + "symbol_address": 1220, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Lo_Setpoint": { + "tag_name": "Leak_2_Lo_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 76, + "symbol_address": 1224, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Lo_Clr_Setpoint": { + "tag_name": "Leak_2_Lo_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 77, + "symbol_address": 1228, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Tot_Bbls_Temp": { + "tag_name": "Leak_1_Tot_Bbls_Temp", + "dim": 0, + "alias": true, + "instance_id": 78, + "symbol_address": 1232, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Lev_Temp": { + "tag_name": "Leak_2_Lev_Temp", + "dim": 0, + "alias": true, + "instance_id": 79, + "symbol_address": 1236, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_CU_Ft": { + "tag_name": "Leak_2_CU_Ft", + "dim": 0, + "alias": true, + "instance_id": 80, + "symbol_address": 1240, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Tot_Bbls_Temp": { + "tag_name": "Leak_2_Tot_Bbls_Temp", + "dim": 0, + "alias": true, + "instance_id": 81, + "symbol_address": 1244, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Cubic_Feet_To_Barrels": { + "tag_name": "Leak_2_Cubic_Feet_To_Barrels", + "dim": 0, + "alias": true, + "instance_id": 82, + "symbol_address": 1248, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Total_Barrels": { + "tag_name": "Leak_2_Total_Barrels", + "dim": 0, + "alias": true, + "instance_id": 83, + "symbol_address": 1252, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_0FT_Volume_Total": { + "tag_name": "Leak_1_0FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 84, + "symbol_address": 1256, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_1FT_Volume_Total": { + "tag_name": "Leak_1_1FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 85, + "symbol_address": 1260, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_2FT_Volume_Total": { + "tag_name": "Leak_1_2FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 86, + "symbol_address": 1264, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_3FT_Volume_Total": { + "tag_name": "Leak_1_3FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 87, + "symbol_address": 1268, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_4FT_Volume_Total": { + "tag_name": "Leak_1_4FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 88, + "symbol_address": 1272, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_5FT_Volume_Total": { + "tag_name": "Leak_1_5FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 89, + "symbol_address": 1276, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_6FT_Volume_Total": { + "tag_name": "Leak_1_6FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 90, + "symbol_address": 1280, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_7FT_Volume_Total": { + "tag_name": "Leak_1_7FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 91, + "symbol_address": 1284, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_8FT_Volume_Total": { + "tag_name": "Leak_1_8FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 92, + "symbol_address": 1288, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_9FT_Volume_Total": { + "tag_name": "Leak_1_9FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 93, + "symbol_address": 1292, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_10FT_Volume_Total": { + "tag_name": "Leak_1_10FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 94, + "symbol_address": 1296, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_11FT_Volume_Total": { + "tag_name": "Leak_1_11FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 95, + "symbol_address": 1300, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_12FT_Volume_Total": { + "tag_name": "Leak_1_12FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 96, + "symbol_address": 1304, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_13FT_Volume_Total": { + "tag_name": "Leak_1_13FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 97, + "symbol_address": 1308, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_14FT_Volume_Total": { + "tag_name": "Leak_1_14FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 98, + "symbol_address": 1312, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_16FT_Volume_Total": { + "tag_name": "Leak_1_16FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 99, + "symbol_address": 1316, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_15FT_Volume_Total": { + "tag_name": "Leak_1_15FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 100, + "symbol_address": 1320, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Stage_Total": { + "tag_name": "Leak_1_Stage_Total", + "dim": 0, + "alias": true, + "instance_id": 101, + "symbol_address": 1324, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Rise_Multiplier": { + "tag_name": "Leak_1_Rise_Multiplier", + "dim": 0, + "alias": true, + "instance_id": 102, + "symbol_address": 1328, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Rise_Multiplier": { + "tag_name": "Leak_2_Rise_Multiplier", + "dim": 0, + "alias": true, + "instance_id": 103, + "symbol_address": 1332, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_0FT_Volume_Total": { + "tag_name": "Leak_2_0FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 104, + "symbol_address": 1336, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_1FT_Volume_Total": { + "tag_name": "Leak_2_1FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 105, + "symbol_address": 1340, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_2FT_Volume_Total": { + "tag_name": "Leak_2_2FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 106, + "symbol_address": 1344, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_3FT_Volume_Total": { + "tag_name": "Leak_2_3FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 107, + "symbol_address": 1348, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_4FT_Volume_Total": { + "tag_name": "Leak_2_4FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 108, + "symbol_address": 1352, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_5FT_Volume_Total": { + "tag_name": "Leak_2_5FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 109, + "symbol_address": 1356, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_6FT_Volume_Total": { + "tag_name": "Leak_2_6FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 110, + "symbol_address": 1360, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_7FT_Volume_Total": { + "tag_name": "Leak_2_7FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 111, + "symbol_address": 1364, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_8FT_Volume_Total": { + "tag_name": "Leak_2_8FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 112, + "symbol_address": 1368, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_9FT_Volume_Total": { + "tag_name": "Leak_2_9FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 113, + "symbol_address": 1372, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_10FT_Volume_Total": { + "tag_name": "Leak_2_10FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 114, + "symbol_address": 1376, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_11FT_Volume_Total": { + "tag_name": "Leak_2_11FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 115, + "symbol_address": 1380, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_12FT_Volume_Total": { + "tag_name": "Leak_2_12FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 116, + "symbol_address": 1384, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_13FT_Volume_Total": { + "tag_name": "Leak_2_13FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 117, + "symbol_address": 1388, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_14FT_Volume_Total": { + "tag_name": "Leak_2_14FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 118, + "symbol_address": 1392, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_15FT_Volume_Total": { + "tag_name": "Leak_2_15FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 119, + "symbol_address": 1396, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_16FT_Volume_Total": { + "tag_name": "Leak_2_16FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 120, + "symbol_address": 1400, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Raw_Min": { + "tag_name": "Leak_1_Raw_Min", + "dim": 0, + "alias": true, + "instance_id": 121, + "symbol_address": 1404, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Raw_Max": { + "tag_name": "Leak_1_Raw_Max", + "dim": 0, + "alias": true, + "instance_id": 122, + "symbol_address": 1408, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Raw_Min": { + "tag_name": "Leak_2_Raw_Min", + "dim": 0, + "alias": true, + "instance_id": 123, + "symbol_address": 1412, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Raw_Max": { + "tag_name": "Leak_2_Raw_Max", + "dim": 0, + "alias": true, + "instance_id": 124, + "symbol_address": 1416, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Lev_Psi": { + "tag_name": "Leak_1_Lev_Psi", + "dim": 0, + "alias": true, + "instance_id": 125, + "symbol_address": 1420, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Lev_Psi": { + "tag_name": "Leak_2_Lev_Psi", + "dim": 0, + "alias": true, + "instance_id": 126, + "symbol_address": 1424, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Pump_On_Spt": { + "tag_name": "Leak_1_Pump_On_Spt", + "dim": 0, + "alias": true, + "instance_id": 127, + "symbol_address": 1428, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_1_Pump_Off_Spt": { + "tag_name": "Leak_1_Pump_Off_Spt", + "dim": 0, + "alias": true, + "instance_id": 128, + "symbol_address": 1432, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Pump_On_Spt": { + "tag_name": "Leak_2_Pump_On_Spt", + "dim": 0, + "alias": true, + "instance_id": 129, + "symbol_address": 1436, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Leak_2_Pump_Off_Spt": { + "tag_name": "Leak_2_Pump_Off_Spt", + "dim": 0, + "alias": true, + "instance_id": 130, + "symbol_address": 1440, + "symbol_object_address": 1077562108, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + } +} \ No newline at end of file diff --git a/Pub_Sub/fk_overflow_pump/thingsboard/alarm.csv b/Pub_Sub/fk_overflow_pump/thingsboard/alarm.csv new file mode 100644 index 0000000..4b0665c --- /dev/null +++ b/Pub_Sub/fk_overflow_pump/thingsboard/alarm.csv @@ -0,0 +1,6 @@ +AlarmName,ControllerName,MeasuringPointName,AlarmLevel,Condition1,Operand1,CombineMethod,Condition2,Operand2,AlarmContent,AlarmTag +air_comp_low_alm,plcpond,air_comp_low_alm,5,eq,1,none,eq,,Alarm Triggered,default +pond_1_hi_alm,overflow_pump,pond_1_hi_alm,5,eq,1,none,eq,,Pond 2 Lo,gateway +pond_1_lo_alm,overflow_pump,pond_1_lo_alm,5,eq,1,none,eq,,Pond 1 Lo,gateway +pump_1_run_fail_alm,overflow_pump,pump_1_run_fail_alm,5,eq,1,none,eq,,Alarm Triggered,gateway +pump_2_run_fail_alm,overflow_pump,pump_2_run_fail_alm,5,eq,1,none,eq,,Alarm Triggered,gateway \ No newline at end of file diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/alarm.csv b/Pub_Sub/fk_plcpond_gateway/thingsboard/alarm.csv new file mode 100644 index 0000000..8258183 --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/alarm.csv @@ -0,0 +1,14 @@ +AlarmName,ControllerName,MeasuringPointName,AlarmLevel,Condition1,Operand1,CombineMethod,Condition2,Operand2,AlarmContent,AlarmTag +air_comp_low_alm,plcpond,air_comp_low_alm,5,eq,1.0,none,eq,,Alarm Triggered,default +pond_1_hi_alm,overflow_pump,pond_1_hi_alm,5,eq,1.0,none,eq,,Pond 2 Lo,gateway +pond_1_lo_alm,overflow_pump,pond_1_lo_alm,5,eq,1.0,none,eq,,Pond 1 Lo,gateway +pump_1_run_fail_alm,overflow_pump,pump_1_run_fail_alm,5,eq,1.0,none,eq,,Alarm Triggered,gateway +pump_2_run_fail_alm,overflow_pump,pump_2_run_fail_alm,5,eq,1.0,none,eq,,Alarm Triggered,gateway +leak_1_hi_alm,leak_detection,leak_1_hi_alm,5,eq,1,none,eq,,Alarm Triggered,gateway +leak_1_lo_alm,leak_detection,leak_1_lo_alm,5,eq,1,none,eq,,Alarm Triggered,gateway +leak_2_hi_alm,leak_detection,leak_2_hi_alm,5,eq,1,none,eq,,Alarm Triggered,gateway +leak_2_lo_alm,leak_detection,leak_2_lo_alm,5,eq,1,none,eq,,Alarm Triggered,gateway +p001_overload_alm,leak_detection,p001_overload_alm,5,eq,1,none,eq,,Alarm Triggered,gateway +p001_run_fail_alm,leak_detection,p001_run_fail_alm,5,eq,1,none,eq,,Alarm Triggered,gateway +p002_overload_alm,leak_detection,p002_overload_alm,5,eq,1,none,eq,,Alarm Triggered,gateway +p002_run_fail_alm,leak_detection,p002_run_fail_alm,5,eq,1,none,eq,,Alarm Triggered,gateway \ No newline at end of file diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/fk_plcpond_tb_v5.cfg b/Pub_Sub/fk_plcpond_gateway/thingsboard/fk_plcpond_tb_v5.cfg new file mode 100644 index 0000000..d6e9605 --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/fk_plcpond_tb_v5.cfg @@ -0,0 +1,2733 @@ +{ + "controllers": [ + { + "enable": 1, + "protocol": "AllenBradley MicroCip", + "name": "plcpond", + "samplePeriod": 30, + "desc": "", + "expired": 10000, + "args": { + "slot": 0, + "connectTimeOut": 30000 + }, + "enableDebug": 0, + "enablePerOnchange": 0, + "endpoint": "192.168.1.12:44818" + }, + { + "enable": 1, + "protocol": "AllenBradley MicroCip", + "name": "overflow_pump", + "samplePeriod": 30, + "desc": "", + "expired": 10000, + "args": { + "slot": 0, + "connectTimeOut": 10000 + }, + "enableDebug": 0, + "enablePerOnchange": 0, + "endpoint": "192.168.1.20:44818" + }, + { + "enable": 1, + "protocol": "AllenBradley MicroCip", + "name": "leak_detection", + "samplePeriod": 10, + "desc": "", + "expired": 1000, + "args": { + "slot": 0, + "connectTimeOut": 10000 + }, + "enableDebug": 0, + "enablePerOnchange": 0, + "endpoint": "192.168.1.30:44818" + } + ], + "measures": [ + { + "name": "pond_1_level", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lev", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_total_bbls", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Total_Barrels", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_hi_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_1_Hi_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_1_hi_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Hi_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_hi_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Hi_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_lo_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_1_Lo_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_1_lo_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lo_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_lo_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lo_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_level", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lev", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_total_bbls", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Total_Barrels", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_hi_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_2_Hi_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_2_hi_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Hi_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_hi_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Hi_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "1.0", + "offset": "0.0", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_lo_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_2_Lo_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_2_lo_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lo_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_lo_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lo_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "air_comp_low_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "AL0_Air_Comp_Low", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "reverseBit": 0, + "bitMap": 0 + }, + { + "name": "air_comp_val", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Val_Air_Comp_Out", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "decimal": 2 + }, + { + "name": "air_comp_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "SPT_Low_Air_PSI", + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "decimal": 2 + }, + { + "name": "level_override_spt", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Level_Override ", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "1= runs regardless of level, 0= runs based on start/stop levels", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pond_1_hi_alm", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_1_Hi_Alarm", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pond_1_hi_clr_spt", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Hi_Clr_Setpoint", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pond_1_hi_spt", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Hi_Setpoint", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pond_1_level", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lev", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pond_1_lo_alm", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_1_Lo_Alarm", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pond_1_lo_clr_spt", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lo_Clr_Setpoint", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pond_1_lo_spt", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lo_Setpoint", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pond_1_total_bbls", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Total_Barrels", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pump_1_auto", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_AUTO_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": " HOA auto status", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pump_1_hand", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_HAND_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": " HOA hand status", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pump_1_local_start", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_START_BTN_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "Local start status", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pump_1_overload_status", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_OVERLOAD_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pump_1_run_fail_alm", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_RUN_FAIL_ALARM", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pump_1_run_status", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_RUN_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": " Pump running status", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pump_2_auto", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_AUTO_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": " HOA auto status", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pump_2_hand", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_HAND_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": " HOA hand status", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pump_2_local_start", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_START_BTN_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "Local start status", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pump_2_overload_status", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_OVERLOAD_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pump_2_run_fail_alm", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_RUN_FAIL_ALARM", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "pump_2_run_status", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_RUN_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": " Pump running status", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "run_level_perm", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Run_Level_Perm", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "start_level_spt", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Start_Level_spt ", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": " start level input", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "stop_level_spt", + "ctrlName": "overflow_pump", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Stop_Level_spt ", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": " stop level input", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_0ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_0FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_10ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_10FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_11ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_11FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_12ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_12FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_13ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_13FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_14ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_14FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_15ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_15FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_16ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_16FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_1ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_1FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_2ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_2FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_3ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_3FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_4ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_4FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_5ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_5FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_6ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_6FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_7ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_7FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_8ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_8FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_9ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_9FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_cu_ft", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_CU_Ft", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_cubic_feet_to_barrels", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Cubic_Feet_To_Barrels", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_hi_alm", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_1_Hi_Alarm", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_hi_alm_enable", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_1_Hi_Alarm_Enable", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_hi_alm_enabled", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_1_Hi_Alarm_Enabled", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_hi_clr_spt", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Hi_Clr_Setpoint", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_hi_reset", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_1_Hi_Reset", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_hi_set", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_1_Hi_Set", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_hi_spt", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Hi_Setpoint", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_level", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Lev", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_level_psi", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Lev_Psi", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_lo_alm", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_1_Lo_Alarm", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_lo_clr_spt", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Lo_Clr_Setpoint", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_lo_reset", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_1_Lo_Reset", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_lo_set", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_1_Lo_Set", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_lo_spt", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Lo_Setpoint", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_pump_off_spt", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Pump_Off_Spt", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_pump_on_spt", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Pump_On_Spt", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_raw_max", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Raw_Max", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_raw_min", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Raw_Min", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_rise_multiplier", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Rise_Multiplier", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_scaled_max", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_ScaledMax", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_scaled_min", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_ScaledMin", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_stage_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Stage_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_1_total_barrels", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_1_Total_Barrels", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_0ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_0FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_10ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_10FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_11ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_11FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_12ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_12FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_13ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_13FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_14ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_14FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_15ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_15FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_16ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_16FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_1ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_1FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_2ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_2FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_3ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_3FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_4ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_4FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_5ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_5FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_6ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_6FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_7ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_7FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_8ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_8FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_9ft_volume_total", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_9FT_Volume_Total", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_cu_ft", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_CU_Ft", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_cubic_feet_to_barrels", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Cubic_Feet_To_Barrels", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_hi_alm", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_2_Hi_Alarm", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_hi_clr_spt", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Hi_Clr_Setpoint", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_hi_reset", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_2_Hi_Reset", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_hi_set", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_2_Hi_Set", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_hi_spt", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Hi_Setpoint", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_level", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Lev", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_level_psi", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Lev_Psi", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_lo_alm", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_2_Lo_Alarm", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_lo_clr_spt", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Lo_Clr_Setpoint", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_lo_reset", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_2_Lo_Reset", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_lo_set", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Leak_2_Lo_Set", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_lo_spt", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Lo_Setpoint", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_pump_off_spt", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Pump_Off_Spt", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_pump_on_spt", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Pump_On_Spt", + "decimal": 2, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_raw_max", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Raw_Max", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_raw_min", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Raw_Min", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_rise_multiplier", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Rise_Multiplier", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_scaled_max", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_ScaledMax", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_scaled_min", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_ScaledMin", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "leak_2_total_barrels", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Leak_2_Total_Barrels", + "decimal": 2, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p001_auto", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_AUTO_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p001_hand", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_HAND_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p001_overload_alm", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_OVERLOAD_ALARM", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p001_overload", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_OVERLOAD_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p001_run_cmd", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_RUN_CMD", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p001_run_fail_alm", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_RUN_FAIL_ALARM", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p001_run", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_RUN_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p001_start", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P001_START_BTN_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p002_auto", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_AUTO_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p002_hand", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_HAND_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p002_overload_alm", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_OVERLOAD_ALARM", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p002_overload", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_OVERLOAD_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p002_run_cmd", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_RUN_CMD", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "rw", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p002_run_fail_alm", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_RUN_FAIL_ALARM", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p002_run", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_RUN_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "p002_start", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "P002_START_BTN_FBK", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + }, + { + "name": "reset", + "ctrlName": "leak_detection", + "group": "fastReport", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "RESET", + "bitMap": 0, + "reverseBit": 0, + "readWrite": "ro", + "unit": "", + "desc": "", + "storageLwTSDB": 1, + "transformType": 0 + } + ], + "alarmLables": [ + "default", + "gateway" + ], + "alarms": [ + { + "name": "air_comp_low_alm", + "ctrlName": "plcpond", + "measureName": "air_comp_low_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Alarm Triggered", + "alarmLable": "default" + }, + { + "name": "pond_1_hi_alm", + "ctrlName": "overflow_pump", + "measureName": "pond_1_hi_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Pond 2 Lo", + "alarmLable": "gateway" + }, + { + "name": "pond_1_lo_alm", + "ctrlName": "overflow_pump", + "measureName": "pond_1_lo_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Pond 1 Lo", + "alarmLable": "gateway" + }, + { + "name": "pump_1_run_fail_alm", + "ctrlName": "overflow_pump", + "measureName": "pump_1_run_fail_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Alarm Triggered", + "alarmLable": "gateway" + }, + { + "name": "pump_2_run_fail_alm", + "ctrlName": "overflow_pump", + "measureName": "pump_2_run_fail_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Alarm Triggered", + "alarmLable": "gateway" + }, + { + "name": "leak_1_hi_alm", + "ctrlName": "leak_detection", + "measureName": "leak_1_hi_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Alarm Triggered", + "alarmLable": "gateway" + }, + { + "name": "leak_1_lo_alm", + "ctrlName": "leak_detection", + "measureName": "leak_1_lo_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Alarm Triggered", + "alarmLable": "gateway" + }, + { + "name": "leak_2_hi_alm", + "ctrlName": "leak_detection", + "measureName": "leak_2_hi_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Alarm Triggered", + "alarmLable": "gateway" + }, + { + "name": "leak_2_lo_alm", + "ctrlName": "leak_detection", + "measureName": "leak_2_lo_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Alarm Triggered", + "alarmLable": "gateway" + }, + { + "name": "p001_overload_alm", + "ctrlName": "leak_detection", + "measureName": "p001_overload_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Alarm Triggered", + "alarmLable": "gateway" + }, + { + "name": "p001_run_fail_alm", + "ctrlName": "leak_detection", + "measureName": "p001_run_fail_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Alarm Triggered", + "alarmLable": "gateway" + }, + { + "name": "p002_overload_alm", + "ctrlName": "leak_detection", + "measureName": "p002_overload_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Alarm Triggered", + "alarmLable": "gateway" + }, + { + "name": "p002_run_fail_alm", + "ctrlName": "leak_detection", + "measureName": "p002_run_fail_alm", + "alarmLevel": 5, + "cond1": { + "op": "eq", + "value": "1.0" + }, + "condOp": "none", + "cond2": { + "op": "eq", + "value": "" + }, + "content": "Alarm Triggered", + "alarmLable": "gateway" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "reference": 16, + "LwTSDBSize": 1000, + "strategy": 1, + "historyDataPath": "/var/user/data/dbhome/device_supervisor/LwTSDB", + "enablePerOnchange": 1, + "onchangePeriod": 600 + }, + { + "historyDataPath": "/var/user/data/dbhome/device_supervisor/LwTSDB", + "name": "fastReport", + "uploadInterval": 60, + "enablePerOnchange": 0, + "LwTSDBSize": 1000, + "strategy": 1 + } + ], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "INFO", + "coms": [ + { + "name": "rs232", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + }, + { + "name": "rs485", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + } + ], + "cachePath": "/var/user/data/dbhome/device_supervisor/offlinedata", + "cacheSize": 10000, + "debugLogPath": "/var/user/data/dbhome/device_supervisor/debugLog", + "debugLogSize": 2000 + }, + "clouds": [ + { + "cacheSize": 10000, + "enable": 1, + "name": "default", + "type": "Standard MQTT", + "args": { + "host": "hp.henrypump.cloud", + "port": 1883, + "clientId": "faskens-bp-pond", + "auth": 1, + "tls": 0, + "cleanSession": 1, + "mqttVersion": "v3.1.1", + "keepalive": 600, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "faskensmqtt", + "passwd": "faskensmqtt@1903", + "authType": 1, + "willQos": 0, + "willRetain": 0, + "willTopic": "", + "willPayload": "", + "tlsAuth": "caSelfSigned" + }, + "uploadRules": [] + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "name": "sendData", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "qos": 1, + "groups": [ + "default" + ], + "funcName": "sendData", + "script": "import json\nimport os\nimport time\nfrom datetime import datetime as dt\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom quickfaas.global_dict import get as get_params\nfrom quickfaas.global_dict import _set_global_args\nfrom mobiuspi_lib.gps import GPS\n\n\ndef reboot():\n # basic = Basic()\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\n r = os.popen(\"kill -s SIGHUP `cat /var/run/python/supervisord.pid`\").read()\n logger.info(f\"REBOOT : {r}\")\n\n\ndef checkFileExist(filename):\n path = \"/var/user/files\"\n if not os.path.exists(path):\n logger.info(\"no folder making files folder in var/user\")\n os.makedirs(path)\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n if not os.path.exists(path + \"/\" + filename):\n logger.info(\"no creds file making creds file\")\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\n\ndef convertJSONtoDS(j):\n d = []\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n return d\n\n\ndef checkCredentialConfig():\n logger.info(\"CHECKING CONFIG\")\n cfgpath = \"/var/user/cfg/device_supervisor/device_supervisor.cfg\"\n credspath = \"/var/user/files/creds.json\"\n cfg = dict()\n with open(cfgpath, \"r\") as f:\n cfg = json.load(f)\n clouds = cfg.get(\"clouds\")\n logger.info(clouds)\n # if not configured then try to configure from stored values\n if clouds[0][\"args\"][\"clientId\"] == \"unknown\" or clouds[0][\"args\"][\"username\"] == \"unknown\" or not clouds[0][\"args\"][\"passwd\"] or clouds[0][\"args\"][\"passwd\"] == \"unknown\":\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n creds = json.load(c)\n if creds:\n logger.info(\"updating config with stored data\")\n clouds[0][\"args\"][\"clientId\"] = creds[\"clientId\"]\n clouds[0][\"args\"][\"username\"] = creds[\"userName\"]\n clouds[0][\"args\"][\"passwd\"] = creds[\"password\"]\n cfg[\"clouds\"] = clouds\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n reboot()\n else:\n # assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n logger.info(\"updating stored file with new data\")\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n creds = json.load(c)\n if creds:\n if creds[\"clientId\"] != clouds[0][\"args\"][\"clientId\"]:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n if creds[\"userName\"] != clouds[0][\"args\"][\"username\"]:\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n if creds[\"password\"] != clouds[0][\"args\"][\"passwd\"]:\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n else:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n with open(credspath, \"w\") as cw:\n json.dump(creds, cw)\n\n\ndef checkParameterConfig(cfg):\n logger.info(\"Checking Parameters!!!!\")\n paramspath = \"/var/user/files/params.json\"\n cfgparams = convertDStoJSON(cfg.get(\"labels\"))\n # check stored values\n checkFileExist(\"params.json\")\n with open(paramspath, \"r\") as f:\n logger.info(\"Opened param storage file\")\n params = json.load(f)\n if params:\n if cfgparams != params:\n # go through each param\n # if not \"unknown\" and cfg and params aren't the same take from cfg likely updated manually\n # if key in cfg but not in params copy to params\n logger.info(\"equalizing params between cfg and stored\")\n for key in cfgparams.keys():\n try:\n if cfgparams[key] != params[key] and cfgparams[key] != \"unknown\":\n params[key] = cfgparams[key]\n except:\n params[key] = cfgparams[key]\n cfg[\"labels\"] = convertJSONtoDS(params)\n _set_global_args(convertJSONtoDS(params))\n with open(paramspath, \"w\") as p:\n json.dump(params, p)\n else:\n with open(paramspath, \"w\") as p:\n logger.info(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n\n return cfg\n\n\ndef getGPS():\n # Create a gps instance\n gps = GPS()\n\n # Retrieve GPS information\n position_status = gps.get_position_status()\n logger.debug(\"position_status: \")\n logger.debug(position_status)\n latitude = position_status[\"latitude\"].split(\" \")\n longitude = position_status[\"longitude\"].split(\" \")\n lat_dec = int(latitude[0][:-1]) + (float(latitude[1][:-1])/60)\n lon_dec = int(longitude[0][:-1]) + (float(longitude[1][:-1])/60)\n if latitude[2] == \"S\":\n lat_dec = lat_dec * -1\n if longitude[2] == \"W\":\n lon_dec = lon_dec * -1\n # lat_dec = round(lat_dec, 7)\n # lon_dec = round(lon_dec, 7)\n logger.info(\"HERE IS THE GPS COORDS\")\n logger.info(f\"LATITUDE: {lat_dec}, LONGITUDE: {lon_dec}\")\n speedKnots = position_status[\"speed\"].split(\" \")\n speedMPH = float(speedKnots[0]) * 1.151\n return (f\"{lat_dec:.8f}\", f\"{lon_dec:.8f}\", f\"{speedMPH:.2f}\")\n\n\ndef chunk_payload(payload, chunk_size=20):\n if \"values\" in payload:\n # Original format: {\"ts\": ..., \"values\": {...}}\n chunked_values = list(payload[\"values\"].items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n \"ts\": payload[\"ts\"],\n \"values\": dict(chunked_values[i:i+chunk_size])\n }\n else:\n # New format: {\"key1\": \"value1\", \"key2\": \"value2\"}\n chunked_keys = list(payload.keys())\n for i in range(0, len(chunked_keys), chunk_size):\n yield {k: payload[k] for k in chunked_keys[i:i+chunk_size]}\n\n\ndef chunk_payload_devices(payload, chunk_size=20, is_attributes_payload=False):\n if is_attributes_payload:\n # For attributes payload, chunk the controllers\n controllers = list(payload.items())\n for i in range(0, len(controllers), chunk_size):\n yield dict(controllers[i:i + chunk_size])\n else:\n # For data payload, chunk the values within each controller\n for controller, data in payload.items():\n for entry in data:\n ts = entry['ts']\n values = entry['values']\n chunked_values = list(values.items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n controller: [{\n \"ts\": ts,\n \"values\": dict(chunked_values[i:i + chunk_size])\n }]\n }\n\n\ndef controlName(name):\n logger.debug(name)\n params = convertDStoJSON(get_params())\n logger.debug(params)\n nameMap = {\n \"overflow_pump\": f\"{params['overflow_pump']}\",\n \"leak_detection\": f\"{params['leak_detection']}\"\n }\n return nameMap.get(name, \"Gateway\")\n\n\ndef sendData(message):\n # logger.info(message)\n grouped_data = {}\n grouped_attributes = {}\n now = (round(dt.timestamp(dt.now())/600)*600)*1000\n payload = {\"ts\": now, \"values\": {}}\n attributes_payload = {}\n logger.debug(message)\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n ctrlName = controlName(measure[\"ctrlName\"])\n logger.debug(ctrlName)\n if ctrlName == \"Gateway\":\n # send to gateway with v1/devices/me/telemetry\n if measure[\"health\"] == 1:\n if \"_spt\" in measure[\"name\"]:\n attributes_payload[measure[\"name\"]] = measure[\"value\"]\n else:\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n else:\n name = measure['name']\n value = measure['value']\n health = measure['health']\n # Add controller for telemetry if it doesn't exist\n if ctrlName not in grouped_data:\n grouped_data[ctrlName] = {}\n # Add controller for attributes if it doesn't exist\n if ctrlName not in grouped_attributes:\n grouped_attributes[ctrlName] = {}\n grouped_attributes[ctrlName][\"latestReportTime\"] = now\n # Add data to temp payload if datapoint health is good\n if health:\n if \"_spt\" in name:\n grouped_attributes[ctrlName][name] = value\n else:\n grouped_data[ctrlName][name] = value\n except Exception as e:\n logger.error(e)\n\n # Transform the grouped data to desired structure\n payload_devices = {}\n #logger.info(grouped_data)\n for key, value in grouped_data.items():\n if value:\n payload_devices[key] = [{\"ts\": now, \"values\": value}]\n\n attributes_payload_devices = {}\n for key, value in grouped_attributes.items():\n if value:\n attributes_payload_devices[key] = value\n #logger.info(payload_devices)\n #logger.info(attributes_payload_devices)\n #logger.info(payload)\n #logger.info(attributes)\n # Send data belonging to Gateway\n for chunk in chunk_payload(payload=payload):\n publish(__topic__, json.dumps(chunk), __qos__)\n time.sleep(2)\n\n attributes_payload[\"latestReportTime\"] = (\n round(dt.timestamp(dt.now())/600)*600)*1000\n for chunk in chunk_payload(payload=attributes_payload):\n publish(\"v1/devices/me/attributes\", json.dumps(chunk), __qos__)\n time.sleep(2)\n\n # Send gateway devices data\n for chunk in chunk_payload_devices(payload=payload_devices):\n publish(\"v1/gateway/telemetry\", json.dumps(chunk), __qos__)\n time.sleep(2)\n\n for chunk in chunk_payload_devices(payload=attributes_payload_devices, is_attributes_payload=True):\n publish(\"v1/gateway/attributes\",\n json.dumps(attributes_payload_devices), __qos__)\n time.sleep(2)\n", + "cloudName": "default", + "msgType": 0 + }, + { + "qos": 2, + "funcName": "sendAlarm", + "script": "import json, time\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\n\n\ndef sendAlarm(message):\n logger.info(message)\n payload = {}\n payload[\"ts\"] = time.time()*1000\n payload[\"values\"] = {message[\"measureName\"]: message[\"value\"]}\n publish(__topic__, json.dumps(payload), __qos__,cloud_name=\"default\")", + "name": "sendAlarm", + "trigger": "warning_event", + "topic": "v1/devices/me/telemetry", + "cloudName": "default", + "alarms": [ + "default" + ], + "msgType": 0 + }, + { + "qos": 1, + "funcName": "sendData", + "script": "import json, os, time, shutil, math\nfrom datetime import datetime as dt\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom quickfaas.global_dict import get as get_params\nfrom quickfaas.global_dict import _set_global_args\nfrom mobiuspi_lib.gps import GPS\n\nclass RuntimeStats:\n def __init__(self):\n self.runs = {}\n self.currentRun = 0\n self.today = \"\"\n self.todayString = \"\"\n self.filePath = \"/var/user/files/runtimestats.json\"\n\n def __init__(self, filePath:str):\n self.runs = {}\n self.currentRun = 0\n self.today = \"\"\n self.todayString = \"\"\n self.filePath = filePath\n\n def manageTime(self):\n if self.todayString != dt.strftime(dt.today(), \"%Y-%m-%d\"):\n if self.runs[self.todayString][\"run_\" + str(self.currentRun)][\"start\"] and not self.runs[self.todayString][\"run_\" + str(self.currentRun)][\"end\"]:\n 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())\n self.addDay()\n self.today = dt.today()\n self.todayString = dt.strftime(self.today, \"%Y-%m-%d\")\n days = list(self.runs.keys())\n days.sort()\n while (dt.strptime(days[-1],\"%Y-%m-%d\") - dt.strptime(days[0], \"%Y-%m-%d\")).days > 40:\n self.removeDay(day=days[0])\n days = list(self.runs.keys())\n days.sort()\n\n def addHertzDataPoint(self, frequency):\n if frequency > 0:\n self.manageTime()\n try:\n self.runs[self.todayString][\"run_\" + str(self.currentRun)][\"frequencies\"].append(frequency)\n except:\n self.runs[self.todayString][\"run_\" + str(self.currentRun)][\"frequencies\"] = [frequency]\n\n def startRun(self):\n if self.checkRunning():\n self.endRun()\n self.runs[self.todayString][\"run_\" + str(self.currentRun)][\"start\"] = time.time()\n\n def endRun(self):\n self.runs[self.todayString][\"run_\" + str(self.currentRun)][\"end\"] = time.time()\n self.currentRun += 1\n self.runs[self.todayString][\"run_\" + str(self.currentRun)] = {\"start\":0, \"end\": 0, \"frequencies\":[]} \n\n def checkRunning(self):\n if self.runs[self.todayString][\"run_\" + str(self.currentRun)][\"start\"] and not self.runs[self.todayString][\"run_\" + str(self.currentRun)][\"end\"]:\n return True\n return False\n\n def addDay(self):\n self.today = dt.today()\n self.todayString = dt.strftime(self.today, \"%Y-%m-%d\")\n self.currentRun = 1\n self.runs[self.todayString] = {}\n self.runs[self.todayString][\"run_\" + str(self.currentRun)] = {\"start\":0, \"end\": 0, \"frequencies\":[]}\n\n def countRunsDay(self, day=None):\n if not day:\n day = self.todayString\n return len(self.runs[day].keys())\n\n def countRunsMultiDay(self, numDays=30):\n total_runs = 0\n for day in list(self.runs.keys()):\n total_runs += self.countRunsDay(day=day)\n return total_runs\n\n def calculateAverageHertzDay(self, day=None, returnArray=False):\n dayFrequencies = []\n if not day:\n day = self.todayString\n for run in list(self.runs[day].keys()):\n try:\n dayFrequencies += self.runs[day][run][\"frequencies\"]\n except Exception as e:\n logger.debug(\"{} missing frequency data for {}\".format(day,run))\n if returnArray:\n return dayFrequencies\n return round(math.fsum(dayFrequencies)/len(dayFrequencies),2)\n\n def calculateAverageHertzMultiDay(self, numDays=30):\n self.manageTime()\n frequencies = []\n for day in list(self.runs.keys()):\n if not day == self.todayString and (dt.strptime(self.todayString, \"%Y-%m-%d\") - dt.strptime(day, \"%Y-%m-%d\")).days <= numDays:\n try:\n frequencies += self.calculateAverageHertzDay(day=day, returnArray=True)\n except Exception as e:\n logger.debug(\"{} missing frequency data\".format(day))\n if len(frequencies):\n return round(math.fsum(frequencies)/len(frequencies), 2)\n return 0\n \n def calculateRunTimeDay(self, day=None, convertToHours=True):\n self.manageTime()\n total_time = 0\n if not day:\n day = self.todayString\n for run in list(self.runs.get(day,{}).keys()):\n if self.runs[day][run][\"end\"] == 0 and self.runs[day][run][\"start\"] != 0:\n total_time = time.time() - self.runs[day][run][\"start\"] + total_time\n else:\n total_time = self.runs[day][run][\"end\"] - self.runs[day][run][\"start\"] + total_time\n if convertToHours:\n return self.convertSecondstoHours(total_time)\n return total_time\n\n def calculateRunTimeMultiDay(self, numDays=30, convertToHours=True):\n total_time = 0\n for day in list(self.runs.keys()):\n if (dt.strptime(self.todayString, \"%Y-%m-%d\") - dt.strptime(day, \"%Y-%m-%d\")).days <= numDays:\n total_time += self.calculateRunTimeDay(day=day, convertToHours=False)\n if convertToHours:\n return self.convertSecondstoHours(total_time)\n return total_time\n \n def calculateRunPercentDay(self, day=None, precise=False):\n if not day:\n day = self.todayString\n if precise:\n return (self.calculateRunTimeDay(day=day)/24) * 100\n return round((self.calculateRunTimeDay(day=day)/24) * 100, 2)\n \n\n def calculateRunPercentMultiDay(self, numDays=30, precise=False):\n self.manageTime()\n if precise:\n return (self.calculateRunTimeMultiDay()/(24*numDays)) * 100\n return round((self.calculateRunTimeMultiDay()/(24*numDays)) * 100,2)\n\n def removeDay(self, day=None):\n if not day:\n raise Exception(\"Day can not be None\")\n logger.debug(\"removing day {}\".format(day))\n del self.runs[day]\n self.saveDataToFile(filePath=self.filePath)\n \n def convertSecondstoHours(self, seconds):\n return round(seconds / (60*60),2)\n\n def resetData(self):\n logger.debug(\"clearing database\")\n try:\n for day in list(self.runs.keys()):\n self.removeDay(day=day, filePath=self.filePath)\n except Exception as e:\n logger.error(e)\n return False\n self.runs = {}\n self.currentRun = 0\n self.today = \"\"\n self.todayString = \"\"\n self.manageTime()\n return True\n\n def loadDataFromFile(self):\n try:\n with open(self.filePath, \"r\") as f:\n temp = json.load(f)\n self.runs = temp[\"data\"]\n self.currentRun = temp[\"current_run\"]\n self.today = dt.strptime(temp[\"current_day\"], \"%Y-%m-%d\")\n self.todayString = temp[\"current_day\"]\n self.manageTime()\n except:\n logger.debug(\"Could not find file at {}\".format(self.filePath))\n logger.debug(\"creating file\")\n self.addDay()\n try:\n with open(self.filePath, \"w\") as f:\n d = {\n \"current_run\": self.currentRun,\n \"current_day\": self.todayString,\n \"data\": self.runs\n }\n json.dump(d, f, indent=4)\n except Exception as e:\n logger.error(e)\n\n def saveDataToFile(self):\n try:\n logger.debug(\"Saving Runs\")\n with open(self.filePath, \"w\") as f:\n d = {\n \"current_run\": self.currentRun,\n \"current_day\": self.todayString,\n \"data\": self.runs\n }\n json.dump(d, f, indent=4)\n except Exception as e:\n logger.error(e)\n\nrts1 = RuntimeStats(\"/var/user/files/runtimestats_p001.json\")\nrts1.loadDataFromFile()\nrts1.saveDataToFile()\n\nrts2 = RuntimeStats(\"/var/user/files/runtimestats_p002.json\")\nrts2.loadDataFromFile()\nrts2.saveDataToFile()\n\ndef reboot():\n # basic = Basic()\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\n r = os.popen(\"kill -s SIGHUP `cat /var/run/python/supervisord.pid`\").read()\n logger.info(f\"REBOOT : {r}\")\n\n\ndef checkFileExist(filename):\n path = \"/var/user/files\"\n if not os.path.exists(path):\n logger.info(\"no folder making files folder in var/user\")\n os.makedirs(path)\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n if not os.path.exists(path + \"/\" + filename):\n logger.info(\"no creds file making creds file\")\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\n\ndef convertJSONtoDS(j):\n d = []\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n return d\n\n\ndef checkCredentialConfig():\n logger.info(\"CHECKING CONFIG\")\n cfgpath = \"/var/user/cfg/device_supervisor/device_supervisor.cfg\"\n credspath = \"/var/user/files/creds.json\"\n cfg = dict()\n with open(cfgpath, \"r\") as f:\n cfg = json.load(f)\n clouds = cfg.get(\"clouds\")\n logger.info(clouds)\n # if not configured then try to configure from stored values\n if clouds[0][\"args\"][\"clientId\"] == \"unknown\" or clouds[0][\"args\"][\"username\"] == \"unknown\" or not clouds[0][\"args\"][\"passwd\"] or clouds[0][\"args\"][\"passwd\"] == \"unknown\":\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n creds = json.load(c)\n if creds:\n logger.info(\"updating config with stored data\")\n clouds[0][\"args\"][\"clientId\"] = creds[\"clientId\"]\n clouds[0][\"args\"][\"username\"] = creds[\"userName\"]\n clouds[0][\"args\"][\"passwd\"] = creds[\"password\"]\n cfg[\"clouds\"] = clouds\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n reboot()\n else:\n # assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n logger.info(\"updating stored file with new data\")\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n creds = json.load(c)\n if creds:\n if creds[\"clientId\"] != clouds[0][\"args\"][\"clientId\"]:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n if creds[\"userName\"] != clouds[0][\"args\"][\"username\"]:\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n if creds[\"password\"] != clouds[0][\"args\"][\"passwd\"]:\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n else:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n with open(credspath, \"w\") as cw:\n json.dump(creds, cw)\n\n\ndef checkParameterConfig(cfg):\n logger.info(\"Checking Parameters!!!!\")\n paramspath = \"/var/user/files/params.json\"\n cfgparams = convertDStoJSON(cfg.get(\"labels\"))\n # check stored values\n checkFileExist(\"params.json\")\n with open(paramspath, \"r\") as f:\n logger.info(\"Opened param storage file\")\n params = json.load(f)\n if params:\n if cfgparams != params:\n # go through each param\n # if not \"unknown\" and cfg and params aren't the same take from cfg likely updated manually\n # if key in cfg but not in params copy to params\n logger.info(\"equalizing params between cfg and stored\")\n for key in cfgparams.keys():\n try:\n if cfgparams[key] != params[key] and cfgparams[key] != \"unknown\":\n params[key] = cfgparams[key]\n except:\n params[key] = cfgparams[key]\n cfg[\"labels\"] = convertJSONtoDS(params)\n _set_global_args(convertJSONtoDS(params))\n with open(paramspath, \"w\") as p:\n json.dump(params, p)\n else:\n with open(paramspath, \"w\") as p:\n logger.info(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n\n return cfg\n\n\ndef getGPS():\n # Create a gps instance\n gps = GPS()\n\n # Retrieve GPS information\n position_status = gps.get_position_status()\n logger.debug(\"position_status: \")\n logger.debug(position_status)\n latitude = position_status[\"latitude\"].split(\" \")\n longitude = position_status[\"longitude\"].split(\" \")\n lat_dec = int(latitude[0][:-1]) + (float(latitude[1][:-1])/60)\n lon_dec = int(longitude[0][:-1]) + (float(longitude[1][:-1])/60)\n if latitude[2] == \"S\":\n lat_dec = lat_dec * -1\n if longitude[2] == \"W\":\n lon_dec = lon_dec * -1\n # lat_dec = round(lat_dec, 7)\n # lon_dec = round(lon_dec, 7)\n logger.info(\"HERE IS THE GPS COORDS\")\n logger.info(f\"LATITUDE: {lat_dec}, LONGITUDE: {lon_dec}\")\n speedKnots = position_status[\"speed\"].split(\" \")\n speedMPH = float(speedKnots[0]) * 1.151\n return (f\"{lat_dec:.8f}\", f\"{lon_dec:.8f}\", f\"{speedMPH:.2f}\")\n\n\ndef chunk_payload(payload, chunk_size=20):\n if \"values\" in payload:\n # Original format: {\"ts\": ..., \"values\": {...}}\n chunked_values = list(payload[\"values\"].items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n \"ts\": payload[\"ts\"],\n \"values\": dict(chunked_values[i:i+chunk_size])\n }\n else:\n # New format: {\"key1\": \"value1\", \"key2\": \"value2\"}\n chunked_keys = list(payload.keys())\n for i in range(0, len(chunked_keys), chunk_size):\n yield {k: payload[k] for k in chunked_keys[i:i+chunk_size]}\n\n\ndef chunk_payload_devices(payload, chunk_size=20, is_attributes_payload=False):\n if is_attributes_payload:\n # For attributes payload, chunk the controllers\n controllers = list(payload.items())\n for i in range(0, len(controllers), chunk_size):\n yield dict(controllers[i:i + chunk_size])\n else:\n # For data payload, chunk the values within each controller\n for controller, data in payload.items():\n for entry in data:\n ts = entry['ts']\n values = entry['values']\n chunked_values = list(values.items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n controller: [{\n \"ts\": ts,\n \"values\": dict(chunked_values[i:i + chunk_size])\n }]\n }\n\n\ndef controlName(name):\n logger.debug(name)\n params = convertDStoJSON(get_params())\n logger.debug(params)\n nameMap = {\n \"overflow_pump\": f\"{params['overflow_pump']}\",\n \"leak_detection\": f\"{params['leak_detection']}\"\n }\n return nameMap.get(name, \"Gateway\")\n\n\ndef sendData(message):\n # logger.info(message)\n rts1.loadDataFromFile()\n rts2.loadDataFromFile()\n grouped_data = {}\n grouped_attributes = {}\n now = (round(dt.timestamp(dt.now())/60)*60)*1000\n payload = {\"ts\": now, \"values\": {}}\n attributes_payload = {}\n logger.debug(message)\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n ctrlName = controlName(measure[\"ctrlName\"])\n logger.debug(ctrlName)\n if ctrlName == \"Gateway\":\n # send to gateway with v1/devices/me/telemetry\n if measure[\"health\"] == 1:\n if \"_spt\" in measure[\"name\"]:\n attributes_payload[measure[\"name\"]] = measure[\"value\"]\n else:\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n else:\n name = measure['name']\n value = measure['value']\n health = measure['health']\n # Add controller for telemetry if it doesn't exist\n if ctrlName not in grouped_data:\n grouped_data[ctrlName] = {}\n # Add controller for attributes if it doesn't exist\n if ctrlName not in grouped_attributes:\n grouped_attributes[ctrlName] = {}\n grouped_attributes[ctrlName][\"latestReportTime\"] = now\n # Add data to temp payload if datapoint health is good\n if health:\n if \"_spt\" in name:\n grouped_attributes[ctrlName][name] = value\n else:\n grouped_data[ctrlName][name] = value\n if name in [\"p001_run\"]:\n rts1.manageTime()\n if value == 1 and not rts1.runs[rts1.todayString][\"run_\" + str(rts1.currentRun)][\"start\"]:\n rts1.startRun()\n rts1.saveDataToFile()\n elif value == 0 and rts1.runs[rts1.todayString][\"run_\" + str(rts1.currentRun)][\"start\"] and not rts1.runs[rts1.todayString][\"run_\" + str(rts1.currentRun)][\"end\"]:\n rts1.endRun()\n rts1.saveDataToFile()\n grouped_data[ctrlName][name + \"_today_running_hours\"] = rts1.calculateRunTimeDay()\n grouped_data[ctrlName][name + \"_month_running_hours\"] = rts1.calculateRunTimeMultiDay(numDays=dt.today().day)\n if name in [\"p002_run\"]:\n rts2.manageTime()\n if value == 1 and not rts2.runs[rts2.todayString][\"run_\" + str(rts2.currentRun)][\"start\"]:\n rts2.startRun()\n rts2.saveDataToFile()\n elif value == 0 and rts2.runs[rts2.todayString][\"run_\" + str(rts2.currentRun)][\"start\"] and not rts2.runs[rts2.todayString][\"run_\" + str(rts2.currentRun)][\"end\"]:\n rts2.endRun()\n rts2.saveDataToFile()\n grouped_data[ctrlName][name + \"_today_running_hours\"] = rts2.calculateRunTimeDay()\n grouped_data[ctrlName][name + \"_month_running_hours\"] = rts2.calculateRunTimeMultiDay(numDays=dt.today().day)\n \n\n except Exception as e:\n logger.error(e)\n\n # Transform the grouped data to desired structure\n payload_devices = {}\n #logger.info(grouped_data)\n for key, value in grouped_data.items():\n if value:\n payload_devices[key] = [{\"ts\": now, \"values\": value}]\n\n attributes_payload_devices = {}\n for key, value in grouped_attributes.items():\n if value:\n attributes_payload_devices[key] = value\n #logger.info(payload_devices)\n #logger.info(attributes_payload_devices)\n #logger.info(payload)\n #logger.info(attributes)\n # Send data belonging to Gateway\n for chunk in chunk_payload(payload=payload):\n publish(__topic__, json.dumps(chunk), __qos__)\n time.sleep(2)\n\n attributes_payload[\"latestReportTime\"] = (\n round(dt.timestamp(dt.now())/60)*60)*1000\n for chunk in chunk_payload(payload=attributes_payload):\n publish(\"v1/devices/me/attributes\", json.dumps(chunk), __qos__)\n time.sleep(2)\n\n # Send gateway devices data\n for chunk in chunk_payload_devices(payload=payload_devices):\n publish(\"v1/gateway/telemetry\", json.dumps(chunk), __qos__)\n time.sleep(2)\n\n for chunk in chunk_payload_devices(payload=attributes_payload_devices, is_attributes_payload=True):\n publish(\"v1/gateway/attributes\",\n json.dumps(attributes_payload_devices), __qos__)\n time.sleep(2)\n", + "name": "sendDataFast", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "cloudName": "default", + "groups": [ + "fastReport" + ], + "msgType": 0 + }, + { + "qos": 1, + "funcName": "sendAlarmGateway", + "script": "# Enter your python code.\nimport json, time\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom quickfaas.global_dict import get as get_params\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j \n\ndef controlName(name):\n logger.debug(name)\n params = convertDStoJSON(get_params())\n logger.debug(params)\n nameMap = {\n \"overflow_pump\": f\"{params['overflow_pump']}\",\n \"leak_detection\": f\"{params['leak_detection']}\"\n }\n return nameMap.get(name, \"Gateway\")\n \ndef sendAlarmGateway(message, wizard_api):\n logger.info(message)\n for measure, data in message[\"values\"].items():\n ctrlName = controlName(data[\"ctrlName\"])\n payload = {ctrlName: [{\"ts\": message[\"timestamp\"]*1000, \"values\": {data[\"measureName\"]: data[\"value\"]}}]}\n publish(__topic__, json.dumps(payload), __qos__, cloud_name=\"default\")", + "name": "sendAlarmGateway", + "trigger": "warning_event", + "topic": "v1/gateway/telemetry", + "cloudName": "default", + "alarms": [ + "gateway" + ], + "msgType": 0 + } + ], + "downloadFuncs": [ + { + "name": "receiveAttributes", + "topic": "v1/devices/me/attributes", + "qos": 1, + "funcName": "receiveAttribute", + "payload_type": "Plaintext", + "script": "import json, time\nfrom datetime import datetime as dt\nfrom quickfaas.measure import recall, write\nfrom quickfaas.remotebus import publish\nfrom common.Logger import logger\nfrom quickfaas.global_dict import get as get_params\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\ndef chunk_payload(payload, chunk_size=20):\n if \"values\" in payload:\n # Original format: {\"ts\": ..., \"values\": {...}}\n chunked_values = list(payload[\"values\"].items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n \"ts\": payload[\"ts\"],\n \"values\": dict(chunked_values[i:i+chunk_size])\n }\n else:\n # New format: {\"key1\": \"value1\", \"key2\": \"value2\"}\n chunked_keys = list(payload.keys())\n for i in range(0, len(chunked_keys), chunk_size):\n yield {k: payload[k] for k in chunked_keys[i:i+chunk_size]}\n\ndef chunk_payload_gateway(payload, chunk_size=20, is_attributes_payload=False):\n if is_attributes_payload:\n # For attributes payload, chunk the controllers\n controllers = list(payload.items())\n for i in range(0, len(controllers), chunk_size):\n yield dict(controllers[i:i + chunk_size])\n else:\n # For data payload, chunk the values within each controller\n for controller, data in payload.items():\n for entry in data:\n ts = entry['ts']\n values = entry['values']\n chunked_values = list(values.items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n controller: [{\n \"ts\": ts,\n \"values\": dict(chunked_values[i:i + chunk_size])\n }]\n }\n\n\ndef controlName(name):\n logger.debug(name)\n params = convertDStoJSON(get_params())\n logger.debug(params)\n nameMap = {\n \"overflow_pump\": f\"{params['overflow_pump']}\"\n }\n return nameMap.get(name, \"Gateway\")\n\n\n# Filter payloads based on device_filter\ndef filter_payload(payload, device_filter):\n if not device_filter: # If filter is empty, include all devices\n return payload\n return {key: value for key, value in payload.items() if key in device_filter}\n\ndef sync(device_filter=[]):\n #get new values and send\n now = round(dt.timestamp(dt.now()))*1000\n topic = \"v1/gateway/telemetry\"\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.debug(data)\n logger.info(\"SYNCING\")\n grouped_data = {}\n grouped_attributes = {}\n payload = {\"ts\": now, \"values\":{}}\n attributes_payload = {}\n try:\n for controller in data:\n for measure in controller[\"measures\"]:\n ctrlName = controlName(measure[\"ctrlName\"])\n if ctrlName == \"Gateway\":\n #send to gateway with v1/devices/me/telemetry\n if measure[\"health\"] == 1:\n if \"_spt\" in measure[\"name\"]:\n attributes_payload[measure[\"name\"]] = measure[\"value\"]\n else:\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n else:\n name = \"_\".join(measure['name'].split(\"_\")[2:])\n value = measure['value']\n health = measure['health']\n #Add controller for telemetry if it doesn't exist\n if ctrlName not in grouped_data:\n grouped_data[ctrlName] = {}\n #Add controller for attributes if it doesn't exist\n if ctrlName not in grouped_attributes:\n grouped_attributes[ctrlName] = {}\n grouped_attributes[ctrlName][\"latestReportTime\"] = now\n #Add data to temp payload if datapoint health is good\n if health:\n if \"_spt\" in name:\n grouped_attributes[ctrlName][name] = value\n else:\n grouped_data[ctrlName][name] = value\n except Exception as e:\n logger.error(e)\n try:\n # Transform the grouped data to desired structure\n payload_gateway = {}\n\n for key, value in grouped_data.items():\n if value:\n payload_gateway[key] = [{\"ts\": now ,\"values\": value}]\n\n attributes_payload_gateway = {}\n for key, value in grouped_attributes.items():\n if value:\n attributes_payload_gateway[key] = value\n\n # Apply the filter\n filtered_payload_gateway = filter_payload(payload_gateway, device_filter)\n filtered_attributes_payload_gateway = filter_payload(attributes_payload_gateway, device_filter)\n\n #Send data belonging to Gateway\n for chunk in chunk_payload(payload=payload):\n publish(\"v1/devices/me/telemetry\", json.dumps(chunk), qos=1, cloud_name=\"default\")\n time.sleep(2)\n \n attributes_payload[\"latestReportTime\"] = (round(dt.timestamp(dt.now())/600)*600)*1000\n for chunk in chunk_payload(payload=attributes_payload):\n publish(\"v1/devices/me/attributes\", json.dumps(chunk), qos=1, cloud_name=\"default\")\n time.sleep(2)\n \n #Send gateway devices data\n for chunk in chunk_payload_gateway(payload=filtered_payload_gateway):\n publish(\"v1/gateway/telemetry\", json.dumps(chunk), qos=1, cloud_name=\"default\")\n time.sleep(2)\n \n for chunk in chunk_payload_gateway(payload=filtered_attributes_payload_gateway, is_attributes_payload=True):\n publish(\"v1/gateway/attributes\", json.dumps(chunk), qos=1, cloud_name=\"default\")\n time.sleep(2)\n \n except Exception as e:\n logger.error(e)\n\ndef writeplctag(value):\n #value in the form {\"measurement\": , \"value\": }\n try:\n #value = json.loads(value.replace(\"'\",'\"'))\n logger.info(value)\n #payload format: [{\"name\": \"advvfdipp\", \"measures\": [{\"name\": \"manualfrequencysetpoint\", \"value\": 49}]}]\n message = [{\"name\": \"plcpond\", \"measures\":[{\"name\":value[\"measurement\"], \"value\": value[\"value\"]}]}]\n resp = write(message) \n logger.info(\"RETURN FROM WRITE: {}\".format(resp))\n return True\n except Exception as e:\n logger.error(e)\n return False\n \ndef receiveAttribute(topic, payload):\n try:\n logger.debug(topic)\n logger.info(json.loads(payload))\n p = json.loads(payload)\n \n for key, value in p.items():\n try:\n result = writeplctag({\"measurement\": key, \"value\": value})\n logger.debug(result)\n except Exception as e:\n logger.error(e)\n #logger.debug(command)\n time.sleep(5)\n try:\n sync(p[\"device\"])\n except Exception as e:\n logger.error(f\"Could not sync: {e}\")\n \n except Exception as e:\n logger.debug(e)\n", + "msgType": 0, + "cloudName": "default", + "trigger": "command_event" + }, + { + "name": "receiveAttributeGateway", + "topic": "v1/gateway/attributes", + "qos": 1, + "funcName": "receiveAttribute", + "payload_type": "Plaintext", + "script": "import json, time\nfrom datetime import datetime as dt\nfrom quickfaas.measure import recall, write\nfrom quickfaas.remotebus import publish\nfrom common.Logger import logger\nfrom quickfaas.global_dict import get as get_params\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\ndef formatPLCPayload(device, key, value):\n params = convertDStoJSON(get_params())\n nameMap = {\n f\"{params['overflow_pump']}\": \"overflow_pump\",\n f\"{params['leak_detection']}\": \"leak_detection\"\n }\n measure = key\n device = nameMap.get(device, \"\")\n output = {\"measurement\": measure, \"value\": value, \"device\": device}\n return output\n\n\ndef chunk_payload(payload, chunk_size=20):\n if \"values\" in payload:\n # Original format: {\"ts\": ..., \"values\": {...}}\n chunked_values = list(payload[\"values\"].items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n \"ts\": payload[\"ts\"],\n \"values\": dict(chunked_values[i:i+chunk_size])\n }\n else:\n # New format: {\"key1\": \"value1\", \"key2\": \"value2\"}\n chunked_keys = list(payload.keys())\n for i in range(0, len(chunked_keys), chunk_size):\n yield {k: payload[k] for k in chunked_keys[i:i+chunk_size]}\n\ndef chunk_payload_gateway(payload, chunk_size=20, is_attributes_payload=False):\n if is_attributes_payload:\n # For attributes payload, chunk the controllers\n controllers = list(payload.items())\n for i in range(0, len(controllers), chunk_size):\n yield dict(controllers[i:i + chunk_size])\n else:\n # For data payload, chunk the values within each controller\n for controller, data in payload.items():\n for entry in data:\n ts = entry['ts']\n values = entry['values']\n chunked_values = list(values.items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n controller: [{\n \"ts\": ts,\n \"values\": dict(chunked_values[i:i + chunk_size])\n }]\n }\n\n\ndef controlName(name):\n logger.debug(name)\n params = convertDStoJSON(get_params())\n logger.debug(params)\n nameMap = {\n \"overflow_pump\": f\"{params['overflow_pump']}\",\n \"leak_detection\": f\"{params['leak_detection']}\"\n }\n return nameMap.get(name, \"Gateway\")\n\n# Filter payloads based on device_filter\ndef filter_payload(payload, device_filter):\n if not device_filter: # If filter is empty, include all devices\n return payload\n return {key: value for key, value in payload.items() if key in device_filter}\n\n\ndef sync(device_filter=[]):\n #get new values and send\n now = round(dt.timestamp(dt.now()))*1000\n topic = \"v1/gateway/telemetry\"\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.debug(data)\n logger.info(\"SYNCING\")\n grouped_data = {}\n grouped_attributes = {}\n payload = {\"ts\": now, \"values\":{}}\n attributes_payload = {}\n try:\n for controller in data:\n for measure in controller[\"measures\"]:\n ctrlName = controlName(measure[\"name\"])\n if ctrlName == \"Gateway\":\n #send to gateway with v1/devices/me/telemetry\n if measure[\"health\"] == 1:\n if \"_spt\" in measure[\"name\"]:\n attributes_payload[measure[\"name\"]] = measure[\"value\"]\n else:\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n else:\n name = \"_\".join(measure['name'].split(\"_\")[2:])\n value = measure['value']\n health = measure['health']\n #Add controller for telemetry if it doesn't exist\n if ctrlName not in grouped_data:\n grouped_data[ctrlName] = {}\n #Add controller for attributes if it doesn't exist\n if ctrlName not in grouped_attributes:\n grouped_attributes[ctrlName] = {}\n grouped_attributes[ctrlName][\"latestReportTime\"] = now\n #Add data to temp payload if datapoint health is good\n if health:\n if \"_spt\" in name:\n grouped_attributes[ctrlName][name] = value\n else:\n grouped_data[ctrlName][name] = value\n except Exception as e:\n logger.error(e)\n try:\n # Transform the grouped data to desired structure\n payload_gateway = {}\n\n for key, value in grouped_data.items():\n if value:\n payload_gateway[key] = [{\"ts\": now ,\"values\": value}]\n\n attributes_payload_gateway = {}\n for key, value in grouped_attributes.items():\n if value:\n attributes_payload_gateway[key] = value\n\n # Apply the filter\n filtered_payload_gateway = filter_payload(payload_gateway, device_filter)\n filtered_attributes_payload_gateway = filter_payload(attributes_payload_gateway, device_filter)\n\n #Send data belonging to Gateway\n for chunk in chunk_payload(payload=payload):\n publish(\"v1/devices/me/telemetry\", json.dumps(chunk), qos=1, cloud_name=\"default\")\n time.sleep(2)\n \n attributes_payload[\"latestReportTime\"] = (round(dt.timestamp(dt.now())/600)*600)*1000\n for chunk in chunk_payload(payload=attributes_payload):\n publish(\"v1/devices/me/attributes\", json.dumps(chunk), qos=1, cloud_name=\"default\")\n time.sleep(2)\n \n #Send gateway devices data\n for chunk in chunk_payload_gateway(payload=filtered_payload_gateway):\n publish(\"v1/gateway/telemetry\", json.dumps(chunk), qos=1, cloud_name=\"default\")\n time.sleep(2)\n \n for chunk in chunk_payload_gateway(payload=filtered_attributes_payload_gateway, is_attributes_payload=True):\n publish(\"v1/gateway/attributes\", json.dumps(chunk), qos=1, cloud_name=\"default\")\n time.sleep(2)\n \n except Exception as e:\n logger.error(e)\n\n\n\ndef writeplctag(value):\n #value in the form {\"measurement\": , \"value\": }\n try:\n logger.info(value)\n #payload format: [{\"name\": \"advvfdipp\", \"measures\": [{\"name\": \"manualfrequencysetpoint\", \"value\": 49}]}]\n message = [{\"name\": value[\"device\"], \"measures\": [{\"name\": value[\"measurement\"], \"value\": value[\"value\"]}]}]\n logger.info(message)\n resp = write(message) \n logger.debug(\"RETURN FROM WRITE: {}\".format(resp))\n return True\n except Exception as e:\n logger.error(e)\n return False\n\n\ndef receiveAttribute(topic, payload):\n try:\n logger.debug(topic)\n logger.info(json.loads(payload))\n p = json.loads(payload)\n device = p[\"device\"]\n for key, value in p[\"data\"].items():\n try:\n if key == 'pond_1_lo_spt': \n measure = formatPLCPayload(device, 'pond_1_lo_clr_spt', value + 0.5)\n result = writeplctag(measure)\n elif key == 'pond_2_lo_spt':\n measure = formatPLCPayload(device, 'pond_2_lo_clr_spt', value + 0.5)\n result = writeplctag(measure)\n measure = formatPLCPayload(device, key, value)\n result = writeplctag(measure)\n logger.debug(result)\n except Exception as e:\n logger.error(e)\n #logger.debug(command)\n time.sleep(5)\n try:\n sync(p[\"device\"])\n except Exception as e:\n logger.error(f\"Could not sync: {e}\")\n except Exception as e:\n logger.debug(e)\n \n", + "msgType": 0, + "cloudName": "default", + "trigger": "command_event" + }, + { + "name": "receiveGatewayCommand", + "topic": "v1/gateway/rpc", + "qos": 1, + "funcName": "receiveCommand", + "payload_type": "Plaintext", + "script": "import json, time\nfrom datetime import datetime as dt\nfrom quickfaas.measure import recall, write\nfrom quickfaas.remotebus import publish\nfrom common.Logger import logger\nfrom quickfaas.global_dict import get as get_params\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\n\ndef formatPLCPayload(device, key, value):\n params = convertDStoJSON(get_params())\n nameMap = {\n f\"{params['overflow_pump']}\": \"overflow_pump\"\n }\n measure = key\n device = nameMap.get(device, \"\")\n output = {\"measurement\": measure, \"value\": value, \"device\": device}\n return output\n\n\ndef chunk_payload(payload, chunk_size=20):\n if \"values\" in payload:\n # Original format: {\"ts\": ..., \"values\": {...}}\n chunked_values = list(payload[\"values\"].items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n \"ts\": payload[\"ts\"],\n \"values\": dict(chunked_values[i:i+chunk_size])\n }\n else:\n # New format: {\"key1\": \"value1\", \"key2\": \"value2\"}\n chunked_keys = list(payload.keys())\n for i in range(0, len(chunked_keys), chunk_size):\n yield {k: payload[k] for k in chunked_keys[i:i+chunk_size]}\n\ndef chunk_payload_gateway(payload, chunk_size=20, is_attributes_payload=False):\n if is_attributes_payload:\n # For attributes payload, chunk the controllers\n controllers = list(payload.items())\n for i in range(0, len(controllers), chunk_size):\n yield dict(controllers[i:i + chunk_size])\n else:\n # For data payload, chunk the values within each controller\n for controller, data in payload.items():\n for entry in data:\n ts = entry['ts']\n values = entry['values']\n chunked_values = list(values.items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n controller: [{\n \"ts\": ts,\n \"values\": dict(chunked_values[i:i + chunk_size])\n }]\n }\n\n\ndef controlName(name):\n logger.debug(name)\n params = convertDStoJSON(get_params())\n logger.debug(params)\n nameMap = {\n \"overflow_pump\": f\"{params['overflow_pump']}\"\n }\n return nameMap.get(name, \"Gateway\")\n\n# Filter payloads based on device_filter\ndef filter_payload(payload, device_filter):\n if not device_filter: # If filter is empty, include all devices\n return payload\n return {key: value for key, value in payload.items() if key in device_filter}\n\n\ndef sync(device_filter=[]):\n #get new values and send\n now = round(dt.timestamp(dt.now()))*1000\n topic = \"v1/gateway/telemetry\"\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.debug(data)\n logger.info(\"SYNCING\")\n grouped_data = {}\n grouped_attributes = {}\n payload = {\"ts\": now, \"values\":{}}\n attributes_payload = {}\n try:\n for controller in data:\n for measure in controller[\"measures\"]:\n ctrlName = controlName(measure[\"name\"])\n if ctrlName == \"Gateway\":\n #send to gateway with v1/devices/me/telemetry\n if measure[\"health\"] == 1:\n if \"_spt\" in measure[\"name\"]:\n attributes_payload[measure[\"name\"]] = measure[\"value\"]\n else:\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n else:\n name = \"_\".join(measure['name'].split(\"_\")[2:])\n value = measure['value']\n health = measure['health']\n #Add controller for telemetry if it doesn't exist\n if ctrlName not in grouped_data:\n grouped_data[ctrlName] = {}\n #Add controller for attributes if it doesn't exist\n if ctrlName not in grouped_attributes:\n grouped_attributes[ctrlName] = {}\n grouped_attributes[ctrlName][\"latestReportTime\"] = now\n #Add data to temp payload if datapoint health is good\n if health:\n if \"_spt\" in name:\n grouped_attributes[ctrlName][name] = value\n else:\n grouped_data[ctrlName][name] = value\n except Exception as e:\n logger.error(e)\n try:\n # Transform the grouped data to desired structure\n payload_gateway = {}\n\n for key, value in grouped_data.items():\n if value:\n payload_gateway[key] = [{\"ts\": now ,\"values\": value}]\n\n attributes_payload_gateway = {}\n for key, value in grouped_attributes.items():\n if value:\n attributes_payload_gateway[key] = value\n\n # Apply the filter\n filtered_payload_gateway = filter_payload(payload_gateway, device_filter)\n filtered_attributes_payload_gateway = filter_payload(attributes_payload_gateway, device_filter)\n\n #Send data belonging to Gateway\n for chunk in chunk_payload(payload=payload):\n publish(\"v1/devices/me/telemetry\", json.dumps(chunk), qos=1, cloud_name=\"default\")\n time.sleep(2)\n \n attributes_payload[\"latestReportTime\"] = (round(dt.timestamp(dt.now())/600)*600)*1000\n for chunk in chunk_payload(payload=attributes_payload):\n publish(\"v1/devices/me/attributes\", json.dumps(chunk), qos=1, cloud_name=\"default\")\n time.sleep(2)\n \n #Send gateway devices data\n for chunk in chunk_payload_gateway(payload=filtered_payload_gateway):\n publish(\"v1/gateway/telemetry\", json.dumps(chunk), qos=1, cloud_name=\"default\")\n time.sleep(2)\n \n for chunk in chunk_payload_gateway(payload=filtered_attributes_payload_gateway, is_attributes_payload=True):\n publish(\"v1/gateway/attributes\", json.dumps(chunk), qos=1, cloud_name=\"default\")\n time.sleep(2)\n \n except Exception as e:\n logger.error(e)\n\n\ndef writeplctag(value):\n # value in the form {\"measurement\": , \"value\": }\n try:\n logger.debug(value)\n # payload format: [{\"name\": \"advvfdipp\", \"measures\": [{\"name\": \"manualfrequencysetpoint\", \"value\": 49}]}]\n message = [{\"name\": value[\"device\"], \"measures\": [\n {\"name\": value[\"measurement\"], \"value\": value[\"value\"]}]}]\n resp = write(message)\n logger.debug(\"RETURN FROM WRITE: {}\".format(resp))\n return True\n except Exception as e:\n logger.error(e)\n return False\n\n\ndef receiveCommand(topic, payload):\n try:\n logger.debug(topic)\n logger.info(json.loads(payload))\n p = json.loads(payload)\n #logger.info(p)\n command = p[\"data\"][\"method\"]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n } \n if command == \"setPLCTag\":\n try:\n params = formatPLCPayload(p[\"device\"], p[\"data\"][\"params\"][\"measurement\"], p[\"data\"][\"params\"][\"value\"])\n #logger.info(params)\n result = commands[\"writeplctag\"](params)\n logger.debug(result)\n except Exception as e:\n logger.error(e)\n elif command == \"startWW\":\n try:\n params = formatPLCPayload({\"device\": p[\"device\"], \"data\": {\"params\": {\"measurement\": \"auto_cmd\", \"value\": 0}}})\n result = commands[\"writeplctag\"](params)\n time.sleep(1)\n params = formatPLCPayload({\"device\": p[\"device\"], \"data\": {\"params\": {\"measurement\": \"manual_run_cmd\", \"value\": 1}}})\n result = commands[\"writeplctag\"](params)\n except Exception as e:\n logger.error(f\"Error in startWW: {e}\")\n elif command == \"manualAutoSwitch\":\n try:\n if p[\"data\"][\"params\"][\"direction\"] == \"manualToAuto\":\n params = formatPLCPayload({\"device\": p[\"device\"], \"data\": {\"params\": {\"measurement\": \"manual_run_cmd\", \"value\": 0}}})\n result = commands[\"writeplctag\"](params)\n time.sleep(1)\n params = formatPLCPayload({\"device\": p[\"device\"], \"data\": {\"params\": {\"measurement\": \"auto_cmd\", \"value\": 1}}})\n result = commands[\"writeplctag\"](params)\n elif p[\"data\"][\"params\"][\"direction\"] == \"autoToManual\":\n params = formatPLCPayload({\"device\": p[\"device\"], \"data\": {\"params\": {\"measurement\": \"auto_cmd\", \"value\": 0}}})\n result = commands[\"writeplctag\"](params)\n else:\n logger.error(f'Invalid input in manualAutoSwitch: {p[\"data\"][\"params\"][\"direction\"]}')\n except Exception as e:\n logger.error(f\"Error in manualToAuto: {e}\")\n ackPayload = {\"device\": p[\"device\"], \"id\": p[\"data\"][\"id\"], \"data\": {\"success\": True}}\n ack(ackPayload)\n time.sleep(5)\n try:\n sync(p[\"device\"])\n except Exception as e:\n logger.error(f\"Could not sync: {e}\")\n except Exception as e:\n logger.error(e)\n \n\ndef ack(message):\n publish(\"v1/gateway/rpc\", json.dumps(message), 1, cloud_name=\"default\")\n", + "msgType": 0, + "cloudName": "default", + "trigger": "command_event" + } + ] + }, + "labels": [ + { + "key": "SN", + "value": "GF5022311031664" + }, + { + "key": "MAC", + "value": "00:18:05:28:4a:40" + }, + { + "key": "overflow_pump", + "value": "BP Overflow Pump" + }, + { + "key": "leak_detection", + "value": "BP Leak Detection" + } + ], + "modbusSlave": { + "enable": 0, + "protocol": "Modbus-TCP", + "port": 502, + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "maxConnection": 5, + "mapping_table": [] + }, + "modbusRTUSlave": { + "enable": 0, + "protocol": "Modbus-RTU", + "coms": "rs485", + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "mapping_table": [] + }, + "iec104Server": { + "enable": 0, + "cotSize": 2, + "port": 2404, + "serverList": [ + { + "asduAddr": 1 + } + ], + "kValue": 12, + "wValue": 8, + "t0": 30, + "t1": 15, + "t2": 10, + "t3": 20, + "maximumLink": 5, + "timeSet": 1, + "byteOrder": "abcd", + "mapping_table": [] + }, + "iec101Server": { + "enable": 0, + "coms": "rs485", + "mode": "UnBalance", + "linkLen": 2, + "linkAddr": 1, + "asduLen": 2, + "ioaLen": 3, + "cotLen": 2, + "serverList": [ + { + "asduAddr": 1 + } + ], + "linkTimeOut": 2000, + "timeSet": 1, + "idleTimeOut": 10000, + "byteOrder": "abcd", + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "iec104Client": { + "enable": 0, + "connectType": 2, + "serverAddr": "ipower.inhandcloud.cn", + "serverPort": 2404, + "communicationCode": "", + "protocol": 1, + "asduAddr": 1, + "tls": 0, + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "opcuaServer": { + "enable": 0, + "port": 4840, + "maximumLink": 5, + "securityMode": 0, + "identifierType": "String", + "certificate": "None", + "privateKey": "None", + "pubsub": 0, + "mapping_table": [] + }, + "sl651Slave": { + "enable": 0, + "centerAaddr": 1, + "remoteAddr": "", + "addrCode": "", + "password": "", + "platform_list": [], + "mapping_table": [] + }, + "hj212Client": { + "enable": 0, + "platform_list": [], + "block_list": [], + "mapping_table": [] + }, + "southMetadata": {}, + "bindMetadata": { + "version": "", + "timestamp": "" + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "templates": {}, + "version": "2.7.1" +} \ No newline at end of file diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/pub/sendAlarm.py b/Pub_Sub/fk_plcpond_gateway/thingsboard/pub/sendAlarm.py new file mode 100644 index 0000000..4a61817 --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/pub/sendAlarm.py @@ -0,0 +1,11 @@ +import json, time +from common.Logger import logger +from quickfaas.remotebus import publish + + +def sendAlarm(message): + logger.info(message) + payload = {} + payload["ts"] = time.time()*1000 + payload["values"] = {message["measureName"]: message["value"]} + publish(__topic__, json.dumps(payload), __qos__,cloud_name="default") \ No newline at end of file diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/pub/sendAlarmGateway.py b/Pub_Sub/fk_plcpond_gateway/thingsboard/pub/sendAlarmGateway.py new file mode 100644 index 0000000..b9b86ba --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/pub/sendAlarmGateway.py @@ -0,0 +1,28 @@ +# Enter your python code. +import json, time +from common.Logger import logger +from quickfaas.remotebus import publish +from quickfaas.global_dict import get as get_params + +def convertDStoJSON(ds): + j = dict() + for x in ds: + j[x["key"]] = x["value"] + return j + +def controlName(name): + logger.debug(name) + params = convertDStoJSON(get_params()) + logger.debug(params) + nameMap = { + "overflow_pump": f"{params['overflow_pump']}", + "leak_detection": f"{params['leak_detection']}" + } + return nameMap.get(name, "Gateway") + +def sendAlarmGateway(message, wizard_api): + logger.info(message) + for measure, data in message["values"].items(): + ctrlName = controlName(data["ctrlName"]) + payload = {ctrlName: [{"ts": message["timestamp"]*1000, "values": {data["measureName"]: data["value"]}}]} + publish(__topic__, json.dumps(payload), __qos__, cloud_name="default") \ No newline at end of file diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/pub/sendDataFast.py b/Pub_Sub/fk_plcpond_gateway/thingsboard/pub/sendDataFast.py new file mode 100644 index 0000000..4a13e36 --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/pub/sendDataFast.py @@ -0,0 +1,733 @@ +import json, os, time, shutil, math +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 +from mobiuspi_lib.gps import GPS + +class RuntimeStats: + def __init__(self): + self.runs = {} + self.currentRun = 0 + self.today = "" + self.todayString = "" + self.filePath = "/var/user/files/runtimestats.json" + + def __init__(self, filePath:str): + self.runs = {} + self.currentRun = 0 + self.today = "" + self.todayString = "" + self.filePath = filePath + + 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(filePath=self.filePath) + + 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, filePath=self.filePath) + 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): + try: + with open(self.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(self.filePath)) + logger.debug("creating file") + self.addDay() + try: + with open(self.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): + try: + logger.debug("Saving Runs") + with open(self.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) + +rts1 = RuntimeStats("/var/user/files/runtimestats_p001.json") +rts1.loadDataFromFile() +rts1.saveDataToFile() + +rts2 = RuntimeStats("/var/user/files/runtimestats_p002.json") +rts2.loadDataFromFile() +rts2.saveDataToFile() + +def reboot(): + # basic = Basic() + logger.info("!" * 10 + "REBOOTING DEVICE" + "!"*10) + r = os.popen("kill -s SIGHUP `cat /var/run/python/supervisord.pid`").read() + logger.info(f"REBOOT : {r}") + + +def checkFileExist(filename): + path = "/var/user/files" + if not os.path.exists(path): + logger.info("no folder making files folder in var/user") + os.makedirs(path) + with open(path + "/" + filename, "a") as f: + json.dump({}, f) + if not os.path.exists(path + "/" + filename): + logger.info("no creds file making creds file") + with open(path + "/" + filename, "a") as f: + json.dump({}, f) + + +def convertDStoJSON(ds): + j = dict() + for x in ds: + j[x["key"]] = x["value"] + return j + + +def convertJSONtoDS(j): + d = [] + for key in j.keys(): + d.append({"key": key, "value": j[key]}) + return d + + +def checkCredentialConfig(): + logger.info("CHECKING CONFIG") + cfgpath = "/var/user/cfg/device_supervisor/device_supervisor.cfg" + credspath = "/var/user/files/creds.json" + cfg = dict() + with open(cfgpath, "r") as f: + cfg = json.load(f) + clouds = cfg.get("clouds") + logger.info(clouds) + # if not configured then try to configure from stored values + if clouds[0]["args"]["clientId"] == "unknown" or clouds[0]["args"]["username"] == "unknown" or not clouds[0]["args"]["passwd"] or clouds[0]["args"]["passwd"] == "unknown": + checkFileExist("creds.json") + with open(credspath, "r") as c: + creds = json.load(c) + if creds: + logger.info("updating config with stored data") + clouds[0]["args"]["clientId"] = creds["clientId"] + clouds[0]["args"]["username"] = creds["userName"] + clouds[0]["args"]["passwd"] = creds["password"] + cfg["clouds"] = clouds + cfg = checkParameterConfig(cfg) + with open(cfgpath, "w", encoding='utf-8') as n: + json.dump(cfg, n, indent=1, ensure_ascii=False) + reboot() + else: + # assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data + checkFileExist("creds.json") + with open(credspath, "r") as c: + logger.info("updating stored file with new data") + cfg = checkParameterConfig(cfg) + with open(cfgpath, "w", encoding='utf-8') as n: + json.dump(cfg, n, indent=1, ensure_ascii=False) + creds = json.load(c) + if creds: + if creds["clientId"] != clouds[0]["args"]["clientId"]: + creds["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.info("Checking Parameters!!!!") + paramspath = "/var/user/files/params.json" + cfgparams = convertDStoJSON(cfg.get("labels")) + # check stored values + checkFileExist("params.json") + with open(paramspath, "r") as f: + logger.info("Opened param storage file") + params = json.load(f) + if params: + if cfgparams != params: + # go through each param + # if not "unknown" and cfg and params aren't the same take from cfg likely updated manually + # if key in cfg but not in params copy to params + logger.info("equalizing params between cfg and stored") + for key in cfgparams.keys(): + try: + if cfgparams[key] != params[key] and cfgparams[key] != "unknown": + 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.info("initializing param file with params in memory") + json.dump(convertDStoJSON(get_params()), p) + cfg["labels"] = get_params() + + return cfg + + +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 initialize_totalizers(): + return { + "day": 0, + "week": 0, + "month": 0, + "year": 0, + "lifetime": 0, + "dayHolding": 0, + "weekHolding": 0, + "monthHolding": 0, + "yearHolding": 0, + "rolloverCounter": 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 chunk_payload(payload, chunk_size=20): + if "values" in payload: + # Original format: {"ts": ..., "values": {...}} + 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]) + } + else: + # New format: {"key1": "value1", "key2": "value2"} + chunked_keys = list(payload.keys()) + for i in range(0, len(chunked_keys), chunk_size): + yield {k: payload[k] for k in chunked_keys[i:i+chunk_size]} + + +def chunk_payload_devices(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 controlName(name): + logger.debug(name) + params = convertDStoJSON(get_params()) + logger.debug(params) + nameMap = { + "overflow_pump": f"{params['overflow_pump']}", + "leak_detection": f"{params['leak_detection']}" + } + return nameMap.get(name, "Gateway") + + +def sendData(message): + # logger.info(message) + rts1.loadDataFromFile() + rts2.loadDataFromFile() + grouped_data = {} + grouped_attributes = {} + now = (round(dt.timestamp(dt.now())/60)*60)*1000 + payload = {"ts": now, "values": {}} + attributes_payload = {} + logger.debug(message) + resetPayloadLD = {} + totalizerHolding = {} + sendResetData = False + for measure in message["measures"]: + try: + logger.debug(measure) + ctrlName = controlName(measure["ctrlName"]) + logger.debug(ctrlName) + if ctrlName == "Gateway": + # send to gateway with v1/devices/me/telemetry + if measure["health"] == 1: + if "_spt" in measure["name"]: + attributes_payload[measure["name"]] = measure["value"] + else: + payload["values"][measure["name"]] = measure["value"] + else: + 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] = {} + grouped_attributes[ctrlName]["latestReportTime"] = now + # Add data to temp payload if datapoint health is good + if health: + if "_spt" in name: + grouped_attributes[ctrlName][name] = value + else: + grouped_data[ctrlName][name] = value + if name in ["p001_run"]: + rts1.manageTime() + if value == 1 and not rts1.runs[rts1.todayString]["run_" + str(rts1.currentRun)]["start"]: + rts1.startRun() + rts1.saveDataToFile() + elif value == 0 and rts1.runs[rts1.todayString]["run_" + str(rts1.currentRun)]["start"] and not rts1.runs[rts1.todayString]["run_" + str(rts1.currentRun)]["end"]: + rts1.endRun() + rts1.saveDataToFile() + grouped_data[ctrlName][name + "_today_running_hours"] = rts1.calculateRunTimeDay() + grouped_data[ctrlName][name + "_month_running_hours"] = rts1.calculateRunTimeMultiDay(numDays=dt.today().day) + if name in ["p002_run"]: + rts2.manageTime() + if value == 1 and not rts2.runs[rts2.todayString]["run_" + str(rts2.currentRun)]["start"]: + rts2.startRun() + rts2.saveDataToFile() + elif value == 0 and rts2.runs[rts2.todayString]["run_" + str(rts2.currentRun)]["start"] and not rts2.runs[rts2.todayString]["run_" + str(rts2.currentRun)]["end"]: + rts2.endRun() + rts2.saveDataToFile() + grouped_data[ctrlName][name + "_today_running_hours"] = rts2.calculateRunTimeDay() + grouped_data[ctrlName][name + "_month_running_hours"] = rts2.calculateRunTimeMultiDay(numDays=dt.today().day) + if name in ["fm_1_total"]: + if not totalizerHolding.get(ctrlName): + totalizerHolding[ctrlName] = {"fm_1":{"dayReset": False, "weekReset": False, "monthReset": False, "yearReset": False}} + if not totalizerHolding[ctrlName].get("fm_1"): + totalizerHolding[ctrlName]["fm_1"] = {"dayReset": False, "weekReset": False, "monthReset": False, "yearReset": False} + totalizerHolding[ctrlName]["fm_1"]["totalizer_1"] = value + if name in ["fm_2_total"]: + if not totalizerHolding.get(ctrlName): + totalizerHolding[ctrlName] = {"fm_2":{"dayReset": False, "weekReset": False, "monthReset": False, "yearReset": False}} + if not totalizerHolding[ctrlName].get("fm_2"): + totalizerHolding[ctrlName]["fm_2"] = {"dayReset": False, "weekReset": False, "monthReset": False, "yearReset": False} + totalizerHolding[ctrlName]["fm_2"]["totalizer_1"] = value + except Exception as e: + logger.error(e) + for controller, meters in totalizerHolding.items(): + resetPayloadLD[controller] = [{"ts": now + 1, "values": {}}] + for meter, values in meters.items(): + if meter == "fm_1": + file_path = "/var/user/files/totalizers_ld_fm_1.json" + elif meter == "fm_2": + file_path = "/var/user/files/totalizers_ld_fm_2.json" + else: + file_path = "/var/user/files/totalizers.json" + + grouped_data[controller][f"{meter}_year_total"], values["yearReset"] = totalizeYear(values["totalizer_1"],file_path=file_path) + grouped_data[controller][f"{meter}_month_total"], values["monthReset"] = totalizeMonth(values["totalizer_1"],file_path=file_path) + grouped_data[controller][f"{meter}_week_total"], values["weekReset"] = totalizeWeek(values["totalizer_1"],file_path=file_path) + grouped_data[controller][f"{meter}_today_total"], values["dayReset"] = totalizeDay(values["totalizer_1"],file_path=file_path) + + if values["dayReset"]: + resetPayloadLD[controller][0]["values"][f"{meter}_yesterday_total"] = grouped_data[controller][f"{meter}_today_total"] + resetPayloadLD[controller][0]["values"][f"{meter}_today_total"] = 0 + sendResetData = True + if values["weekReset"]: + resetPayloadLD[controller][0]["values"][f"{meter}_last_week_total"] = grouped_data[controller][f"{meter}_week_total"] + resetPayloadLD[controller][0]["values"][f"{meter}_week_total"] = 0 + sendResetData = True + if values["monthReset"]: + resetPayloadLD[controller][0]["values"][f"{meter}_last_month_total"] = grouped_data[controller][f"{meter}_month_total"] + resetPayloadLD[controller][0]["values"][f"{meter}_month_total"] = 0 + sendResetData = True + if values["yearReset"]: + resetPayloadLD[controller][0]["values"][f"{meter}_last_year_total"] = grouped_data[controller][f"{meter}_year_total"] + resetPayloadLD[controller][0]["values"][f"{meter}_year_total"] = 0 + sendResetData = True + + + + # Transform the grouped data to desired structure + payload_devices = {} + #logger.info(grouped_data) + for key, value in grouped_data.items(): + if value: + payload_devices[key] = [{"ts": now, "values": value}] + + mergedPayload = { + k: payload_devices.get(k, []) + [item for item in resetPayloadLD.get(k, []) if item.get('values')] + for k in set(payload_devices) | set(resetPayloadLD) + } + attributes_payload_devices = {} + for key, value in grouped_attributes.items(): + if value: + attributes_payload_devices[key] = value + #logger.info(payload_devices) + #logger.info(attributes_payload_devices) + #logger.info(payload) + #logger.info(attributes) + # Send data belonging to Gateway + for chunk in chunk_payload(payload=payload): + publish(__topic__, json.dumps(chunk), __qos__) + time.sleep(2) + + attributes_payload["latestReportTime"] = ( + round(dt.timestamp(dt.now())/60)*60)*1000 + for chunk in chunk_payload(payload=attributes_payload): + publish("v1/devices/me/attributes", json.dumps(chunk), __qos__) + time.sleep(2) + + # Send gateway devices data + for chunk in chunk_payload_devices(payload=mergedPayload): + publish("v1/gateway/telemetry", json.dumps(chunk), __qos__) + time.sleep(2) + + for chunk in chunk_payload_devices(payload=attributes_payload_devices, is_attributes_payload=True): + publish("v1/gateway/attributes", + json.dumps(attributes_payload_devices), __qos__) + time.sleep(2) + + +def totalizeDay(lifetime, max_retries=3, retry_delay=2, file_path="/var/user/files/totalizers.json"): + """ + 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(file_path=file_path) + 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, file_path=file_path) + 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, file_path="/var/user/files/totalizers.json"): + """ + 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(file_path=file_path) + 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, file_path=file_path) + 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, file_path="/var/user/files/totalizers.json"): + """ + 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(file_path=file_path) + 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, file_path=file_path) + 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, file_path="/var/user/files/totalizers.json"): + """ + 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(file_path=file_path) + 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, file_path=file_path) + 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) \ No newline at end of file diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveAttributeGateway.py b/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveAttributeGateway.py index 8952e8f..8d2f055 100644 --- a/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveAttributeGateway.py +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveAttributeGateway.py @@ -14,7 +14,8 @@ def convertDStoJSON(ds): def formatPLCPayload(device, key, value): params = convertDStoJSON(get_params()) nameMap = { - f"{params['overflow_pump']}": "overflow_pump" + f"{params['overflow_pump']}": "overflow_pump", + f"{params['leak_detection']}": "leak_detection" } measure = key device = nameMap.get(device, "") @@ -64,7 +65,8 @@ def controlName(name): params = convertDStoJSON(get_params()) logger.debug(params) nameMap = { - "overflow_pump": f"{params['overflow_pump']}" + "overflow_pump": f"{params['overflow_pump']}", + "leak_detection": f"{params['leak_detection']}" } return nameMap.get(name, "Gateway") @@ -163,9 +165,10 @@ def sync(device_filter=[]): def writeplctag(value): #value in the form {"measurement": , "value": } try: - logger.debug(value) + logger.info(value) #payload format: [{"name": "advvfdipp", "measures": [{"name": "manualfrequencysetpoint", "value": 49}]}] message = [{"name": value["device"], "measures": [{"name": value["measurement"], "value": value["value"]}]}] + logger.info(message) resp = write(message) logger.debug("RETURN FROM WRITE: {}".format(resp)) return True @@ -177,11 +180,17 @@ def writeplctag(value): def receiveAttribute(topic, payload): try: logger.debug(topic) - logger.debug(json.loads(payload)) + logger.info(json.loads(payload)) p = json.loads(payload) device = p["device"] for key, value in p["data"].items(): try: + if key == 'pond_1_lo_spt': + measure = formatPLCPayload(device, 'pond_1_lo_clr_spt', value + 0.5) + result = writeplctag(measure) + elif key == 'pond_2_lo_spt': + measure = formatPLCPayload(device, 'pond_2_lo_clr_spt', value + 0.5) + result = writeplctag(measure) measure = formatPLCPayload(device, key, value) result = writeplctag(measure) logger.debug(result) diff --git a/Pub_Sub/rr_facility/thingsboard/alarm_rrig2.csv b/Pub_Sub/rr_facility/thingsboard/alarm_rrig2.csv index f4d424e..7e635e8 100644 --- a/Pub_Sub/rr_facility/thingsboard/alarm_rrig2.csv +++ b/Pub_Sub/rr_facility/thingsboard/alarm_rrig2.csv @@ -1,12 +1,15 @@ AlarmName,ControllerName,MeasuringPointName,AlarmLevel,Condition1,Operand1,CombineMethod,Condition2,Operand2,AlarmContent,AlarmTag -tp_1_hi_a_winding_alm,rr_facility,tp_1_hi_a_winding_alm,5,eq,1,none,eq,,tp 1 hi a winding failure,default -tp_1_hi_b_winding_alm,rr_facility,tp_1_hi_b_winding_alm,5,eq,1,none,eq,,tp 1 hi b winding failure,default -tp_1_hi_c_winding_alm,rr_facility,tp_1_hi_c_winding_alm,5,eq,1,none,eq,,tp 1 hi c winding failure,default -tp_1_hi_discharge_alm,rr_facility,tp_1_hi_discharge_alm,5,eq,1,none,eq,,tp 1 hi discharge failure,default -tp_1_hi_inboard_temp_alm,rr_facility,tp_1_hi_inboard_temp_alm,5,eq,1,none,eq,,Failure,default -tp_1_hi_outboard_temp_alm,rr_facility,tp_1_hi_outboard_temp_alm,5,eq,1,none,eq,,Failure,default -tp_1_hi_vibration_alm,rr_facility,tp_1_hi_vibration_alm,5,eq,1,none,eq,,Failure,default -tp_1_lo_discharge_alm,rr_facility,tp_1_lo_discharge_alm,5,eq,1,none,eq,,Failure,default -tp_1_lo_oil_alm,rr_facility,tp_1_lo_oil_alm,5,eq,1,none,eq,,Failure,default -tp_1_lo_suction_alm,rr_facility,tp_1_lo_suction_alm,5,eq,1,none,eq,,Failure,default -tp_1_oil_cooler_failed_to_start_alm,rr_facility,tp_1_oil_cooler_failed_to_start_alm,5,eq,1,none,eq,,Failure,default \ No newline at end of file +tp_1_hi_a_winding_alm,rr_facility,tp_1_hi_a_winding_alm,5,eq,1.0,none,eq,,tp 1 hi a winding failure,default +tp_1_hi_b_winding_alm,rr_facility,tp_1_hi_b_winding_alm,5,eq,1.0,none,eq,,tp 1 hi b winding failure,default +tp_1_hi_c_winding_alm,rr_facility,tp_1_hi_c_winding_alm,5,eq,1.0,none,eq,,tp 1 hi c winding failure,default +tp_1_hi_discharge_alm,rr_facility,tp_1_hi_discharge_alm,5,eq,1.0,none,eq,,tp 1 hi discharge failure,default +tp_1_hi_inboard_temp_alm,rr_facility,tp_1_hi_inboard_temp_alm,5,eq,1.0,none,eq,,Failure,default +tp_1_hi_outboard_temp_alm,rr_facility,tp_1_hi_outboard_temp_alm,5,eq,1.0,none,eq,,Failure,default +tp_1_hi_vibration_alm,rr_facility,tp_1_hi_vibration_alm,5,eq,1.0,none,eq,,Failure,default +tp_1_lo_discharge_alm,rr_facility,tp_1_lo_discharge_alm,5,eq,1.0,none,eq,,Failure,default +tp_1_lo_oil_alm,rr_facility,tp_1_lo_oil_alm,5,eq,1.0,none,eq,,Failure,default +tp_1_lo_suction_alm,rr_facility,tp_1_lo_suction_alm,5,eq,1.0,none,eq,,Failure,default +tp_1_oil_cooler_failed_to_start_alm,rr_facility,tp_1_oil_cooler_failed_to_start_alm,5,eq,1.0,none,eq,,Failure,default +tp_1_pid_auto_cmd_auto,rr_facility,tp_1_pid_auto_cmd,5,eq,1,none,eq,,Moved to Auto,default +tp_1_pid_auto_cmd_manual,rr_facility,tp_1_pid_auto_cmd,1,eq,0,none,eq,,Moved to Manual,default +tp_1_vfd_faulted_alm,rr_facility,tp_1_vfd_faulted_alm,5,eq,1,none,eq,,Failure,default \ No newline at end of file