From a9c3f6e89151130d3eccb44cdd0e7a1b3c2dfeb4 Mon Sep 17 00:00:00 2001 From: Nico Melone Date: Tue, 20 May 2025 15:28:58 -0500 Subject: [PATCH] added overflow pump --- .../thingsboard/be-pond-transfer.csv | 26 + .../thingsboard/bn_tag_dump.json | 1908 ++++++++++++++ .../thingsboard/bp-compressor.cfg | 322 +++ .../thingsboard/fk_plcpond_tb_v3.cfg | 666 +++++ .../thingsboard/fk_plcpond_tb_v4.cfg | 666 +++++ .../thingsboard/overflow_measures.csv | 26 + .../thingsboard/overflow_tag_dump.json | 2348 +++++++++++++++++ .../thingsboard/pub/sendData.py | 272 ++ .../thingsboard/sub/receiveAttribute.py | 184 ++ .../sub/receiveAttributeGateway.py | 198 ++ .../thingsboard/sub/receiveCommand.py | 75 + .../thingsboard/sub/receiveCommandGateway.py | 244 ++ code snippets/getPLCData.ipynb | 6 +- 13 files changed, 6938 insertions(+), 3 deletions(-) create mode 100644 Pub_Sub/fk_plcpond_gateway/thingsboard/be-pond-transfer.csv create mode 100644 Pub_Sub/fk_plcpond_gateway/thingsboard/bn_tag_dump.json create mode 100644 Pub_Sub/fk_plcpond_gateway/thingsboard/bp-compressor.cfg create mode 100644 Pub_Sub/fk_plcpond_gateway/thingsboard/fk_plcpond_tb_v3.cfg create mode 100644 Pub_Sub/fk_plcpond_gateway/thingsboard/fk_plcpond_tb_v4.cfg create mode 100644 Pub_Sub/fk_plcpond_gateway/thingsboard/overflow_measures.csv create mode 100644 Pub_Sub/fk_plcpond_gateway/thingsboard/overflow_tag_dump.json create mode 100644 Pub_Sub/fk_plcpond_gateway/thingsboard/pub/sendData.py create mode 100644 Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveAttribute.py create mode 100644 Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveAttributeGateway.py create mode 100644 Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveCommand.py create mode 100644 Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveCommandGateway.py diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/be-pond-transfer.csv b/Pub_Sub/fk_plcpond_gateway/thingsboard/be-pond-transfer.csv new file mode 100644 index 0000000..1996f23 --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/be-pond-transfer.csv @@ -0,0 +1,26 @@ +MeasuringPointName,ControllerName,GroupName,UploadType,DeadZonePercent,DataType,ArrayIndex,EnableBit,BitIndex,reverseBit,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,Pt,Ct,Mapping_table,$,,, +alarm_enable_cmd,plcpond,default,periodic,,INT,,0,,,Alarm_Enable,,,rw,,,none,,,,,,,,,,,,,,,0 +auto,plcpond,default,periodic,,BIT,,,,0,Auto,,,rw,,,none,,,,,,,,,,,,,0,,0 +discharge_out,plcpond,default,periodic,,FLOAT,,,,,DisPSI_Out,2,,ro,,,none,,,,,,,,,,,,,,,0 +fit_rate,plcpond,default,periodic,,FLOAT,,,,,FIT_Rate,2,,ro,,,none,,,,,,,,,,,,,,,0 +hand,plcpond,default,periodic,,BIT,,,,0,Hand,,,ro,,,none,,,,,,,,,,,,,0,,0 +off,plcpond,default,periodic,,BIT,,,,0,OFF,,,ro,,,none,,,,,,,,,,,,,0,,0 +pond_1_hi_alm,plcpond,default,periodic,,BIT,,,,0,Pond_1_Hi_Alarm,,,ro,,,none,,,,,,,,,,,,,0,,0 +pond_1_hi_clr_spt,plcpond,default,periodic,,FLOAT,,,,,Pond_1_Hi_Clr_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,0 +pond_1_hi_spt,plcpond,default,periodic,,FLOAT,,,,,Pond_1_Hi_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,0 +pond_1_level,plcpond,default,periodic,,FLOAT,,,,,Pond_1_Lev,2,,ro,,,none,,,,,,,,,,,,,,,0 +pond_1_lo_alm,plcpond,default,periodic,,BIT,,,,0,Pond_1_Lo_Alarm,,,ro,,,none,,,,,,,,,,,,,0,,0 +pond_1_lo_clr_spt,plcpond,default,periodic,,FLOAT,,,,,Pond_1_Lo_Clr_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,0 +pond_1_lo_spt,plcpond,default,periodic,,FLOAT,,,,,Pond_1_Lo_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,0 +pond_1_total_bbls,plcpond,default,periodic,,FLOAT,,,,,Pond_1_Total_Barrels,2,,ro,,,none,,,,,,,,,,,,,,,0 +pond_2_hi_alm,plcpond,default,periodic,,BIT,,,,0,Pond_2_Hi_Alarm,,,ro,,,none,,,,,,,,,,,,,0,,0 +pond_2_hi_clr_spt,plcpond,default,periodic,,FLOAT,,,,,Pond_2_Hi_Clr_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,0 +pond_2_hi_spt,plcpond,default,periodic,,FLOAT,,,,,Pond_2_Hi_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,0 +pond_2_level,plcpond,default,periodic,,FLOAT,,,,,Pond_2_Lev,2,,ro,,,none,,,,,,,,,,,,,,,0 +pond_2_lo_alm,plcpond,default,periodic,,BIT,,,,0,Pond_2_Lo_Alarm,,,ro,,,none,,,,,,,,,,,,,0,,0 +pond_2_lo_clr_spt,plcpond,default,periodic,,FLOAT,,,,,Pond_2_Lo_Clr_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,0 +pond_2_lo_spt,plcpond,default,periodic,,FLOAT,,,,,Pond_2_Lo_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,0 +pond_2_total_bbls,plcpond,default,periodic,,FLOAT,,,,,Pond_2_Total_Barrels,2,,ro,,,none,,,,,,,,,,,,,,,0 +pump_permissive,plcpond,default,periodic,,BIT,,,,0,Pump_Permissive,,,ro,,,none,,,,,,,,,,,,,0,,0 +pump_status,plcpond,default,periodic,,BIT,,,,0,Pump_Status,,,ro,,,none,,,,,,,,,,,,,0,,0 +run_permissive,plcpond,default,periodic,,BIT,,,,0,Run_Perm,,,ro,,,none,,,,,,,,,,,,,0,,0 \ No newline at end of file diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/bn_tag_dump.json b/Pub_Sub/fk_plcpond_gateway/thingsboard/bn_tag_dump.json new file mode 100644 index 0000000..868480e --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/bn_tag_dump.json @@ -0,0 +1,1908 @@ +{ + "_IO_EM_DO_00": { + "tag_name": "_IO_EM_DO_00", + "dim": 0, + "alias": true, + "instance_id": 1, + "symbol_address": 1044, + "symbol_object_address": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "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": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "Pond_1_Hi_Set": { + "tag_name": "Pond_1_Hi_Set", + "dim": 0, + "alias": true, + "instance_id": 29, + "symbol_address": 1124, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Hi_Reset": { + "tag_name": "Pond_1_Hi_Reset", + "dim": 0, + "alias": true, + "instance_id": 30, + "symbol_address": 1125, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Hi_Alarm": { + "tag_name": "Pond_1_Hi_Alarm", + "dim": 0, + "alias": true, + "instance_id": 31, + "symbol_address": 1126, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_2_Hi_Set": { + "tag_name": "Pond_2_Hi_Set", + "dim": 0, + "alias": true, + "instance_id": 32, + "symbol_address": 1127, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_2_Hi_Reset": { + "tag_name": "Pond_2_Hi_Reset", + "dim": 0, + "alias": true, + "instance_id": 33, + "symbol_address": 1128, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_2_Hi_Alarm": { + "tag_name": "Pond_2_Hi_Alarm", + "dim": 0, + "alias": true, + "instance_id": 34, + "symbol_address": 1129, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Lo_Set": { + "tag_name": "Pond_1_Lo_Set", + "dim": 0, + "alias": true, + "instance_id": 35, + "symbol_address": 1130, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Lo_Reset": { + "tag_name": "Pond_1_Lo_Reset", + "dim": 0, + "alias": true, + "instance_id": 36, + "symbol_address": 1131, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Lo_Alarm": { + "tag_name": "Pond_1_Lo_Alarm", + "dim": 0, + "alias": true, + "instance_id": 37, + "symbol_address": 1132, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_2_Lo_Set": { + "tag_name": "Pond_2_Lo_Set", + "dim": 0, + "alias": true, + "instance_id": 38, + "symbol_address": 1133, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_2_Lo_Reset": { + "tag_name": "Pond_2_Lo_Reset", + "dim": 0, + "alias": true, + "instance_id": 39, + "symbol_address": 1134, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_2_Lo_Alarm": { + "tag_name": "Pond_2_Lo_Alarm", + "dim": 0, + "alias": true, + "instance_id": 40, + "symbol_address": 1135, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Hi_Alarm_Enable": { + "tag_name": "Pond_1_Hi_Alarm_Enable", + "dim": 0, + "alias": true, + "instance_id": 41, + "symbol_address": 1136, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Hi_Alarm_Enabled": { + "tag_name": "Pond_1_Hi_Alarm_Enabled", + "dim": 0, + "alias": true, + "instance_id": 42, + "symbol_address": 1137, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Save": { + "tag_name": "Save", + "dim": 0, + "alias": true, + "instance_id": 43, + "symbol_address": 1138, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Lev": { + "tag_name": "Pond_1_Lev", + "dim": 0, + "alias": true, + "instance_id": 44, + "symbol_address": 1144, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_ScaledMin": { + "tag_name": "Pond_1_ScaledMin", + "dim": 0, + "alias": true, + "instance_id": 45, + "symbol_address": 1148, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_ScaledMax": { + "tag_name": "Pond_1_ScaledMax", + "dim": 0, + "alias": true, + "instance_id": 46, + "symbol_address": 1152, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Lev": { + "tag_name": "Pond_2_Lev", + "dim": 0, + "alias": true, + "instance_id": 47, + "symbol_address": 1156, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_ScaledMin": { + "tag_name": "Pond_2_ScaledMin", + "dim": 0, + "alias": true, + "instance_id": 48, + "symbol_address": 1160, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_ScaledMax": { + "tag_name": "Pond_2_ScaledMax", + "dim": 0, + "alias": true, + "instance_id": 49, + "symbol_address": 1164, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Hi_Setpoint": { + "tag_name": "Pond_1_Hi_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 50, + "symbol_address": 1168, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Hi_Clr_Setpoint": { + "tag_name": "Pond_1_Hi_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 51, + "symbol_address": 1172, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Hi_Setpoint": { + "tag_name": "Pond_2_Hi_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 52, + "symbol_address": 1176, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Hi_Clr_Setpoint": { + "tag_name": "Pond_2_Hi_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 53, + "symbol_address": 1180, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_CU_Ft": { + "tag_name": "Pond_1_CU_Ft", + "dim": 0, + "alias": true, + "instance_id": 54, + "symbol_address": 1184, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Cubic_Feet_To_Barrels": { + "tag_name": "Pond_1_Cubic_Feet_To_Barrels", + "dim": 0, + "alias": true, + "instance_id": 55, + "symbol_address": 1188, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Total_Barrels": { + "tag_name": "Pond_1_Total_Barrels", + "dim": 0, + "alias": true, + "instance_id": 56, + "symbol_address": 1192, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Lo_Setpoint": { + "tag_name": "Pond_1_Lo_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 57, + "symbol_address": 1196, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Lev_Temp": { + "tag_name": "Pond_1_Lev_Temp", + "dim": 0, + "alias": true, + "instance_id": 58, + "symbol_address": 1200, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Lo_Clr_Setpoint": { + "tag_name": "Pond_1_Lo_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 59, + "symbol_address": 1204, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Lo_Setpoint": { + "tag_name": "Pond_2_Lo_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 60, + "symbol_address": 1208, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Lo_Clr_Setpoint": { + "tag_name": "Pond_2_Lo_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 61, + "symbol_address": 1212, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Tot_Bbls_Temp": { + "tag_name": "Pond_1_Tot_Bbls_Temp", + "dim": 0, + "alias": true, + "instance_id": 62, + "symbol_address": 1216, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Lev_Temp": { + "tag_name": "Pond_2_Lev_Temp", + "dim": 0, + "alias": true, + "instance_id": 63, + "symbol_address": 1220, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_CU_Ft": { + "tag_name": "Pond_2_CU_Ft", + "dim": 0, + "alias": true, + "instance_id": 64, + "symbol_address": 1224, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Tot_Bbls_Temp": { + "tag_name": "Pond_2_Tot_Bbls_Temp", + "dim": 0, + "alias": true, + "instance_id": 65, + "symbol_address": 1228, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Cubic_Feet_To_Barrels": { + "tag_name": "Pond_2_Cubic_Feet_To_Barrels", + "dim": 0, + "alias": true, + "instance_id": 66, + "symbol_address": 1232, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Total_Barrels": { + "tag_name": "Pond_2_Total_Barrels", + "dim": 0, + "alias": true, + "instance_id": 67, + "symbol_address": 1236, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_0FT_Volume_Total": { + "tag_name": "Pond_1_0FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 68, + "symbol_address": 1240, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_1FT_Volume_Total": { + "tag_name": "Pond_1_1FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 69, + "symbol_address": 1244, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_2FT_Volume_Total": { + "tag_name": "Pond_1_2FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 70, + "symbol_address": 1248, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_3FT_Volume_Total": { + "tag_name": "Pond_1_3FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 71, + "symbol_address": 1252, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_4FT_Volume_Total": { + "tag_name": "Pond_1_4FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 72, + "symbol_address": 1256, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_5FT_Volume_Total": { + "tag_name": "Pond_1_5FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 73, + "symbol_address": 1260, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_6FT_Volume_Total": { + "tag_name": "Pond_1_6FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 74, + "symbol_address": 1264, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_7FT_Volume_Total": { + "tag_name": "Pond_1_7FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 75, + "symbol_address": 1268, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_8FT_Volume_Total": { + "tag_name": "Pond_1_8FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 76, + "symbol_address": 1272, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_9FT_Volume_Total": { + "tag_name": "Pond_1_9FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 77, + "symbol_address": 1276, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_10FT_Volume_Total": { + "tag_name": "Pond_1_10FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 78, + "symbol_address": 1280, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_11FT_Volume_Total": { + "tag_name": "Pond_1_11FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 79, + "symbol_address": 1284, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_12FT_Volume_Total": { + "tag_name": "Pond_1_12FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 80, + "symbol_address": 1288, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_13FT_Volume_Total": { + "tag_name": "Pond_1_13FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 81, + "symbol_address": 1292, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_14FT_Volume_Total": { + "tag_name": "Pond_1_14FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 82, + "symbol_address": 1296, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_16FT_Volume_Total": { + "tag_name": "Pond_1_16FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 83, + "symbol_address": 1300, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_15FT_Volume_Total": { + "tag_name": "Pond_1_15FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 84, + "symbol_address": 1304, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Stage_Total": { + "tag_name": "Pond_1_Stage_Total", + "dim": 0, + "alias": true, + "instance_id": 85, + "symbol_address": 1308, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Rise_Multiplier": { + "tag_name": "Pond_1_Rise_Multiplier", + "dim": 0, + "alias": true, + "instance_id": 86, + "symbol_address": 1312, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Rise_Multiplier": { + "tag_name": "Pond_2_Rise_Multiplier", + "dim": 0, + "alias": true, + "instance_id": 87, + "symbol_address": 1316, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_0FT_Volume_Total": { + "tag_name": "Pond_2_0FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 88, + "symbol_address": 1320, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_1FT_Volume_Total": { + "tag_name": "Pond_2_1FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 89, + "symbol_address": 1324, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_2FT_Volume_Total": { + "tag_name": "Pond_2_2FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 90, + "symbol_address": 1328, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_3FT_Volume_Total": { + "tag_name": "Pond_2_3FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 91, + "symbol_address": 1332, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_4FT_Volume_Total": { + "tag_name": "Pond_2_4FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 92, + "symbol_address": 1336, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_5FT_Volume_Total": { + "tag_name": "Pond_2_5FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 93, + "symbol_address": 1340, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_6FT_Volume_Total": { + "tag_name": "Pond_2_6FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 94, + "symbol_address": 1344, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_7FT_Volume_Total": { + "tag_name": "Pond_2_7FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 95, + "symbol_address": 1348, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_8FT_Volume_Total": { + "tag_name": "Pond_2_8FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 96, + "symbol_address": 1352, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_9FT_Volume_Total": { + "tag_name": "Pond_2_9FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 97, + "symbol_address": 1356, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_10FT_Volume_Total": { + "tag_name": "Pond_2_10FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 98, + "symbol_address": 1360, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_11FT_Volume_Total": { + "tag_name": "Pond_2_11FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 99, + "symbol_address": 1364, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_12FT_Volume_Total": { + "tag_name": "Pond_2_12FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 100, + "symbol_address": 1368, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_13FT_Volume_Total": { + "tag_name": "Pond_2_13FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 101, + "symbol_address": 1372, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_14FT_Volume_Total": { + "tag_name": "Pond_2_14FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 102, + "symbol_address": 1376, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_15FT_Volume_Total": { + "tag_name": "Pond_2_15FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 103, + "symbol_address": 1380, + "symbol_object_address": 1077549416, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_16FT_Volume_Total": { + "tag_name": "Pond_2_16FT_Volume_Total", + "dim": 0, + "alias": true, + "instance_id": 104, + "symbol_address": 1384, + "symbol_object_address": 1077549416, + "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_plcpond_gateway/thingsboard/bp-compressor.cfg b/Pub_Sub/fk_plcpond_gateway/thingsboard/bp-compressor.cfg new file mode 100644 index 0000000..c352f5b --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/bp-compressor.cfg @@ -0,0 +1,322 @@ +{ + "controllers": [ + { + "enable": 1, + "protocol": "AllenBradley MicroCip", + "name": "plcpond", + "samplePeriod": 10, + "desc": "", + "expired": 1000, + "args": { + "slot": 0, + "connectTimeOut": 10000 + }, + "enableDebug": 0, + "enablePerOnchange": 0, + "endpoint": "192.168.1.12:44818" + } + ], + "measures": [ + { + "name": "air_comp_low_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "AL0_Air_Comp_Low", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "reverseBit": 0, + "bitMap": 0 + }, + { + "name": "air_comp_val", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Val_Air_Comp_Out", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "decimal": 2 + }, + { + "name": "air_comp_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "SPT_Low_Air_PSI", + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "decimal": 2 + } + ], + "alarmLables": [ + "default" + ], + "alarms": [ + { + "name": "air_comp_low_alm", + "ctrlName": "plcpond", + "alarmLevel": 5, + "content": "Alarm Triggered", + "alarmLable": "default", + "measureName": "air_comp_low_alm", + "cond1": { + "op": "eq", + "value": "1" + }, + "cond2": { + "op": "eq", + "value": "" + }, + "condOp": "none" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "reference": 16, + "LwTSDBSize": 1000, + "strategy": 1, + "historyDataPath": "/var/user/data/dbhome/device_supervisor/LwTSDB", + "enablePerOnchange": 0 + } + ], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "INFO", + "coms": [ + { + "name": "rs232", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + }, + { + "name": "rs485", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + } + ], + "cachePath": "/var/user/data/dbhome/device_supervisor/offlinedata", + "cacheSize": 10000, + "debugLogPath": "/var/user/data/dbhome/device_supervisor/debugLog", + "debugLogSize": 2000 + }, + "clouds": [ + { + "cacheSize": 10000, + "enable": 1, + "name": "default", + "type": "Standard MQTT", + "args": { + "host": "hp.henrypump.cloud", + "port": 1883, + "clientId": "faskens-bp-compressor", + "auth": 1, + "tls": 0, + "cleanSession": 0, + "mqttVersion": "v3.1.1", + "keepalive": 60, + "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": "# Enter your python code.\nimport json, os, 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\n\ndef reboot():\n #basic = Basic()\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\n r = os.popen(\"kill -s SIGHUP `cat /var/run/python/supervisord.pid`\").read()\n logger.info(f\"REBOOT : {r}\")\n\ndef checkFileExist(filename):\n path = \"/var/user/files\"\n if not os.path.exists(path):\n logger.info(\"no folder making files folder in var/user\")\n os.makedirs(path)\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n if not os.path.exists(path + \"/\" + filename):\n logger.info(\"no creds file making creds file\")\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\ndef convertJSONtoDS(j):\n d = []\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n return d\n\ndef checkCredentialConfig():\n logger.info(\"CHECKING CONFIG\")\n cfgpath = \"/var/user/cfg/device_supervisor/device_supervisor.cfg\"\n credspath = \"/var/user/files/creds.json\"\n cfg = dict()\n with open(cfgpath, \"r\") as f:\n cfg = json.load(f)\n clouds = cfg.get(\"clouds\")\n logger.info(clouds)\n #if not configured then try to configure from stored values\n if clouds[0][\"args\"][\"clientId\"] == \"unknown\" or clouds[0][\"args\"][\"username\"] == \"unknown\" or not clouds[0][\"args\"][\"passwd\"] or clouds[0][\"args\"][\"passwd\"] == \"unknown\":\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n creds = json.load(c)\n if creds:\n logger.info(\"updating config with stored data\")\n clouds[0][\"args\"][\"clientId\"] = creds[\"clientId\"]\n clouds[0][\"args\"][\"username\"] = creds[\"userName\"]\n clouds[0][\"args\"][\"passwd\"] = creds[\"password\"]\n cfg[\"clouds\"] = clouds\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n reboot()\n else:\n #assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n logger.info(\"updating stored file with new data\")\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n creds = json.load(c)\n if creds:\n if creds[\"clientId\"] != clouds[0][\"args\"][\"clientId\"]:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n if creds[\"userName\"] != clouds[0][\"args\"][\"username\"]:\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n if creds[\"password\"] != clouds[0][\"args\"][\"passwd\"]:\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n else:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n with open(credspath, \"w\") as cw:\n json.dump(creds,cw)\n\ndef checkParameterConfig(cfg):\n logger.info(\"Checking Parameters!!!!\")\n paramspath = \"/var/user/files/params.json\"\n cfgparams = convertDStoJSON(cfg.get(\"labels\"))\n #check stored values \n checkFileExist(\"params.json\")\n with open(paramspath, \"r\") as f:\n logger.info(\"Opened param storage file\")\n params = json.load(f)\n if params:\n if cfgparams != params:\n #go through each param\n #if not \"unknown\" and cfg and params aren't the same take from cfg likely updated manually\n #if key in cfg but not in params copy to params\n logger.info(\"equalizing params between cfg and stored\")\n for key in cfgparams.keys():\n try:\n if cfgparams[key] != params[key] and cfgparams[key] != \"unknown\":\n params[key] = cfgparams[key]\n except:\n params[key] = cfgparams[key]\n cfg[\"labels\"] = convertJSONtoDS(params)\n _set_global_args(convertJSONtoDS(params))\n with open(paramspath, \"w\") as p:\n json.dump(params, p)\n else:\n with open(paramspath, \"w\") as p:\n logger.info(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n \n return cfg\n\n# Helper function to split the payload into chunks\ndef chunk_payload(payload, chunk_size=20):\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\ndef sendData(message):\n payload = {}\n payload[\"ts\"] = (round(dt.timestamp(dt.now())/600)*600)*1000\n payload[\"values\"] = {}\n try:\n checkCredentialConfig()\n except Exception as e:\n logger.error(e)\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n except Exception as e:\n logger.error(e)\n for chunk in chunk_payload(payload=payload):\n publish(__topic__, json.dumps(chunk), __qos__)\n time.sleep(2)\n publish(\"v1/devices/me/attributes\", json.dumps({\"latestReportTime\": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__)", + "cloudName": "default", + "msgType": 0 + }, + { + "qos": 2, + "funcName": "sendAlarm", + "script": "import json, time\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\n\n\ndef sendAlarm(message):\n logger.info(message)\n payload = {}\n payload[\"ts\"] = time.time()*1000\n payload[\"values\"] = {message[\"measureName\"]: message[\"value\"]}\n publish(__topic__, json.dumps(payload), __qos__,cloud_name=\"default\")", + "name": "sendAlarm", + "trigger": "warning_event", + "topic": "v1/devices/me/telemetry", + "cloudName": "default", + "alarms": [ + "default" + ], + "msgType": 0 + } + ], + "downloadFuncs": [] + }, + "labels": [ + { + "key": "SN", + "value": "GF5022311031664" + }, + { + "key": "MAC", + "value": "00:18:05:28:4a:40" + } + ], + "modbusSlave": { + "enable": 0, + "protocol": "Modbus-TCP", + "port": 502, + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "maxConnection": 5, + "mapping_table": [] + }, + "modbusRTUSlave": { + "enable": 0, + "protocol": "Modbus-RTU", + "coms": "rs485", + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "mapping_table": [] + }, + "iec104Server": { + "enable": 0, + "cotSize": 2, + "port": 2404, + "serverList": [ + { + "asduAddr": 1 + } + ], + "kValue": 12, + "wValue": 8, + "t0": 30, + "t1": 15, + "t2": 10, + "t3": 20, + "maximumLink": 5, + "timeSet": 1, + "byteOrder": "abcd", + "mapping_table": [] + }, + "iec101Server": { + "enable": 0, + "coms": "rs485", + "mode": "UnBalance", + "linkLen": 2, + "linkAddr": 1, + "asduLen": 2, + "ioaLen": 3, + "cotLen": 2, + "serverList": [ + { + "asduAddr": 1 + } + ], + "linkTimeOut": 2000, + "timeSet": 1, + "idleTimeOut": 10000, + "byteOrder": "abcd", + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "iec104Client": { + "enable": 0, + "connectType": 2, + "serverAddr": "ipower.inhandcloud.cn", + "serverPort": 2404, + "communicationCode": "", + "protocol": 1, + "asduAddr": 1, + "tls": 0, + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "opcuaServer": { + "enable": 0, + "port": 4840, + "maximumLink": 5, + "securityMode": 0, + "identifierType": "String", + "certificate": "None", + "privateKey": "None", + "pubsub": 0, + "mapping_table": [] + }, + "sl651Slave": { + "enable": 0, + "centerAaddr": 1, + "remoteAddr": "", + "addrCode": "", + "password": "", + "platform_list": [], + "mapping_table": [] + }, + "hj212Client": { + "enable": 0, + "platform_list": [], + "block_list": [], + "mapping_table": [] + }, + "southMetadata": {}, + "bindMetadata": { + "version": "", + "timestamp": "" + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "templates": {}, + "version": "2.7.1" +} \ No newline at end of file diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/fk_plcpond_tb_v3.cfg b/Pub_Sub/fk_plcpond_gateway/thingsboard/fk_plcpond_tb_v3.cfg new file mode 100644 index 0000000..34baa55 --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/fk_plcpond_tb_v3.cfg @@ -0,0 +1,666 @@ +{ + "controllers": [ + { + "enable": 1, + "protocol": "AllenBradley MicroCip", + "name": "plcpond", + "samplePeriod": 10, + "desc": "", + "expired": 1000, + "args": { + "slot": 0, + "connectTimeOut": 10000 + }, + "enableDebug": 0, + "enablePerOnchange": 0, + "endpoint": "192.168.1.12:44818" + } + ], + "measures": [ + { + "name": "pond_1_level", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lev", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_total_bbls", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Total_Barrels", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_hi_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_1_Hi_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_1_hi_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Hi_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_hi_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Hi_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_lo_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_1_Lo_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_1_lo_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lo_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_lo_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lo_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_level", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lev", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_total_bbls", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Total_Barrels", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_hi_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_2_Hi_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_2_hi_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Hi_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_hi_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Hi_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "1.0", + "offset": "0.0", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_lo_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_2_Lo_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_2_lo_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lo_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_lo_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lo_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "air_comp_low_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "AL0_Air_Comp_Low", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "reverseBit": 0, + "bitMap": 0 + }, + { + "name": "air_comp_val", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Val_Air_Comp_Out", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "decimal": 2 + }, + { + "name": "air_comp_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "SPT_Low_Air_PSI", + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "decimal": 2 + } + ], + "alarmLables": [ + "default" + ], + "alarms": [ + { + "name": "air_comp_low_alm", + "ctrlName": "plcpond", + "alarmLevel": 5, + "content": "Alarm Triggered", + "alarmLable": "default", + "measureName": "air_comp_low_alm", + "cond1": { + "op": "eq", + "value": "1" + }, + "cond2": { + "op": "eq", + "value": "" + }, + "condOp": "none" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "reference": 16, + "LwTSDBSize": 1000, + "strategy": 1, + "historyDataPath": "/var/user/data/dbhome/device_supervisor/LwTSDB", + "enablePerOnchange": 0 + } + ], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "INFO", + "coms": [ + { + "name": "rs232", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + }, + { + "name": "rs485", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + } + ], + "cachePath": "/var/user/data/dbhome/device_supervisor/offlinedata", + "cacheSize": 10000, + "debugLogPath": "/var/user/data/dbhome/device_supervisor/debugLog", + "debugLogSize": 2000 + }, + "clouds": [ + { + "cacheSize": 10000, + "enable": 1, + "name": "default", + "type": "Standard MQTT", + "args": { + "host": "hp.henrypump.cloud", + "port": 1883, + "clientId": "unknown", + "auth": 1, + "tls": 0, + "cleanSession": 0, + "mqttVersion": "v3.1.1", + "keepalive": 60, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "unknown", + "passwd": "unknown", + "authType": 1, + "willQos": 0, + "willRetain": 0, + "willTopic": "", + "willPayload": "", + "tlsAuth": "caSelfSigned" + }, + "uploadRules": [] + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "name": "sendData", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "qos": 1, + "groups": [ + "default" + ], + "funcName": "sendData", + "script": "# Enter your python code.\nimport json, os\nfrom datetime import datetime as dt\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nfrom quickfaas.global_dict import get as get_params\nfrom quickfaas.global_dict import _set_global_args\n\ndef reboot():\n #basic = Basic()\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\n r = os.popen(\"kill -s SIGHUP `cat /var/run/python/supervisord.pid`\").read()\n logger.info(f\"REBOOT : {r}\")\n\ndef checkFileExist(filename):\n path = \"/var/user/files\"\n if not os.path.exists(path):\n logger.info(\"no folder making files folder in var/user\")\n os.makedirs(path)\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n if not os.path.exists(path + \"/\" + filename):\n logger.info(\"no creds file making creds file\")\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\ndef convertJSONtoDS(j):\n d = []\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n return d\n\ndef checkCredentialConfig():\n logger.info(\"CHECKING CONFIG\")\n cfgpath = \"/var/user/cfg/device_supervisor/device_supervisor.cfg\"\n credspath = \"/var/user/files/creds.json\"\n cfg = dict()\n with open(cfgpath, \"r\") as f:\n cfg = json.load(f)\n clouds = cfg.get(\"clouds\")\n logger.info(clouds)\n #if not configured then try to configure from stored values\n if clouds[0][\"args\"][\"clientId\"] == \"unknown\" or clouds[0][\"args\"][\"username\"] == \"unknown\" or not clouds[0][\"args\"][\"passwd\"] or clouds[0][\"args\"][\"passwd\"] == \"unknown\":\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n creds = json.load(c)\n if creds:\n logger.info(\"updating config with stored data\")\n clouds[0][\"args\"][\"clientId\"] = creds[\"clientId\"]\n clouds[0][\"args\"][\"username\"] = creds[\"userName\"]\n clouds[0][\"args\"][\"passwd\"] = creds[\"password\"]\n cfg[\"clouds\"] = clouds\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n reboot()\n else:\n #assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n logger.info(\"updating stored file with new data\")\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n creds = json.load(c)\n if creds:\n if creds[\"clientId\"] != clouds[0][\"args\"][\"clientId\"]:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n if creds[\"userName\"] != clouds[0][\"args\"][\"username\"]:\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n if creds[\"password\"] != clouds[0][\"args\"][\"passwd\"]:\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n else:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n with open(credspath, \"w\") as cw:\n json.dump(creds,cw)\n\ndef checkParameterConfig(cfg):\n logger.info(\"Checking Parameters!!!!\")\n paramspath = \"/var/user/files/params.json\"\n cfgparams = convertDStoJSON(cfg.get(\"labels\"))\n #check stored values \n checkFileExist(\"params.json\")\n with open(paramspath, \"r\") as f:\n logger.info(\"Opened param storage file\")\n params = json.load(f)\n if params:\n if cfgparams != params:\n #go through each param\n #if not \"unknown\" and cfg and params aren't the same take from cfg likely updated manually\n #if key in cfg but not in params copy to params\n logger.info(\"equalizing params between cfg and stored\")\n for key in cfgparams.keys():\n try:\n if cfgparams[key] != params[key] and cfgparams[key] != \"unknown\":\n params[key] = cfgparams[key]\n except:\n params[key] = cfgparams[key]\n cfg[\"labels\"] = convertJSONtoDS(params)\n _set_global_args(convertJSONtoDS(params))\n with open(paramspath, \"w\") as p:\n json.dump(params, p)\n else:\n with open(paramspath, \"w\") as p:\n logger.info(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n \n return cfg\n\n\n\n\ndef sendData(message):\n payload = {}\n payload[\"ts\"] = (round(dt.timestamp(dt.now())/600)*600)*1000\n payload[\"values\"] = {}\n try:\n checkCredentialConfig()\n except Exception as e:\n logger.error(e)\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n except Exception as e:\n logger.error(e)\n publish(__topic__, json.dumps(payload), __qos__, cloud_name=\"default\")", + "cloudName": "default", + "msgType": 0 + }, + { + "qos": 2, + "funcName": "sendAlarm", + "script": "import json, time\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\n\n\ndef sendAlarm(message):\n logger.info(message)\n payload = {}\n payload[\"ts\"] = time.time()*1000\n payload[\"values\"] = {message[\"measureName\"]: message[\"value\"]}\n publish(__topic__, json.dumps(payload), __qos__,cloud_name=\"default\")", + "name": "sendAlarm", + "trigger": "warning_event", + "topic": "v1/devices/me/telemetry", + "cloudName": "default", + "alarms": [ + "default" + ], + "msgType": 0 + } + ], + "downloadFuncs": [] + }, + "labels": [ + { + "key": "SN", + "value": "GF5022311031664" + }, + { + "key": "MAC", + "value": "00:18:05:28:4a:40" + } + ], + "modbusSlave": { + "enable": 0, + "protocol": "Modbus-TCP", + "port": 502, + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "maxConnection": 5, + "mapping_table": [] + }, + "modbusRTUSlave": { + "enable": 0, + "protocol": "Modbus-RTU", + "coms": "rs485", + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "mapping_table": [] + }, + "iec104Server": { + "enable": 0, + "cotSize": 2, + "port": 2404, + "serverList": [ + { + "asduAddr": 1 + } + ], + "kValue": 12, + "wValue": 8, + "t0": 30, + "t1": 15, + "t2": 10, + "t3": 20, + "maximumLink": 5, + "timeSet": 1, + "byteOrder": "abcd", + "mapping_table": [] + }, + "iec101Server": { + "enable": 0, + "coms": "rs485", + "mode": "UnBalance", + "linkLen": 2, + "linkAddr": 1, + "asduLen": 2, + "ioaLen": 3, + "cotLen": 2, + "serverList": [ + { + "asduAddr": 1 + } + ], + "linkTimeOut": 2000, + "timeSet": 1, + "idleTimeOut": 10000, + "byteOrder": "abcd", + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "iec104Client": { + "enable": 0, + "connectType": 2, + "serverAddr": "ipower.inhandcloud.cn", + "serverPort": 2404, + "communicationCode": "", + "protocol": 1, + "asduAddr": 1, + "tls": 0, + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "opcuaServer": { + "enable": 0, + "port": 4840, + "maximumLink": 5, + "securityMode": 0, + "identifierType": "String", + "certificate": "None", + "privateKey": "None", + "pubsub": 0, + "mapping_table": [] + }, + "sl651Slave": { + "enable": 0, + "centerAaddr": 1, + "remoteAddr": "", + "addrCode": "", + "password": "", + "platform_list": [], + "mapping_table": [] + }, + "hj212Client": { + "enable": 0, + "platform_list": [], + "block_list": [], + "mapping_table": [] + }, + "southMetadata": {}, + "bindMetadata": { + "version": "", + "timestamp": "" + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "templates": {}, + "version": "2.7.1" +} \ No newline at end of file diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/fk_plcpond_tb_v4.cfg b/Pub_Sub/fk_plcpond_gateway/thingsboard/fk_plcpond_tb_v4.cfg new file mode 100644 index 0000000..3ebac26 --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/fk_plcpond_tb_v4.cfg @@ -0,0 +1,666 @@ +{ + "controllers": [ + { + "enable": 1, + "protocol": "AllenBradley MicroCip", + "name": "plcpond", + "samplePeriod": 10, + "desc": "", + "expired": 1000, + "args": { + "slot": 0, + "connectTimeOut": 10000 + }, + "enableDebug": 0, + "enablePerOnchange": 0, + "endpoint": "192.168.1.12:44818" + } + ], + "measures": [ + { + "name": "pond_1_level", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lev", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_total_bbls", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Total_Barrels", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_hi_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_1_Hi_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_1_hi_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Hi_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_hi_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Hi_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_lo_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_1_Lo_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_1_lo_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lo_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_1_lo_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_1_Lo_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_level", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lev", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_total_bbls", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Total_Barrels", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_hi_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_2_Hi_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_2_hi_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Hi_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_hi_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Hi_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "1.0", + "offset": "0.0", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_lo_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "Pond_2_Lo_Alarm", + "decimal": 2, + "len": 1, + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "bitMap": 0, + "reverseBit": 0, + "storageLwTSDB": 0 + }, + { + "name": "pond_2_lo_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lo_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "pond_2_lo_clr_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Pond_2_Lo_Clr_Setpoint", + "decimal": 2, + "len": 1, + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "maxValue": "", + "minValue": "", + "maxScaleValue": "", + "minScaleValue": "", + "gain": "", + "offset": "", + "storageLwTSDB": 0 + }, + { + "name": "air_comp_low_alm", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "BIT", + "addr": "AL0_Air_Comp_Low", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "reverseBit": 0, + "bitMap": 0 + }, + { + "name": "air_comp_val", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "Val_Air_Comp_Out", + "readWrite": "ro", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "decimal": 2 + }, + { + "name": "air_comp_spt", + "ctrlName": "plcpond", + "group": "default", + "uploadType": "periodic", + "dataType": "FLOAT", + "addr": "SPT_Low_Air_PSI", + "readWrite": "rw", + "unit": "", + "desc": "", + "transformType": 0, + "storageLwTSDB": 0, + "decimal": 2 + } + ], + "alarmLables": [ + "default" + ], + "alarms": [ + { + "name": "air_comp_low_alm", + "ctrlName": "plcpond", + "alarmLevel": 5, + "content": "Alarm Triggered", + "alarmLable": "default", + "measureName": "air_comp_low_alm", + "cond1": { + "op": "eq", + "value": "1" + }, + "cond2": { + "op": "eq", + "value": "" + }, + "condOp": "none" + } + ], + "groups": [ + { + "name": "default", + "uploadInterval": 600, + "reference": 16, + "LwTSDBSize": 1000, + "strategy": 1, + "historyDataPath": "/var/user/data/dbhome/device_supervisor/LwTSDB", + "enablePerOnchange": 0 + } + ], + "misc": { + "maxAlarmRecordSz": 2000, + "logLvl": "INFO", + "coms": [ + { + "name": "rs232", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + }, + { + "name": "rs485", + "baud": 9600, + "bits": 8, + "stopbits": 1, + "parityChk": "n" + } + ], + "cachePath": "/var/user/data/dbhome/device_supervisor/offlinedata", + "cacheSize": 10000, + "debugLogPath": "/var/user/data/dbhome/device_supervisor/debugLog", + "debugLogSize": 2000 + }, + "clouds": [ + { + "cacheSize": 10000, + "enable": 1, + "name": "default", + "type": "Standard MQTT", + "args": { + "host": "hp.henrypump.cloud", + "port": 1883, + "clientId": "unknown", + "auth": 1, + "tls": 0, + "cleanSession": 0, + "mqttVersion": "v3.1.1", + "keepalive": 60, + "key": "", + "cert": "", + "rootCA": "", + "verifyServer": 0, + "verifyClient": 0, + "username": "unknown", + "passwd": "unknown", + "authType": 1, + "willQos": 0, + "willRetain": 0, + "willTopic": "", + "willPayload": "", + "tlsAuth": "caSelfSigned" + }, + "uploadRules": [] + } + ], + "quickfaas": { + "genericFuncs": [], + "uploadFuncs": [ + { + "name": "sendData", + "trigger": "measure_event", + "topic": "v1/devices/me/telemetry", + "qos": 1, + "groups": [ + "default" + ], + "funcName": "sendData", + "script": "# Enter your python code.\nimport json, os, 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\n\ndef reboot():\n #basic = Basic()\n logger.info(\"!\" * 10 + \"REBOOTING DEVICE\" + \"!\"*10)\n r = os.popen(\"kill -s SIGHUP `cat /var/run/python/supervisord.pid`\").read()\n logger.info(f\"REBOOT : {r}\")\n\ndef checkFileExist(filename):\n path = \"/var/user/files\"\n if not os.path.exists(path):\n logger.info(\"no folder making files folder in var/user\")\n os.makedirs(path)\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n if not os.path.exists(path + \"/\" + filename):\n logger.info(\"no creds file making creds file\")\n with open(path + \"/\" + filename, \"a\") as f:\n json.dump({}, f)\n\ndef convertDStoJSON(ds):\n j = dict()\n for x in ds:\n j[x[\"key\"]] = x[\"value\"]\n return j\n\ndef convertJSONtoDS(j):\n d = []\n for key in j.keys():\n d.append({\"key\": key, \"value\": j[key]})\n return d\n\ndef checkCredentialConfig():\n logger.info(\"CHECKING CONFIG\")\n cfgpath = \"/var/user/cfg/device_supervisor/device_supervisor.cfg\"\n credspath = \"/var/user/files/creds.json\"\n cfg = dict()\n with open(cfgpath, \"r\") as f:\n cfg = json.load(f)\n clouds = cfg.get(\"clouds\")\n logger.info(clouds)\n #if not configured then try to configure from stored values\n if clouds[0][\"args\"][\"clientId\"] == \"unknown\" or clouds[0][\"args\"][\"username\"] == \"unknown\" or not clouds[0][\"args\"][\"passwd\"] or clouds[0][\"args\"][\"passwd\"] == \"unknown\":\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n creds = json.load(c)\n if creds:\n logger.info(\"updating config with stored data\")\n clouds[0][\"args\"][\"clientId\"] = creds[\"clientId\"]\n clouds[0][\"args\"][\"username\"] = creds[\"userName\"]\n clouds[0][\"args\"][\"passwd\"] = creds[\"password\"]\n cfg[\"clouds\"] = clouds\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n reboot()\n else:\n #assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data\n checkFileExist(\"creds.json\")\n with open(credspath, \"r\") as c:\n logger.info(\"updating stored file with new data\")\n cfg = checkParameterConfig(cfg)\n with open(cfgpath, \"w\", encoding='utf-8') as n:\n json.dump(cfg, n, indent=1, ensure_ascii=False)\n creds = json.load(c)\n if creds:\n if creds[\"clientId\"] != clouds[0][\"args\"][\"clientId\"]:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n if creds[\"userName\"] != clouds[0][\"args\"][\"username\"]:\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n if creds[\"password\"] != clouds[0][\"args\"][\"passwd\"]:\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n else:\n creds[\"clientId\"] = clouds[0][\"args\"][\"clientId\"]\n creds[\"userName\"] = clouds[0][\"args\"][\"username\"]\n creds[\"password\"] = clouds[0][\"args\"][\"passwd\"]\n with open(credspath, \"w\") as cw:\n json.dump(creds,cw)\n\ndef checkParameterConfig(cfg):\n logger.info(\"Checking Parameters!!!!\")\n paramspath = \"/var/user/files/params.json\"\n cfgparams = convertDStoJSON(cfg.get(\"labels\"))\n #check stored values \n checkFileExist(\"params.json\")\n with open(paramspath, \"r\") as f:\n logger.info(\"Opened param storage file\")\n params = json.load(f)\n if params:\n if cfgparams != params:\n #go through each param\n #if not \"unknown\" and cfg and params aren't the same take from cfg likely updated manually\n #if key in cfg but not in params copy to params\n logger.info(\"equalizing params between cfg and stored\")\n for key in cfgparams.keys():\n try:\n if cfgparams[key] != params[key] and cfgparams[key] != \"unknown\":\n params[key] = cfgparams[key]\n except:\n params[key] = cfgparams[key]\n cfg[\"labels\"] = convertJSONtoDS(params)\n _set_global_args(convertJSONtoDS(params))\n with open(paramspath, \"w\") as p:\n json.dump(params, p)\n else:\n with open(paramspath, \"w\") as p:\n logger.info(\"initializing param file with params in memory\")\n json.dump(convertDStoJSON(get_params()), p)\n cfg[\"labels\"] = get_params()\n \n return cfg\n\n# Helper function to split the payload into chunks\ndef chunk_payload(payload, chunk_size=20):\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\ndef sendData(message):\n payload = {}\n payload[\"ts\"] = (round(dt.timestamp(dt.now())/600)*600)*1000\n payload[\"values\"] = {}\n try:\n checkCredentialConfig()\n except Exception as e:\n logger.error(e)\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n except Exception as e:\n logger.error(e)\n for chunk in chunk_payload(payload=payload):\n publish(__topic__, json.dumps(chunk), __qos__)\n time.sleep(2)\n publish(\"v1/devices/me/attributes\", json.dumps({\"latestReportTime\": (round(dt.timestamp(dt.now())/600)*600)*1000}), __qos__)", + "cloudName": "default", + "msgType": 0 + }, + { + "qos": 2, + "funcName": "sendAlarm", + "script": "import json, time\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\n\n\ndef sendAlarm(message):\n logger.info(message)\n payload = {}\n payload[\"ts\"] = time.time()*1000\n payload[\"values\"] = {message[\"measureName\"]: message[\"value\"]}\n publish(__topic__, json.dumps(payload), __qos__,cloud_name=\"default\")", + "name": "sendAlarm", + "trigger": "warning_event", + "topic": "v1/devices/me/telemetry", + "cloudName": "default", + "alarms": [ + "default" + ], + "msgType": 0 + } + ], + "downloadFuncs": [] + }, + "labels": [ + { + "key": "SN", + "value": "GF5022311031664" + }, + { + "key": "MAC", + "value": "00:18:05:28:4a:40" + } + ], + "modbusSlave": { + "enable": 0, + "protocol": "Modbus-TCP", + "port": 502, + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "maxConnection": 5, + "mapping_table": [] + }, + "modbusRTUSlave": { + "enable": 0, + "protocol": "Modbus-RTU", + "coms": "rs485", + "slaveAddr": 1, + "int16Ord": "ab", + "int32Ord": "abcd", + "float32Ord": "abcd", + "mapping_table": [] + }, + "iec104Server": { + "enable": 0, + "cotSize": 2, + "port": 2404, + "serverList": [ + { + "asduAddr": 1 + } + ], + "kValue": 12, + "wValue": 8, + "t0": 30, + "t1": 15, + "t2": 10, + "t3": 20, + "maximumLink": 5, + "timeSet": 1, + "byteOrder": "abcd", + "mapping_table": [] + }, + "iec101Server": { + "enable": 0, + "coms": "rs485", + "mode": "UnBalance", + "linkLen": 2, + "linkAddr": 1, + "asduLen": 2, + "ioaLen": 3, + "cotLen": 2, + "serverList": [ + { + "asduAddr": 1 + } + ], + "linkTimeOut": 2000, + "timeSet": 1, + "idleTimeOut": 10000, + "byteOrder": "abcd", + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "iec104Client": { + "enable": 0, + "connectType": 2, + "serverAddr": "ipower.inhandcloud.cn", + "serverPort": 2404, + "communicationCode": "", + "protocol": 1, + "asduAddr": 1, + "tls": 0, + "mapping_table": { + "YX": [], + "YC": [], + "YK": [] + } + }, + "opcuaServer": { + "enable": 0, + "port": 4840, + "maximumLink": 5, + "securityMode": 0, + "identifierType": "String", + "certificate": "None", + "privateKey": "None", + "pubsub": 0, + "mapping_table": [] + }, + "sl651Slave": { + "enable": 0, + "centerAaddr": 1, + "remoteAddr": "", + "addrCode": "", + "password": "", + "platform_list": [], + "mapping_table": [] + }, + "hj212Client": { + "enable": 0, + "platform_list": [], + "block_list": [], + "mapping_table": [] + }, + "southMetadata": {}, + "bindMetadata": { + "version": "", + "timestamp": "" + }, + "bindConfig": { + "enable": 0, + "bind": { + "modelId": "", + "modelName": "", + "srcId": "", + "srcName": "", + "devId": "", + "devName": "" + }, + "varGroups": [], + "variables": [], + "alerts": [] + }, + "templates": {}, + "version": "2.7.1" +} \ No newline at end of file diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/overflow_measures.csv b/Pub_Sub/fk_plcpond_gateway/thingsboard/overflow_measures.csv new file mode 100644 index 0000000..e9ef11d --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/overflow_measures.csv @@ -0,0 +1,26 @@ +MeasuringPointName,ControllerName,GroupName,UploadType,DataType,EnableBit,BitIndex,reverseBit,Address,Decimal,Len,ReadWrite,Unit,Description,Transform Type,MaxValue,MinValue,MaxScale,MinScale,Gain,Offset,startBit,endBit,Pt,Ct,Mapping_table,TransDecimal,bitMap,msecSample,DataEndianReverse,ReadOffset,ReadLength,DataParseMethod,BitId,storageLwTSDB +auto,overflow_pump,default,periodic,BIT,,,0,Raw_Auto_Input ,,,ro,, HOA auto status,none,,,,,,,,,,,,,0,,,,,,,1 +discharge_out,overflow_pump,default,periodic,FLOAT,,,,DisPSI_Out,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,1 +fit_rate,overflow_pump,default,periodic,FLOAT,,,,FIT_Rate,2,,ro,,,none,,,,,,,,,,,,,,,0,,,,,1 +hand,overflow_pump,default,periodic,BIT,,,0,Raw_Hand_Input ,,,ro,, HOA hand status,none,,,,,,,,,,,,,0,,,,,,,1 +level_override,overflow_pump,default,periodic,BIT,,,0,Level_Override ,,,rw,,"1= runs regardless of level, 0= runs based on start/stop levels",none,,,,,,,,,,,,,0,,,,,,,1 +overload_status,overflow_pump,default,periodic,BIT,,,0,Raw_Overload_Status , ,,ro,,,none,,,,,,,,,,,,,0,,,,,,,1 +pond_1_hi_alm,overflow_pump,default,periodic,BIT,,,0,Pond_1_Hi_Alarm,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,1 +pond_1_hi_clr_spt,overflow_pump,default,periodic,FLOAT,,,,Pond_1_Hi_Clr_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,1 +pond_1_hi_spt,overflow_pump,default,periodic,FLOAT,,,,Pond_1_Hi_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,1 +pond_1_level,overflow_pump,default,periodic,FLOAT,,,,Pond_1_Lev,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,1 +pond_1_lo_alm,overflow_pump,default,periodic,BIT,,,0,Pond_1_Lo_Alarm,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,1 +pond_1_lo_clr_spt,overflow_pump,default,periodic,FLOAT,,,,Pond_1_Lo_Clr_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,1 +pond_1_lo_spt,overflow_pump,default,periodic,FLOAT,,,,Pond_1_Lo_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,1 +pond_1_total_bbls,overflow_pump,default,periodic,FLOAT,,,,Pond_1_Total_Barrels,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,1 +pond_2_hi_alm,overflow_pump,default,periodic,BIT,,,0,Pond_2_Hi_Alarm,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,1 +pond_2_hi_clr_spt,overflow_pump,default,periodic,FLOAT,,,,Pond_2_Hi_Clr_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,1 +pond_2_hi_spt,overflow_pump,default,periodic,FLOAT,,,,Pond_2_Hi_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,1 +pond_2_level,overflow_pump,default,periodic,FLOAT,,,,Pond_2_Lev,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,1 +pond_2_lo_alm,overflow_pump,default,periodic,BIT,,,0,Pond_2_Lo_Alarm,,,ro,,,none,,,,,,,,,,,,,0,,,,,,,1 +pond_2_lo_clr_spt,overflow_pump,default,periodic,FLOAT,,,,Pond_2_Lo_Clr_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,1 +pond_2_lo_spt,overflow_pump,default,periodic,FLOAT,,,,Pond_2_Lo_Setpoint,2,,rw,,,none,,,,,,,,,,,,,,,,,,,,1 +pond_2_total_bbls,overflow_pump,default,periodic,FLOAT,,,,Pond_2_Total_Barrels,2,,ro,,,none,,,,,,,,,,,,,,,,,,,,1 +run_status,overflow_pump,default,periodic,BIT,,,0,Raw_Run_Status ,,,ro,, Pump running status,none,,,,,,,,,,,,,0,,,,,,,1 +start_level_spt,overflow_pump,default,periodic,FLOAT,,,,Start_Level_spt ,2,,rw,, start level input,none,,,,,,,,,,,,,,,,,,,,1 +stop_level_spt,overflow_pump,default,periodic,FLOAT,,,,Stop_Level_spt ,2,,rw,, stop level input,none,,,,,,,,,,,,,,,,,,,,1 \ No newline at end of file diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/overflow_tag_dump.json b/Pub_Sub/fk_plcpond_gateway/thingsboard/overflow_tag_dump.json new file mode 100644 index 0000000..daeaee2 --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/overflow_tag_dump.json @@ -0,0 +1,2348 @@ +{ + "_IO_EM_DO_00": { + "tag_name": "_IO_EM_DO_00", + "dim": 0, + "alias": true, + "instance_id": 1, + "symbol_address": 1044, + "symbol_object_address": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "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": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "UINT", + "data_type_name": "UINT", + "tag_type": "atomic" + }, + "Pond_1_Hi_Set": { + "tag_name": "Pond_1_Hi_Set", + "dim": 0, + "alias": true, + "instance_id": 29, + "symbol_address": 1124, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Hi_Reset": { + "tag_name": "Pond_1_Hi_Reset", + "dim": 0, + "alias": true, + "instance_id": 30, + "symbol_address": 1125, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Hi_Alarm": { + "tag_name": "Pond_1_Hi_Alarm", + "dim": 0, + "alias": true, + "instance_id": 31, + "symbol_address": 1126, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_2_Hi_Set": { + "tag_name": "Pond_2_Hi_Set", + "dim": 0, + "alias": true, + "instance_id": 32, + "symbol_address": 1127, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_2_Hi_Reset": { + "tag_name": "Pond_2_Hi_Reset", + "dim": 0, + "alias": true, + "instance_id": 33, + "symbol_address": 1128, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_2_Hi_Alarm": { + "tag_name": "Pond_2_Hi_Alarm", + "dim": 0, + "alias": true, + "instance_id": 34, + "symbol_address": 1129, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Lo_Set": { + "tag_name": "Pond_1_Lo_Set", + "dim": 0, + "alias": true, + "instance_id": 35, + "symbol_address": 1130, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Lo_Reset": { + "tag_name": "Pond_1_Lo_Reset", + "dim": 0, + "alias": true, + "instance_id": 36, + "symbol_address": 1131, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Lo_Alarm": { + "tag_name": "Pond_1_Lo_Alarm", + "dim": 0, + "alias": true, + "instance_id": 37, + "symbol_address": 1132, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_2_Lo_Set": { + "tag_name": "Pond_2_Lo_Set", + "dim": 0, + "alias": true, + "instance_id": 38, + "symbol_address": 1133, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_2_Lo_Reset": { + "tag_name": "Pond_2_Lo_Reset", + "dim": 0, + "alias": true, + "instance_id": 39, + "symbol_address": 1134, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_2_Lo_Alarm": { + "tag_name": "Pond_2_Lo_Alarm", + "dim": 0, + "alias": true, + "instance_id": 40, + "symbol_address": 1135, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Hi_Alarm_Enable": { + "tag_name": "Pond_1_Hi_Alarm_Enable", + "dim": 0, + "alias": true, + "instance_id": 41, + "symbol_address": 1136, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pond_1_Hi_Alarm_Enabled": { + "tag_name": "Pond_1_Hi_Alarm_Enabled", + "dim": 0, + "alias": true, + "instance_id": 42, + "symbol_address": 1137, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Save": { + "tag_name": "Save", + "dim": 0, + "alias": true, + "instance_id": 43, + "symbol_address": 1138, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pump_Status": { + "tag_name": "Pump_Status", + "dim": 0, + "alias": true, + "instance_id": 44, + "symbol_address": 1139, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Hand": { + "tag_name": "Hand", + "dim": 0, + "alias": true, + "instance_id": 45, + "symbol_address": 1140, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Auto": { + "tag_name": "Auto", + "dim": 0, + "alias": true, + "instance_id": 46, + "symbol_address": 1141, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pump_Permissive": { + "tag_name": "Pump_Permissive", + "dim": 0, + "alias": true, + "instance_id": 47, + "symbol_address": 1142, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "DisPSI_Out_Hi_Set": { + "tag_name": "DisPSI_Out_Hi_Set", + "dim": 0, + "alias": true, + "instance_id": 48, + "symbol_address": 1143, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "DisPSI_Out_Hi_Reset": { + "tag_name": "DisPSI_Out_Hi_Reset", + "dim": 0, + "alias": true, + "instance_id": 49, + "symbol_address": 1144, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "DisPSI_Out_Hi_Alarm": { + "tag_name": "DisPSI_Out_Hi_Alarm", + "dim": 0, + "alias": true, + "instance_id": 50, + "symbol_address": 1145, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "DisPSI_Out_Lo_Set": { + "tag_name": "DisPSI_Out_Lo_Set", + "dim": 0, + "alias": true, + "instance_id": 51, + "symbol_address": 1146, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "DisPSI_Out_Lo_Reset": { + "tag_name": "DisPSI_Out_Lo_Reset", + "dim": 0, + "alias": true, + "instance_id": 52, + "symbol_address": 1147, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "DisPSI_Out_Lo_Alarm": { + "tag_name": "DisPSI_Out_Lo_Alarm", + "dim": 0, + "alias": true, + "instance_id": 53, + "symbol_address": 1148, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "FIT_Rate_Hi_Set": { + "tag_name": "FIT_Rate_Hi_Set", + "dim": 0, + "alias": true, + "instance_id": 54, + "symbol_address": 1149, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "FIT_Rate_Hi_Reset": { + "tag_name": "FIT_Rate_Hi_Reset", + "dim": 0, + "alias": true, + "instance_id": 55, + "symbol_address": 1150, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "FIT_Rate_Hi_Alarm": { + "tag_name": "FIT_Rate_Hi_Alarm", + "dim": 0, + "alias": true, + "instance_id": 56, + "symbol_address": 1151, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "FIT_Rate_Lo_Set": { + "tag_name": "FIT_Rate_Lo_Set", + "dim": 0, + "alias": true, + "instance_id": 57, + "symbol_address": 1152, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "FIT_Rate_Lo_Reset": { + "tag_name": "FIT_Rate_Lo_Reset", + "dim": 0, + "alias": true, + "instance_id": 58, + "symbol_address": 1153, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "FIT_Rate_Lo_Alarm": { + "tag_name": "FIT_Rate_Lo_Alarm", + "dim": 0, + "alias": true, + "instance_id": 59, + "symbol_address": 1154, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "OFF": { + "tag_name": "OFF", + "dim": 0, + "alias": true, + "instance_id": 60, + "symbol_address": 1155, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Run_Level_Perm": { + "tag_name": "Run_Level_Perm", + "dim": 0, + "alias": true, + "instance_id": 61, + "symbol_address": 1156, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Raw_Auto_Input": { + "tag_name": "Raw_Auto_Input", + "dim": 0, + "alias": true, + "instance_id": 62, + "symbol_address": 1157, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Raw_Overload_Status": { + "tag_name": "Raw_Overload_Status", + "dim": 0, + "alias": true, + "instance_id": 63, + "symbol_address": 1158, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "CMD_Cloud_Control": { + "tag_name": "CMD_Cloud_Control", + "dim": 0, + "alias": true, + "instance_id": 64, + "symbol_address": 1159, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Level_Override": { + "tag_name": "Level_Override", + "dim": 0, + "alias": true, + "instance_id": 65, + "symbol_address": 1160, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Pump_Run": { + "tag_name": "Pump_Run", + "dim": 0, + "alias": true, + "instance_id": 66, + "symbol_address": 1161, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Raw_Hand_Input": { + "tag_name": "Raw_Hand_Input", + "dim": 0, + "alias": true, + "instance_id": 67, + "symbol_address": 1162, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Raw_Local_Start": { + "tag_name": "Raw_Local_Start", + "dim": 0, + "alias": true, + "instance_id": 68, + "symbol_address": 1163, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Raw_Run_Status": { + "tag_name": "Raw_Run_Status", + "dim": 0, + "alias": true, + "instance_id": 69, + "symbol_address": 1164, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "BOOL", + "data_type_name": "BOOL", + "bit_position": 0, + "tag_type": "atomic" + }, + "Alarm_Enable": { + "tag_name": "Alarm_Enable", + "dim": 0, + "alias": true, + "instance_id": 70, + "symbol_address": 1166, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "INT", + "data_type_name": "INT", + "tag_type": "atomic" + }, + "Pond_1_Lev": { + "tag_name": "Pond_1_Lev", + "dim": 0, + "alias": true, + "instance_id": 71, + "symbol_address": 1172, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_ScaledMin": { + "tag_name": "Pond_1_ScaledMin", + "dim": 0, + "alias": true, + "instance_id": 72, + "symbol_address": 1176, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_ScaledMax": { + "tag_name": "Pond_1_ScaledMax", + "dim": 0, + "alias": true, + "instance_id": 73, + "symbol_address": 1180, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Lev": { + "tag_name": "Pond_2_Lev", + "dim": 0, + "alias": true, + "instance_id": 74, + "symbol_address": 1184, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_ScaledMax": { + "tag_name": "Pond_2_ScaledMax", + "dim": 0, + "alias": true, + "instance_id": 75, + "symbol_address": 1188, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Hi_Setpoint": { + "tag_name": "Pond_1_Hi_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 76, + "symbol_address": 1192, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Hi_Clr_Setpoint": { + "tag_name": "Pond_1_Hi_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 77, + "symbol_address": 1196, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Hi_Setpoint": { + "tag_name": "Pond_2_Hi_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 78, + "symbol_address": 1200, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Hi_Clr_Setpoint": { + "tag_name": "Pond_2_Hi_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 79, + "symbol_address": 1204, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_CU_Ft": { + "tag_name": "Pond_1_CU_Ft", + "dim": 0, + "alias": true, + "instance_id": 80, + "symbol_address": 1208, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Dim_A": { + "tag_name": "Pond_1_Dim_A", + "dim": 0, + "alias": true, + "instance_id": 81, + "symbol_address": 1212, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Dim_B": { + "tag_name": "Pond_1_Dim_B", + "dim": 0, + "alias": true, + "instance_id": 82, + "symbol_address": 1216, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Dim_C": { + "tag_name": "Pond_1_Dim_C", + "dim": 0, + "alias": true, + "instance_id": 83, + "symbol_address": 1220, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Dim_D": { + "tag_name": "Pond_1_Dim_D", + "dim": 0, + "alias": true, + "instance_id": 84, + "symbol_address": 1224, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Cubic_Feet_To_Barrels": { + "tag_name": "Pond_1_Cubic_Feet_To_Barrels", + "dim": 0, + "alias": true, + "instance_id": 85, + "symbol_address": 1228, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Total_Barrels": { + "tag_name": "Pond_1_Total_Barrels", + "dim": 0, + "alias": true, + "instance_id": 86, + "symbol_address": 1232, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Lo_Setpoint": { + "tag_name": "Pond_1_Lo_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 87, + "symbol_address": 1236, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Lev_Temp": { + "tag_name": "Pond_1_Lev_Temp", + "dim": 0, + "alias": true, + "instance_id": 88, + "symbol_address": 1240, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Lo_Clr_Setpoint": { + "tag_name": "Pond_1_Lo_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 89, + "symbol_address": 1244, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Lo_Setpoint": { + "tag_name": "Pond_2_Lo_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 90, + "symbol_address": 1248, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Lo_Clr_Setpoint": { + "tag_name": "Pond_2_Lo_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 91, + "symbol_address": 1252, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Tot_Bbls_Temp": { + "tag_name": "Pond_1_Tot_Bbls_Temp", + "dim": 0, + "alias": true, + "instance_id": 92, + "symbol_address": 1256, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Lev_Temp": { + "tag_name": "Pond_2_Lev_Temp", + "dim": 0, + "alias": true, + "instance_id": 93, + "symbol_address": 1260, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Dim_C": { + "tag_name": "Pond_2_Dim_C", + "dim": 0, + "alias": true, + "instance_id": 94, + "symbol_address": 1264, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Dim_D": { + "tag_name": "Pond_2_Dim_D", + "dim": 0, + "alias": true, + "instance_id": 95, + "symbol_address": 1268, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_CU_Ft": { + "tag_name": "Pond_2_CU_Ft", + "dim": 0, + "alias": true, + "instance_id": 96, + "symbol_address": 1272, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Tot_Bbls_Temp": { + "tag_name": "Pond_2_Tot_Bbls_Temp", + "dim": 0, + "alias": true, + "instance_id": 97, + "symbol_address": 1276, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Cubic_Feet_To_Barrels": { + "tag_name": "Pond_2_Cubic_Feet_To_Barrels", + "dim": 0, + "alias": true, + "instance_id": 98, + "symbol_address": 1280, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Dim_A": { + "tag_name": "Pond_2_Dim_A", + "dim": 0, + "alias": true, + "instance_id": 99, + "symbol_address": 1284, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Dim_B": { + "tag_name": "Pond_2_Dim_B", + "dim": 0, + "alias": true, + "instance_id": 100, + "symbol_address": 1288, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_Total_Barrels": { + "tag_name": "Pond_2_Total_Barrels", + "dim": 0, + "alias": true, + "instance_id": 101, + "symbol_address": 1292, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_EU_Min": { + "tag_name": "Pond_1_EU_Min", + "dim": 0, + "alias": true, + "instance_id": 102, + "symbol_address": 1296, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_EU_Max": { + "tag_name": "Pond_1_EU_Max", + "dim": 0, + "alias": true, + "instance_id": 103, + "symbol_address": 1300, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_EU_Min": { + "tag_name": "Pond_2_EU_Min", + "dim": 0, + "alias": true, + "instance_id": 104, + "symbol_address": 1304, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_EU_Max": { + "tag_name": "Pond_2_EU_Max", + "dim": 0, + "alias": true, + "instance_id": 105, + "symbol_address": 1308, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "DisPSI_Out": { + "tag_name": "DisPSI_Out", + "dim": 0, + "alias": true, + "instance_id": 106, + "symbol_address": 1312, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "DisPSI_Out_Temp": { + "tag_name": "DisPSI_Out_Temp", + "dim": 0, + "alias": true, + "instance_id": 107, + "symbol_address": 1316, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "DisPSI_Out_ScaledMin": { + "tag_name": "DisPSI_Out_ScaledMin", + "dim": 0, + "alias": true, + "instance_id": 108, + "symbol_address": 1320, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "DisPSI_Out_ScaledMax": { + "tag_name": "DisPSI_Out_ScaledMax", + "dim": 0, + "alias": true, + "instance_id": 109, + "symbol_address": 1324, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Anaog_03_Raw": { + "tag_name": "Anaog_03_Raw", + "dim": 0, + "alias": true, + "instance_id": 110, + "symbol_address": 1328, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "FIT_Rate_Temp": { + "tag_name": "FIT_Rate_Temp", + "dim": 0, + "alias": true, + "instance_id": 111, + "symbol_address": 1332, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "FIT_Rate_ScaledMin": { + "tag_name": "FIT_Rate_ScaledMin", + "dim": 0, + "alias": true, + "instance_id": 112, + "symbol_address": 1336, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "FIT_Rate_ScaledMax": { + "tag_name": "FIT_Rate_ScaledMax", + "dim": 0, + "alias": true, + "instance_id": 113, + "symbol_address": 1340, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "FIT_Rate": { + "tag_name": "FIT_Rate", + "dim": 0, + "alias": true, + "instance_id": 114, + "symbol_address": 1344, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "DisPSI_Out_Hi_Setpoint": { + "tag_name": "DisPSI_Out_Hi_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 115, + "symbol_address": 1348, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "DisPSI_Out_Hi_Clr_Setpoint": { + "tag_name": "DisPSI_Out_Hi_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 116, + "symbol_address": 1352, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "DisPSI_Out_Lo_Setpoint": { + "tag_name": "DisPSI_Out_Lo_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 117, + "symbol_address": 1356, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "DisPSI_Out_Lo_Clr_Setpoint": { + "tag_name": "DisPSI_Out_Lo_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 118, + "symbol_address": 1360, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "FIT_Rate_Hi_Setpoint": { + "tag_name": "FIT_Rate_Hi_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 119, + "symbol_address": 1364, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "FIT_Rate_Hi_Clr_Setpoint": { + "tag_name": "FIT_Rate_Hi_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 120, + "symbol_address": 1368, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "FIT_Rate_Lo_Setpoint": { + "tag_name": "FIT_Rate_Lo_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 121, + "symbol_address": 1372, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "FIT_Rate_Lo_Clr_Setpoint": { + "tag_name": "FIT_Rate_Lo_Clr_Setpoint", + "dim": 0, + "alias": true, + "instance_id": 122, + "symbol_address": 1376, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_2_ScaledMin": { + "tag_name": "Pond_2_ScaledMin", + "dim": 0, + "alias": true, + "instance_id": 123, + "symbol_address": 1380, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Start_Level_spt": { + "tag_name": "Start_Level_spt", + "dim": 0, + "alias": true, + "instance_id": 124, + "symbol_address": 1384, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Stop_Level_spt": { + "tag_name": "Stop_Level_spt", + "dim": 0, + "alias": true, + "instance_id": 125, + "symbol_address": 1388, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Input_Min": { + "tag_name": "Pond_1_Input_Min", + "dim": 0, + "alias": true, + "instance_id": 126, + "symbol_address": 1392, + "symbol_object_address": 1077550916, + "software_control": 0, + "external_access": "Unknown", + "dimensions": [ + 0, + 0, + 0 + ], + "data_type": "REAL", + "data_type_name": "REAL", + "tag_type": "atomic" + }, + "Pond_1_Input_Max": { + "tag_name": "Pond_1_Input_Max", + "dim": 0, + "alias": true, + "instance_id": 127, + "symbol_address": 1396, + "symbol_object_address": 1077550916, + "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_plcpond_gateway/thingsboard/pub/sendData.py b/Pub_Sub/fk_plcpond_gateway/thingsboard/pub/sendData.py new file mode 100644 index 0000000..946ec71 --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/pub/sendData.py @@ -0,0 +1,272 @@ +import json +import os +import time +from datetime import datetime as dt +from common.Logger import logger +from quickfaas.remotebus import publish +from quickfaas.global_dict import get as get_params +from quickfaas.global_dict import _set_global_args +from mobiuspi_lib.gps import GPS + + +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 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']}" + } + return nameMap.get(name, "Gateway") + + +def sendData(message): + # logger.info(message) + grouped_data = {} + grouped_attributes = {} + now = (round(dt.timestamp(dt.now())/600)*600)*1000 + payload = {"ts": now, "values": {}} + attributes_payload = {} + 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 + except Exception as e: + logger.error(e) + + # Transform the grouped data to desired structure + payload_devices = {} + + for key, value in grouped_data.items(): + if value: + payload_devices[key] = [{"ts": now, "values": value}] + + attributes_payload_devices = {} + for key, value in grouped_attributes.items(): + if value: + attributes_payload_devices[key] = value + logger.debug(payload_devices) + logger.debug(attributes_payload_devices) + # 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())/600)*600)*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=payload_devices): + 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) diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveAttribute.py b/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveAttribute.py new file mode 100644 index 0000000..0ce9121 --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveAttribute.py @@ -0,0 +1,184 @@ +import json, time +from datetime import datetime as dt +from quickfaas.measure import recall, write +from quickfaas.remotebus import publish +from common.Logger import logger +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 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_gateway(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']}" + } + return nameMap.get(name, "Gateway") + + +# Filter payloads based on device_filter +def filter_payload(payload, device_filter): + if not device_filter: # If filter is empty, include all devices + return payload + return {key: value for key, value in payload.items() if key in device_filter} + +def sync(device_filter=[]): + #get new values and send + now = round(dt.timestamp(dt.now()))*1000 + topic = "v1/gateway/telemetry" + try: + data = recall()#json.loads(recall().decode("utf-8")) + except Exception as e: + logger.error(e) + logger.debug(data) + logger.info("SYNCING") + grouped_data = {} + grouped_attributes = {} + payload = {"ts": now, "values":{}} + attributes_payload = {} + try: + for controller in data: + for measure in controller["measures"]: + ctrlName = controlName(measure["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 = "_".join(measure['name'].split("_")[2:]) + 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 + except Exception as e: + logger.error(e) + try: + # Transform the grouped data to desired structure + payload_gateway = {} + + for key, value in grouped_data.items(): + if value: + payload_gateway[key] = [{"ts": now ,"values": value}] + + attributes_payload_gateway = {} + for key, value in grouped_attributes.items(): + if value: + attributes_payload_gateway[key] = value + + # Apply the filter + filtered_payload_gateway = filter_payload(payload_gateway, device_filter) + filtered_attributes_payload_gateway = filter_payload(attributes_payload_gateway, device_filter) + + #Send data belonging to Gateway + for chunk in chunk_payload(payload=payload): + publish("v1/devices/me/telemetry", json.dumps(chunk), qos=1, cloud_name="default") + time.sleep(2) + + attributes_payload["latestReportTime"] = (round(dt.timestamp(dt.now())/600)*600)*1000 + for chunk in chunk_payload(payload=attributes_payload): + publish("v1/devices/me/attributes", json.dumps(chunk), qos=1, cloud_name="default") + time.sleep(2) + + #Send gateway devices data + for chunk in chunk_payload_gateway(payload=filtered_payload_gateway): + publish("v1/gateway/telemetry", json.dumps(chunk), qos=1, cloud_name="default") + time.sleep(2) + + for chunk in chunk_payload_gateway(payload=filtered_attributes_payload_gateway, is_attributes_payload=True): + publish("v1/gateway/attributes", json.dumps(chunk), qos=1, cloud_name="default") + time.sleep(2) + + except Exception as e: + logger.error(e) + +def writeplctag(value): + #value in the form {"measurement": , "value": } + try: + #value = json.loads(value.replace("'",'"')) + logger.info(value) + #payload format: [{"name": "advvfdipp", "measures": [{"name": "manualfrequencysetpoint", "value": 49}]}] + message = [{"name": "plcpond", "measures":[{"name":value["measurement"], "value": value["value"]}]}] + resp = write(message) + logger.info("RETURN FROM WRITE: {}".format(resp)) + return True + except Exception as e: + logger.error(e) + return False + +def receiveAttribute(topic, payload): + try: + logger.debug(topic) + logger.info(json.loads(payload)) + p = json.loads(payload) + + for key, value in p.items(): + try: + result = writeplctag({"measurement": key, "value": value}) + logger.debug(result) + except Exception as e: + logger.error(e) + #logger.debug(command) + time.sleep(5) + try: + sync(p["device"]) + except Exception as e: + logger.error(f"Could not sync: {e}") + + except Exception as e: + logger.debug(e) diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveAttributeGateway.py b/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveAttributeGateway.py new file mode 100644 index 0000000..8952e8f --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveAttributeGateway.py @@ -0,0 +1,198 @@ +import json, time +from datetime import datetime as dt +from quickfaas.measure import recall, write +from quickfaas.remotebus import publish +from common.Logger import logger +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 formatPLCPayload(device, key, value): + params = convertDStoJSON(get_params()) + nameMap = { + f"{params['overflow_pump']}": "overflow_pump" + } + measure = key + device = nameMap.get(device, "") + output = {"measurement": measure, "value": value, "device": device} + return output + + +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_gateway(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']}" + } + return nameMap.get(name, "Gateway") + +# Filter payloads based on device_filter +def filter_payload(payload, device_filter): + if not device_filter: # If filter is empty, include all devices + return payload + return {key: value for key, value in payload.items() if key in device_filter} + + +def sync(device_filter=[]): + #get new values and send + now = round(dt.timestamp(dt.now()))*1000 + topic = "v1/gateway/telemetry" + try: + data = recall()#json.loads(recall().decode("utf-8")) + except Exception as e: + logger.error(e) + logger.debug(data) + logger.info("SYNCING") + grouped_data = {} + grouped_attributes = {} + payload = {"ts": now, "values":{}} + attributes_payload = {} + try: + for controller in data: + for measure in controller["measures"]: + ctrlName = controlName(measure["name"]) + 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 = "_".join(measure['name'].split("_")[2:]) + 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 + except Exception as e: + logger.error(e) + try: + # Transform the grouped data to desired structure + payload_gateway = {} + + for key, value in grouped_data.items(): + if value: + payload_gateway[key] = [{"ts": now ,"values": value}] + + attributes_payload_gateway = {} + for key, value in grouped_attributes.items(): + if value: + attributes_payload_gateway[key] = value + + # Apply the filter + filtered_payload_gateway = filter_payload(payload_gateway, device_filter) + filtered_attributes_payload_gateway = filter_payload(attributes_payload_gateway, device_filter) + + #Send data belonging to Gateway + for chunk in chunk_payload(payload=payload): + publish("v1/devices/me/telemetry", json.dumps(chunk), qos=1, cloud_name="default") + time.sleep(2) + + attributes_payload["latestReportTime"] = (round(dt.timestamp(dt.now())/600)*600)*1000 + for chunk in chunk_payload(payload=attributes_payload): + publish("v1/devices/me/attributes", json.dumps(chunk), qos=1, cloud_name="default") + time.sleep(2) + + #Send gateway devices data + for chunk in chunk_payload_gateway(payload=filtered_payload_gateway): + publish("v1/gateway/telemetry", json.dumps(chunk), qos=1, cloud_name="default") + time.sleep(2) + + for chunk in chunk_payload_gateway(payload=filtered_attributes_payload_gateway, is_attributes_payload=True): + publish("v1/gateway/attributes", json.dumps(chunk), qos=1, cloud_name="default") + time.sleep(2) + + except Exception as e: + logger.error(e) + + + +def writeplctag(value): + #value in the form {"measurement": , "value": } + try: + logger.debug(value) + #payload format: [{"name": "advvfdipp", "measures": [{"name": "manualfrequencysetpoint", "value": 49}]}] + message = [{"name": value["device"], "measures": [{"name": value["measurement"], "value": value["value"]}]}] + resp = write(message) + logger.debug("RETURN FROM WRITE: {}".format(resp)) + return True + except Exception as e: + logger.error(e) + return False + + +def receiveAttribute(topic, payload): + try: + logger.debug(topic) + logger.debug(json.loads(payload)) + p = json.loads(payload) + device = p["device"] + for key, value in p["data"].items(): + try: + measure = formatPLCPayload(device, key, value) + result = writeplctag(measure) + logger.debug(result) + except Exception as e: + logger.error(e) + #logger.debug(command) + time.sleep(5) + try: + sync(p["device"]) + except Exception as e: + logger.error(f"Could not sync: {e}") + except Exception as e: + logger.debug(e) + diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveCommand.py b/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveCommand.py new file mode 100644 index 0000000..d7bf6c6 --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveCommand.py @@ -0,0 +1,75 @@ +import json, time +from datetime import datetime as dt +from quickfaas.measure import recall, write +from quickfaas.remotebus import publish +from common.Logger import logger + +# Helper function to split the payload into chunks +def chunk_payload(payload, chunk_size=20): + chunked_values = list(payload["values"].items()) + for i in range(0, len(chunked_values), chunk_size): + yield { + "ts": payload["ts"], + "values": dict(chunked_values[i:i+chunk_size]) + } + +def sync(): + #get new values and send + payload = {"ts": round(dt.timestamp(dt.now()))*1000, "values": {}} + topic = "v1/devices/me/telemetry" + try: + data = recall()#json.loads(recall().decode("utf-8")) + except Exception as e: + logger.error(e) + logger.debug(data) + for controller in data: + for measure in controller["measures"]: + #publish measure + payload["values"][measure["name"]] = measure["value"] + logger.debug("Sending on topic: {}".format(topic)) + logger.debug("Sending value: {}".format(payload)) + for chunk in chunk_payload(payload=payload): + publish(topic, json.dumps(chunk), 1) + time.sleep(2) + +def writeplctag(value): + #value in the form {"measurement": , "value": } + try: + #value = json.loads(value.replace("'",'"')) + logger.info(value) + #payload format: [{"name": "advvfdipp", "measures": [{"name": "manualfrequencysetpoint", "value": 49}]}] + message = [{"name": "rr_facility", "measures":[{"name":value["measurement"], "value": value["value"]}]}] + resp = write(message) + logger.info("RETURN FROM WRITE: {}".format(resp)) + return True + except Exception as e: + logger.error(e) + return False + +def receiveCommand(topic, payload, wizard_api): + try: + logger.debug(topic) + logger.info(json.loads(payload)) + p = json.loads(payload) + command = p["method"] + commands = { + "sync": sync, + "writeplctag": writeplctag, + } + if command == "setPLCTag": + result = commands["writeplctag"](p["params"]) + if result: + sync() + #commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api) + #logger.debug(command) + ack(topic.split("/")[-1], wizard_api) + except Exception as e: + logger.error(e) + + +def ack(msgid, wizard_api): + #logger.debug(msgid) + #logger.debug(mac) + #logger.debug(name) + #logger.debug(value) + wizard_api.mqtt_publish("v1/devices/me/rpc/response/" + str(msgid), json.dumps({"msg": {"time": time.time()}, "metadata": "", "msgType": ""})) \ No newline at end of file diff --git a/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveCommandGateway.py b/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveCommandGateway.py new file mode 100644 index 0000000..8f708b9 --- /dev/null +++ b/Pub_Sub/fk_plcpond_gateway/thingsboard/sub/receiveCommandGateway.py @@ -0,0 +1,244 @@ +import json, time +from datetime import datetime as dt +from quickfaas.measure import recall, write +from quickfaas.remotebus import publish +from common.Logger import logger +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 formatPLCPayload(payload): + params = convertDStoJSON(get_params()) + nameMap = { + f"{params['facilityName']} Transfer Pump #1": "tp_1_", + f"{params['facilityName']} Transfer Pump #2": "tp_2_", + f"{params['facilityName']} Water Well #1": "ww_1_", + f"{params['facilityName']} Water Well #2": "ww_2_", + f"{params['facilityName']} Water Well #3": "ww_3_", + f"{params['facilityName']} Water Well #4": "ww_4_", + f"{params['facilityName']} Water Well #5": "ww_5_", + f"{params['facilityName']} Water Well #6": "ww_6_" + } + measure = nameMap.get(payload["device"], "") + payload["data"]["params"]["measurement"] + output = {"measurement": measure, "value": payload["data"]["params"]["value"]} + return output + + +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_gateway(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): + params = convertDStoJSON(get_params()) + nameMap = { + "tp_1": f"{params['facilityName']} Transfer Pump #1", + "tp_2": f"{params['facilityName']} Transfer Pump #2", + "ww_1": f"{params['facilityName']} Water Well #1", + "ww_2": f"{params['facilityName']} Water Well #2", + "ww_3": f"{params['facilityName']} Water Well #3", + "ww_4": f"{params['facilityName']} Water Well #4", + "ww_5": f"{params['facilityName']} Water Well #5", + "ww_6": f"{params['facilityName']} Water Well #6" + } + parts = "_".join(name.split("_")[:2]) + return nameMap.get(parts, "Gateway") + +# Filter payloads based on device_filter +def filter_payload(payload, device_filter): + if not device_filter: # If filter is empty, include all devices + return payload + return {key: value for key, value in payload.items() if key in device_filter} + + +def sync(device_filter=[]): + #get new values and send + now = round(dt.timestamp(dt.now()))*1000 + topic = "v1/gateway/telemetry" + try: + data = recall()#json.loads(recall().decode("utf-8")) + except Exception as e: + logger.error(e) + logger.debug(data) + logger.info("SYNCING") + grouped_data = {} + grouped_attributes = {} + payload = {"ts": now, "values":{}} + attributes_payload = {} + try: + for controller in data: + for measure in controller["measures"]: + ctrlName = controlName(measure["name"]) + 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 = "_".join(measure['name'].split("_")[2:]) + 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 + except Exception as e: + logger.error(e) + try: + # Transform the grouped data to desired structure + payload_gateway = {} + + for key, value in grouped_data.items(): + if value: + payload_gateway[key] = [{"ts": now ,"values": value}] + + attributes_payload_gateway = {} + for key, value in grouped_attributes.items(): + if value: + attributes_payload_gateway[key] = value + + # Apply the filter + filtered_payload_gateway = filter_payload(payload_gateway, device_filter) + filtered_attributes_payload_gateway = filter_payload(attributes_payload_gateway, device_filter) + + #Send data belonging to Gateway + for chunk in chunk_payload(payload=payload): + publish("v1/devices/me/telemetry", json.dumps(chunk), qos=1, cloud_name="default") + time.sleep(2) + + attributes_payload["latestReportTime"] = (round(dt.timestamp(dt.now())/600)*600)*1000 + for chunk in chunk_payload(payload=attributes_payload): + publish("v1/devices/me/attributes", json.dumps(chunk), qos=1, cloud_name="default") + time.sleep(2) + + #Send gateway devices data + for chunk in chunk_payload_gateway(payload=filtered_payload_gateway): + publish("v1/gateway/telemetry", json.dumps(chunk), qos=1, cloud_name="default") + time.sleep(2) + + for chunk in chunk_payload_gateway(payload=filtered_attributes_payload_gateway, is_attributes_payload=True): + publish("v1/gateway/attributes", json.dumps(chunk), qos=1, cloud_name="default") + time.sleep(2) + + except Exception as e: + logger.error(e) + + + + +def writeplctag(value): + #value in the form {"measurement": , "value": } + try: + #logger.info(value) + #payload format: [{"name": "advvfdipp", "measures": [{"name": "manualfrequencysetpoint", "value": 49}]}] + message = [{"name": "rr_facility", "measures":[{"name":value["measurement"], "value": value["value"]}]}] + resp = write(message) + logger.debug("RETURN FROM WRITE: {}".format(resp)) + return True + except Exception as e: + logger.error(e) + return False + + +def receiveCommand(topic, payload): + try: + logger.debug(topic) + logger.debug(json.loads(payload)) + p = json.loads(payload) + #logger.info(p) + command = p["data"]["method"] + commands = { + "sync": sync, + "writeplctag": writeplctag, + } + if command == "setPLCTag": + try: + params = formatPLCPayload(p) + #logger.info(params) + result = commands["writeplctag"](params) + logger.debug(result) + except Exception as e: + logger.error(e) + elif command == "startWW": + try: + params = formatPLCPayload({"device": p["device"], "data": {"params": {"measurement": "auto_cmd", "value": 0}}}) + result = commands["writeplctag"](params) + time.sleep(1) + params = formatPLCPayload({"device": p["device"], "data": {"params": {"measurement": "manual_run_cmd", "value": 1}}}) + result = commands["writeplctag"](params) + except Exception as e: + logger.error(f"Error in startWW: {e}") + elif command == "manualAutoSwitch": + try: + if p["data"]["params"]["direction"] == "manualToAuto": + params = formatPLCPayload({"device": p["device"], "data": {"params": {"measurement": "manual_run_cmd", "value": 0}}}) + result = commands["writeplctag"](params) + time.sleep(1) + params = formatPLCPayload({"device": p["device"], "data": {"params": {"measurement": "auto_cmd", "value": 1}}}) + result = commands["writeplctag"](params) + elif p["data"]["params"]["direction"] == "autoToManual": + params = formatPLCPayload({"device": p["device"], "data": {"params": {"measurement": "auto_cmd", "value": 0}}}) + result = commands["writeplctag"](params) + else: + logger.error(f'Invalid input in manualAutoSwitch: {p["data"]["params"]["direction"]}') + except Exception as e: + logger.error(f"Error in manualToAuto: {e}") + ackPayload = {"device": p["device"], "id": p["data"]["id"], "data": {"success": True}} + ack(ackPayload) + time.sleep(5) + try: + sync(p["device"]) + except Exception as e: + logger.error(f"Could not sync: {e}") + except Exception as e: + logger.error(e) + + +def ack(message): + publish("v1/gateway/rpc", json.dumps(message), 1, cloud_name="default") diff --git a/code snippets/getPLCData.ipynb b/code snippets/getPLCData.ipynb index 0866944..7521b24 100644 --- a/code snippets/getPLCData.ipynb +++ b/code snippets/getPLCData.ipynb @@ -16,13 +16,13 @@ "metadata": {}, "outputs": [], "source": [ - "ip_address = \"166.195.18.153\" # \"ngrok.iot.inhandnetworks.com:3021\"\n", - "path = '/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/plcfreshwater_advvfdipp/thingsboard/as11_tag_dump.json' # code snippets/tag_dump.json'" + "ip_address = \"166.193.23.21\" # \"ngrok.iot.inhandnetworks.com:3021\"\n", + "path = '/Users/nico/Documents/GitHub/HP_InHand_IG502/Pub_Sub/fk_plcpond/thingsboard/overflow_tag_dump.json' # code snippets/tag_dump.json'" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [