1132 lines
45 KiB
INI
1132 lines
45 KiB
INI
{
|
|
"controllers": [
|
|
{
|
|
"enable": 1,
|
|
"protocol": "AllenBradley MicroCip",
|
|
"name": "plcpond",
|
|
"samplePeriod": 10,
|
|
"desc": "",
|
|
"expired": 10000,
|
|
"args": {
|
|
"slot": 0,
|
|
"connectTimeOut": 10000
|
|
},
|
|
"enableDebug": 0,
|
|
"enablePerOnchange": 0,
|
|
"endpoint": "192.168.1.12:44818"
|
|
},
|
|
{
|
|
"enable": 1,
|
|
"protocol": "EtherNet/IP",
|
|
"name": "fk_transfer",
|
|
"samplePeriod": 10,
|
|
"desc": "",
|
|
"expired": 1000,
|
|
"args": {
|
|
"connectTimeOut": 1000,
|
|
"slot": 0
|
|
},
|
|
"enableDebug": 0,
|
|
"enablePerOnchange": 0,
|
|
"endpoint": "192.168.1.10:44818"
|
|
}
|
|
],
|
|
"measures": [
|
|
{
|
|
"name": "pond_1_level",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Pond_1_Lev",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_1_total_bbls",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Pond_1_Total_Barrels",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_1_hi_alm",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "Pond_1_Hi_Alarm",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_1_hi_spt",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Pond_1_Hi_Setpoint",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_1_hi_clr_spt",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Pond_1_Hi_Clr_Setpoint",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_1_lo_alm",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "Pond_1_Lo_Alarm",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_1_lo_spt",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Pond_1_Lo_Setpoint",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_1_lo_clr_spt",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Pond_1_Lo_Clr_Setpoint",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_2_level",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Pond_2_Lev",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_2_total_bbls",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Pond_2_Total_Barrels",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_2_hi_alm",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "Pond_2_Hi_Alarm",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_2_hi_spt",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Pond_2_Hi_Setpoint",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_2_hi_clr_spt",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Pond_2_Hi_Clr_Setpoint",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "1.0",
|
|
"offset": "0.0",
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_2_lo_alm",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "Pond_2_Lo_Alarm",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_2_lo_spt",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Pond_2_Lo_Setpoint",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "pond_2_lo_clr_spt",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Pond_2_Lo_Clr_Setpoint",
|
|
"decimal": 2,
|
|
"len": 1,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"maxValue": "",
|
|
"minValue": "",
|
|
"maxScaleValue": "",
|
|
"minScaleValue": "",
|
|
"gain": "",
|
|
"offset": "",
|
|
"storageLwTSDB": 0
|
|
},
|
|
{
|
|
"name": "air_comp_low_alm",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "AL0_Air_Comp_Low",
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"storageLwTSDB": 0,
|
|
"reverseBit": 0,
|
|
"bitMap": 0
|
|
},
|
|
{
|
|
"name": "air_comp_val",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Val_Air_Comp_Out",
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"storageLwTSDB": 0,
|
|
"decimal": 2
|
|
},
|
|
{
|
|
"name": "air_comp_spt",
|
|
"ctrlName": "plcpond",
|
|
"group": "default",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "SPT_Low_Air_PSI",
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"storageLwTSDB": 0,
|
|
"decimal": 2
|
|
},
|
|
{
|
|
"name": "discharge_in",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "DisPSI_In",
|
|
"decimal": 2,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "discharge_out",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "DisPSI_Out",
|
|
"decimal": 2,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "discharge_hi_spt",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "AlarmSpt_DisPSI_Hi",
|
|
"decimal": 2,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "discharge_lo_spt",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "AlarmSpt_DisPSI_Lo",
|
|
"decimal": 2,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "discharge_hi_alm",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "Alarm_DisPSI_Hi",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "discharge_lo_alm",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "Alarm_DisPSI_Lo",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "alarm_enable_cmd",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "INT",
|
|
"addr": "Alarm_Enable",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0,
|
|
"enableBit": 0,
|
|
"bitIndex": 0
|
|
},
|
|
{
|
|
"name": "aa_flow_rate",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Flow_Rate_AA",
|
|
"decimal": 2,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "aa_totalizer_1",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "Totalizer_1_AA",
|
|
"decimal": 2,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "flow_rate_hi_spt",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "AlarmSpt_FlowRate_Hi",
|
|
"decimal": 2,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "flow_rate_lo_spt",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "AlarmSpt_FlowRate_Lo",
|
|
"decimal": 2,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "flow_rate_hi_alm",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "Alarm_FlowRate_Hi",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "flow_rate_lo_alm",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "Alarm_FlowRate_Lo",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "pond_level",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "PondLvl",
|
|
"decimal": 2,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "pond_level_hi_spt",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "AlarmSpt_PondLvl_Hi",
|
|
"decimal": 2,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "pond_level_lo_spt",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "AlarmSpt_PondLvl_Lo",
|
|
"decimal": 2,
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "pond_level_hi_alm",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "Alarm_PondLvl_Hi",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "pond_level_lo_alm",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "Alarm_Pondlvl_Lo",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "power_loss_120v_alm",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "Alarm_PowerLoss_120V",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "vfd_ready",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "VFD_Ready",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "vfd_warning",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "VFD_Warning",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "vfd_faulted",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "VFD_Faulted",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "vfd_running",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "VFD_Running",
|
|
"bitMap": 0,
|
|
"reverseBit": 0,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "vfd_frequency_reference",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "VFD_Freq_Ref",
|
|
"decimal": 2,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "vfd_frequency_output",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "FLOAT",
|
|
"addr": "VFD_Output_Freq",
|
|
"decimal": 2,
|
|
"readWrite": "ro",
|
|
"unit": "",
|
|
"desc": "",
|
|
"storageLwTSDB": 0,
|
|
"transformType": 0
|
|
},
|
|
{
|
|
"name": "vfd_start_stop",
|
|
"ctrlName": "fk_transfer",
|
|
"group": "fk_transfer",
|
|
"uploadType": "periodic",
|
|
"dataType": "BIT",
|
|
"addr": "VFD_Start_Stop_Pushbutton",
|
|
"readWrite": "rw",
|
|
"unit": "",
|
|
"desc": "",
|
|
"transformType": 0,
|
|
"storageLwTSDB": 0,
|
|
"reverseBit": 0,
|
|
"bitMap": 0
|
|
}
|
|
],
|
|
"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
|
|
},
|
|
{
|
|
"historyDataPath": "/var/user/data/dbhome/device_supervisor/LwTSDB",
|
|
"name": "fk_transfer",
|
|
"uploadInterval": 600,
|
|
"enablePerOnchange": 0,
|
|
"LwTSDBSize": 1000,
|
|
"strategy": 1
|
|
}
|
|
],
|
|
"misc": {
|
|
"maxAlarmRecordSz": 2000,
|
|
"logLvl": "DEBUG",
|
|
"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-aa-pond",
|
|
"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": []
|
|
},
|
|
{
|
|
"cacheSize": 10000,
|
|
"enable": 1,
|
|
"name": "FK Transfer",
|
|
"type": "Standard MQTT",
|
|
"args": {
|
|
"host": "hp.henrypump.cloud",
|
|
"port": 1883,
|
|
"clientId": "faskens-aa-transfer",
|
|
"auth": 1,
|
|
"tls": 0,
|
|
"cleanSession": 0,
|
|
"mqttVersion": "v3.1.1",
|
|
"keepalive": 60,
|
|
"key": "",
|
|
"cert": "",
|
|
"rootCA": "",
|
|
"verifyServer": 0,
|
|
"verifyClient": 0,
|
|
"username": "faskensmqtt",
|
|
"passwd": "faskensmqtt@1903",
|
|
"willQos": 0,
|
|
"willRetain": 0,
|
|
"willTopic": "",
|
|
"willPayload": ""
|
|
},
|
|
"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
|
|
},
|
|
{
|
|
"qos": 1,
|
|
"funcName": "sendData",
|
|
"script": "# Enter your python code.\nimport json, os, time, shutil\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\n\n\ndef chunk_payload(payload, chunk_size=20):\n if \"values\" in payload:\n # Original format: {\"ts\": ..., \"values\": {...}}\n chunked_values = list(payload[\"values\"].items())\n for i in range(0, len(chunked_values), chunk_size):\n yield {\n \"ts\": payload[\"ts\"],\n \"values\": dict(chunked_values[i:i+chunk_size])\n }\n else:\n # New format: {\"key1\": \"value1\", \"key2\": \"value2\"}\n chunked_keys = list(payload.keys())\n for i in range(0, len(chunked_keys), chunk_size):\n yield {k: payload[k] for k in chunked_keys[i:i+chunk_size]}\n\n\ndef sendData(message):\n #logger.debug(message)\n payload = {\"ts\": (round(dt.timestamp(dt.now())/600)*600)*1000, \"values\": {}}\n attributes_payload = {}\n resetPayload = {\"ts\": \"\", \"values\": {}}\n dayReset, weekReset, monthReset, yearReset = False, False, False, False\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n if measure[\"health\"] == 1:\n if \"_spt\" in measure[\"name\"]:\n attributes_payload[measure[\"name\"]] = measure[\"value\"]\n elif measure in [\"totalizer_1\"]:\n payload[\"values\"][\"day_volume\"], dayReset = totalizeDay(measure[\"value\"])\n payload[\"values\"][\"week_volume\"], weekReset = totalizeWeek(measure[\"value\"])\n payload[\"values\"][\"month_volume\"], monthReset = totalizeMonth(measure[\"value\"])\n payload[\"values\"][\"year_volume\"], yearReset = totalizeYear(measure[\"value\"])\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"] \n except Exception as e:\n logger.error(e)\n\n \n for chunk in chunk_payload(payload=payload):\n publish(__topic__, json.dumps(chunk), __qos__, cloud_name=\"FK Transfer\")\n time.sleep(2)\n \n attributes_payload[\"latestReportTime\"] = (round(dt.timestamp(dt.now())/600)*600)*1000\n for chunk in chunk_payload(payload=attributes_payload):\n publish(\"v1/devices/me/attributes\", json.dumps(chunk), __qos__, cloud_name=\"FK Transfer\")\n time.sleep(2)\n \n if dayReset:\n resetPayload[\"values\"][\"yesterday_volume\"] = payload[\"values\"][\"day_volume\"]\n resetPayload[\"values\"][\"day_volume\"] = 0\n if weekReset:\n resetPayload[\"values\"][\"last_week_volume\"] = payload[\"values\"][\"week_volume\"]\n resetPayload[\"values\"][\"week_volume\"] = 0\n if monthReset:\n resetPayload[\"values\"][\"last_month_volume\"] = payload[\"values\"][\"month_volume\"]\n resetPayload[\"values\"][\"month_volume\"] = 0\n if yearReset:\n resetPayload[\"values\"][\"last_year_volume\"] = payload[\"values\"][\"year_volume\"]\n resetPayload[\"values\"][\"year_volume\"] = 0 \n\n if resetPayload[\"values\"]:\n resetPayload[\"ts\"] = 1 + (round(dt.timestamp(dt.now())/600)*600)*1000\n publish(__topic__, json.dumps(resetPayload), __qos__, cloud_name=\"FK Transfer\")\n\n\ndef initialize_totalizers():\n return {\n \"day\": 0,\n \"week\": 0,\n \"month\": 0,\n \"year\": 0,\n \"lifetime\": 0,\n \"dayHolding\": 0,\n \"weekHolding\": 0,\n \"monthHolding\": 0,\n \"yearHolding\": 0\n }\n\ndef getTotalizers(file_path=\"/var/user/files/totalizers.json\"):\n \"\"\"\n Retrieves totalizer data from a JSON file.\n\n :param file_path: Path to the JSON file storing totalizer data.\n :return: Dictionary containing totalizer values.\n \"\"\"\n try:\n with open(file_path, \"r\") as t:\n totalizers = json.load(t)\n if not totalizers or not isinstance(totalizers, dict):\n logger.info(\"Invalid data format in the file. Initializing totalizers.\")\n totalizers = initialize_totalizers()\n except FileNotFoundError:\n logger.info(\"File not found. Initializing totalizers.\")\n totalizers = initialize_totalizers()\n except json.JSONDecodeError:\n timestamp = dt.now().strftime(\"%Y%m%d_%H%M%S\")\n # Split the file path and insert the timestamp before the extension\n file_name, file_extension = os.path.splitext(file_path)\n backup_file_path = f\"{file_name}_{timestamp}{file_extension}\"\n shutil.copyfile(file_path, backup_file_path)\n logger.error(f\"Error decoding JSON. A backup of the file is created at {backup_file_path}. Initializing totalizers.\")\n totalizers = initialize_totalizers()\n return totalizers\n\ndef saveTotalizers(totalizers, file_path=\"/var/user/files/totalizers.json\"):\n \"\"\"\n Saves totalizer data to a JSON file.\n\n :param totalizers: Dictionary containing totalizer values to be saved.\n :param file_path: Path to the JSON file where totalizer data will be saved.\n \"\"\"\n try:\n with open(file_path, \"w\") as t:\n json.dump(totalizers, t)\n except (IOError, OSError, json.JSONEncodeError) as e:\n logger.error(f\"Error saving totalizers to {file_path}: {e}\")\n raise # Optionally re-raise the exception if it should be handled by the caller\n\n\ndef totalizeDay(lifetime, max_retries=3, retry_delay=2):\n \"\"\"\n Update and save daily totalizers based on the lifetime value.\n\n :param lifetime: The current lifetime total.\n :param max_retries: Maximum number of save attempts.\n :param retry_delay: Delay in seconds between retries.\n :return: A tuple containing the calculated value and a boolean indicating if a reset occurred, or (None, False) if save fails.\n \"\"\"\n totalizers = getTotalizers()\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n reset = False\n value = lifetime - totalizers[\"dayHolding\"]\n\n if not int(now.strftime(\"%d\")) == int(totalizers[\"day\"]):\n totalizers[\"dayHolding\"] = lifetime\n totalizers[\"day\"] = int(now.strftime(\"%d\"))\n\n for attempt in range(max_retries):\n try:\n saveTotalizers(totalizers)\n reset = True\n return (value, reset)\n except Exception as e:\n logger.error(f\"Attempt {attempt + 1} failed to save totalizers: {e}\")\n if attempt < max_retries - 1:\n time.sleep(retry_delay)\n else:\n logger.error(\"All attempts to save totalizers failed.\")\n return (None, False)\n\n return (value, reset)\n\ndef totalizeWeek(lifetime, max_retries=3, retry_delay=2):\n \"\"\"\n Update and save weekly totalizers based on the lifetime value.\n\n :param lifetime: The current lifetime total.\n :param max_retries: Maximum number of save attempts.\n :param retry_delay: Delay in seconds between retries.\n :return: A tuple containing the calculated value and a boolean indicating if a reset occurred, or (None, False) if save fails.\n \"\"\"\n totalizers = getTotalizers()\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n reset = False\n value = lifetime - totalizers[\"weekHolding\"]\n if (not now.strftime(\"%U\") == totalizers[\"week\"] and now.strftime(\"%a\") == \"Sun\") or totalizers[\"week\"] == 0:\n totalizers[\"weekHolding\"] = lifetime\n totalizers[\"week\"] = now.strftime(\"%U\")\n\n for attempt in range(max_retries):\n try:\n saveTotalizers(totalizers)\n reset = True\n return (value, reset)\n except Exception as e:\n logger.error(f\"Attempt {attempt + 1} failed to save totalizers: {e}\")\n if attempt < max_retries - 1:\n time.sleep(retry_delay)\n else:\n logger.error(\"All attempts to save totalizers failed.\")\n return (None, False)\n return (value, reset)\n\ndef totalizeMonth(lifetime, max_retries=3, retry_delay=2):\n \"\"\"\n Update and save monthly totalizers based on the lifetime value.\n\n :param lifetime: The current lifetime total.\n :param max_retries: Maximum number of save attempts.\n :param retry_delay: Delay in seconds between retries.\n :return: A tuple containing the calculated value and a boolean indicating if a reset occurred, or (None, False) if save fails.\n \"\"\"\n totalizers = getTotalizers()\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n reset = False\n value = lifetime - totalizers[\"monthHolding\"]\n if not int(now.strftime(\"%m\")) == int(totalizers[\"month\"]):\n totalizers[\"monthHolding\"] = lifetime\n totalizers[\"month\"] = now.strftime(\"%m\")\n\n for attempt in range(max_retries):\n try:\n saveTotalizers(totalizers)\n reset = True\n return (value, reset)\n except Exception as e:\n logger.error(f\"Attempt {attempt + 1} failed to save totalizers: {e}\")\n if attempt < max_retries - 1:\n time.sleep(retry_delay)\n else:\n logger.error(\"All attempts to save totalizers failed.\")\n return (None, False)\n\n return (value,reset)\n\ndef totalizeYear(lifetime, max_retries=3, retry_delay=2):\n \"\"\"\n Update and save yearly totalizers based on the lifetime value.\n\n :param lifetime: The current lifetime total.\n :param max_retries: Maximum number of save attempts.\n :param retry_delay: Delay in seconds between retries.\n :return: A tuple containing the calculated value and a boolean indicating if a reset occurred, or (None, False) if save fails.\n \"\"\"\n totalizers = getTotalizers()\n now = dt.fromtimestamp(round(dt.timestamp(dt.now())/600)*600)\n reset = False\n value = lifetime - totalizers[\"yearHolding\"]\n if not int(now.strftime(\"%Y\")) == int(totalizers[\"year\"]):\n totalizers[\"yearHolding\"] = lifetime\n totalizers[\"year\"] = now.strftime(\"%Y\")\n\n for attempt in range(max_retries):\n try:\n saveTotalizers(totalizers)\n reset = True\n return (value, reset)\n except Exception as e:\n logger.error(f\"Attempt {attempt + 1} failed to save totalizers: {e}\")\n if attempt < max_retries - 1:\n time.sleep(retry_delay)\n else:\n logger.error(\"All attempts to save totalizers failed.\")\n return (None, False)\n return (value, reset)\n \n",
|
|
"name": "sendData",
|
|
"trigger": "measure_event",
|
|
"topic": "v1/devices/me/telemetry",
|
|
"cloudName": "FK Transfer",
|
|
"groups": [
|
|
"fk_transfer"
|
|
],
|
|
"msgType": 0
|
|
}
|
|
],
|
|
"downloadFuncs": [
|
|
{
|
|
"name": "receiveCommand",
|
|
"topic": "v1/devices/me/rpc/request/+",
|
|
"qos": 1,
|
|
"funcName": "receiveCommand",
|
|
"payload_type": "JSON",
|
|
"script": "import json, time\nfrom datetime import datetime as dt\nfrom quickfaas.measure import recall, write\nfrom quickfaas.remotebus import publish\nfrom common.Logger import logger\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 sync():\n #get new values and send\n payload = {\"ts\": round(dt.timestamp(dt.now()))*1000, \"values\": {}}\n topic = \"v1/devices/me/telemetry\"\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.debug(data)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n for chunk in chunk_payload(payload=payload):\n publish(topic, json.dumps(chunk), 1, cloud_name=\"FK Transfer\")\n time.sleep(2)\ndef writeplctag(value):\n #value in the form {\"measurement\": <measurement_name>, \"value\": <value to write>}\n try:\n #value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n #payload format: [{\"name\": \"advvfdipp\", \"measures\": [{\"name\": \"manualfrequencysetpoint\", \"value\": 49}]}]\n message = [{\"name\": \"fk_transfer\", \"measures\":[{\"name\":value[\"measurement\"], \"value\": value[\"value\"]}]}]\n resp = write(message) \n logger.debug(\"RETURN FROM WRITE: {}\".format(resp))\n return True\n except Exception as e:\n logger.debug(e)\n return False\n \ndef receiveCommand(topic, payload):\n try:\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)\n command = p[\"method\"]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n } \n if command == \"setPLCTag\":\n try:\n result = commands[\"writeplctag\"](p[\"params\"])\n logger.debug(result)\n except Exception as e:\n logger.error(e)\n #logger.debug(command)\n ack(topic.split(\"/\")[-1])\n time.sleep(5)\n sync()\n except Exception as e:\n logger.debug(e)\n \n\ndef ack(msgid):\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n publish(\"v1/devices/me/rpc/response/\" + str(msgid), json.dumps({\"msg\": {\"time\": time.time()}, \"metadata\": \"\", \"msgType\": \"\"}), 1, cloud_name=\"FK Transfer\")\n",
|
|
"msgType": 0,
|
|
"cloudName": "FK Transfer",
|
|
"trigger": "command_event"
|
|
},
|
|
{
|
|
"name": "receiveAttributes",
|
|
"topic": "v1/devices/me/attributes",
|
|
"qos": 1,
|
|
"funcName": "receiveAttributes",
|
|
"payload_type": "JSON",
|
|
"script": "import json, time\nfrom datetime import datetime as dt\nfrom quickfaas.measure import recall, write\nfrom quickfaas.remotebus import publish\nfrom common.Logger import logger\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 sync():\n #get new values and send\n payload = {\"ts\": round(dt.timestamp(dt.now()))*1000, \"values\": {}}\n topic = \"v1/devices/me/telemetry\"\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.debug(data)\n for controller in data:\n for measure in controller[\"measures\"]:\n #publish measure\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n for chunk in chunk_payload(payload=payload):\n publish(topic, json.dumps(chunk), 1, cloud_name=\"FK Transfer\")\n time.sleep(2)\ndef writeplctag(value):\n #value in the form {\"measurement\": <measurement_name>, \"value\": <value to write>}\n try:\n #value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n #payload format: [{\"name\": \"advvfdipp\", \"measures\": [{\"name\": \"manualfrequencysetpoint\", \"value\": 49}]}]\n message = [{\"name\": \"fk_transfer\", \"measures\":[{\"name\":value[\"measurement\"], \"value\": value[\"value\"]}]}]\n resp = write(message) \n logger.debug(\"RETURN FROM WRITE: {}\".format(resp))\n return True\n except Exception as e:\n logger.debug(e)\n return False\n \ndef receiveAttributes(topic, payload):\n try:\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)\n for key, value in p.items():\n try:\n result = writeplctag({\"measurement\":key, \"value\":value})\n logger.debug(result)\n except Exception as e:\n logger.error(e)\n #logger.debug(command)\n sync()\n except Exception as e:\n logger.debug(e)\n \n\n",
|
|
"msgType": 0,
|
|
"cloudName": "FK Transfer",
|
|
"trigger": "command_event"
|
|
}
|
|
]
|
|
},
|
|
"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"
|
|
} |