summaryrefslogtreecommitdiffstats
path: root/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control
diff options
context:
space:
mode:
Diffstat (limited to 'meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control')
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/config-base.json2190
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/continue-if-sensor-not-present.patch384
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-boot-control.service10
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-control.sh12
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh21
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service12
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service14
7 files changed, 2643 insertions, 0 deletions
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/config-base.json b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/config-base.json
new file mode 100644
index 000000000..742378849
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/config-base.json
@@ -0,0 +1,2190 @@
+{
+ "sensors" : [
+ {
+ "name": "fan0",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan0",
+ "writePath": "/xyz/openbmc_project/sensors/fan_tach/fan0",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fan1",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1",
+ "writePath": "/xyz/openbmc_project/sensors/fan_tach/fan1",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fan2",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan2",
+ "writePath": "/xyz/openbmc_project/sensors/fan_tach/fan2",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fan3",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan3",
+ "writePath": "/xyz/openbmc_project/sensors/fan_tach/fan3",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fan4",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan4",
+ "writePath": "/xyz/openbmc_project/sensors/fan_tach/fan4",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fan5",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan5",
+ "writePath": "/xyz/openbmc_project/sensors/fan_tach/fan5",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "p0_core0_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core1_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core1_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core2_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core2_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core3_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core3_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core4_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core4_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core5_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core5_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core6_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core6_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core7_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core7_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core8_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core8_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core9_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core9_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core10_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core10_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core11_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core11_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core12_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core12_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core13_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core13_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core14_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core14_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core15_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core15_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core16_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core16_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core17_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core17_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core18_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core18_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core19_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core19_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core20_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core20_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core21_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core21_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core22_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core22_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core23_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core23_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core0_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core1_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core1_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core2_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core2_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core3_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core3_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core4_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core4_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core5_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core5_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core6_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core6_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core7_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core7_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core8_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core8_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core9_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core9_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core10_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core10_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core11_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core11_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core12_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core12_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core13_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core13_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core14_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core14_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core15_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core15_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core16_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core16_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core17_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core17_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core18_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core18_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core19_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core19_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core20_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core20_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core21_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core21_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core22_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core22_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core23_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core23_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm0_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm0_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm1_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm1_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm2_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm2_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm3_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm3_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm4_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm4_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm5_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm5_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm6_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm6_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm7_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm7_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm8_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm8_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm9_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm9_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm10_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm10_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm11_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm11_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm12_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm12_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm13_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm13_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm14_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm14_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm15_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm15_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_vdd_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_vdd_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_vdd_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_vdd_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "ambient",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/ambient",
+ "writePath": "",
+ "ignoreDbusMinMax": true,
+ "timeout": 0
+ },
+ {
+ "name": "cpu_1_ambient",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/cpu_1_ambient",
+ "writePath": "",
+ "ignoreDbusMinMax": true,
+ "timeout": 0
+ },
+ {
+ "name": "pcie",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/pcie",
+ "writePath": "",
+ "ignoreDbusMinMax": true,
+ "timeout": 0
+ }
+ ],
+ "zones" : [
+ {
+ "id": 0,
+ "minThermalOutput": 0.0,
+ "failsafePercent": 100.0,
+ "pids": [
+ {
+ "name": "fan4",
+ "type": "fan",
+ "inputs": ["fan4"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 1.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "p0_core0_temp",
+ "type": "temp",
+ "inputs": ["p0_core0_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core1_temp",
+ "type": "temp",
+ "inputs": ["p0_core1_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core2_temp",
+ "type": "temp",
+ "inputs": ["p0_core2_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core3_temp",
+ "type": "temp",
+ "inputs": ["p0_core3_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core4_temp",
+ "type": "temp",
+ "inputs": ["p0_core4_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core5_temp",
+ "type": "temp",
+ "inputs": ["p0_core5_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core6_temp",
+ "type": "temp",
+ "inputs": ["p0_core6_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core7_temp",
+ "type": "temp",
+ "inputs": ["p0_core7_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core8_temp",
+ "type": "temp",
+ "inputs": ["p0_core8_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core9_temp",
+ "type": "temp",
+ "inputs": ["p0_core9_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core10_temp",
+ "type": "temp",
+ "inputs": ["p0_core10_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core11_temp",
+ "type": "temp",
+ "inputs": ["p0_core11_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core12_temp",
+ "type": "temp",
+ "inputs": ["p0_core12_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core13_temp",
+ "type": "temp",
+ "inputs": ["p0_core13_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core14_temp",
+ "type": "temp",
+ "inputs": ["p0_core14_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core15_temp",
+ "type": "temp",
+ "inputs": ["p0_core15_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core16_temp",
+ "type": "temp",
+ "inputs": ["p0_core16_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core17_temp",
+ "type": "temp",
+ "inputs": ["p0_core17_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core18_temp",
+ "type": "temp",
+ "inputs": ["p0_core18_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core19_temp",
+ "type": "temp",
+ "inputs": ["p0_core19_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core20_temp",
+ "type": "temp",
+ "inputs": ["p0_core20_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core21_temp",
+ "type": "temp",
+ "inputs": ["p0_core21_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core22_temp",
+ "type": "temp",
+ "inputs": ["p0_core22_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core23_temp",
+ "type": "temp",
+ "inputs": ["p0_core23_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm0_temp",
+ "type": "temp",
+ "inputs": ["dimm0_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm1_temp",
+ "type": "temp",
+ "inputs": ["dimm1_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm2_temp",
+ "type": "temp",
+ "inputs": ["dimm2_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm3_temp",
+ "type": "temp",
+ "inputs": ["dimm3_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm4_temp",
+ "type": "temp",
+ "inputs": ["dimm4_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm5_temp",
+ "type": "temp",
+ "inputs": ["dimm5_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm6_temp",
+ "type": "temp",
+ "inputs": ["dimm6_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm7_temp",
+ "type": "temp",
+ "inputs": ["dimm7_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_vdd_temp",
+ "type": "temp",
+ "inputs": ["p0_vdd_temp"],
+ "setpoint": 85.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -40.0,
+ "integralCoeff": -2.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ }
+ ]
+ },
+ {
+ "id": 1,
+ "minThermalOutput": 0.0,
+ "failsafePercent": 100.0,
+ "pids": [
+ {
+ "name": "fan5",
+ "type": "fan",
+ "inputs": ["fan5"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 1.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "p1_core0_temp",
+ "type": "temp",
+ "inputs": ["p1_core0_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core1_temp",
+ "type": "temp",
+ "inputs": ["p1_core1_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core2_temp",
+ "type": "temp",
+ "inputs": ["p1_core2_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core3_temp",
+ "type": "temp",
+ "inputs": ["p1_core3_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core4_temp",
+ "type": "temp",
+ "inputs": ["p1_core4_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core5_temp",
+ "type": "temp",
+ "inputs": ["p1_core5_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core6_temp",
+ "type": "temp",
+ "inputs": ["p1_core6_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core7_temp",
+ "type": "temp",
+ "inputs": ["p1_core7_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core8_temp",
+ "type": "temp",
+ "inputs": ["p1_core8_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core9_temp",
+ "type": "temp",
+ "inputs": ["p1_core9_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core10_temp",
+ "type": "temp",
+ "inputs": ["p1_core10_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core11_temp",
+ "type": "temp",
+ "inputs": ["p1_core11_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core12_temp",
+ "type": "temp",
+ "inputs": ["p1_core12_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core13_temp",
+ "type": "temp",
+ "inputs": ["p1_core13_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core14_temp",
+ "type": "temp",
+ "inputs": ["p1_core14_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core15_temp",
+ "type": "temp",
+ "inputs": ["p1_core15_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core16_temp",
+ "type": "temp",
+ "inputs": ["p1_core16_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core17_temp",
+ "type": "temp",
+ "inputs": ["p1_core17_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core18_temp",
+ "type": "temp",
+ "inputs": ["p1_core18_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core19_temp",
+ "type": "temp",
+ "inputs": ["p1_core19_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core20_temp",
+ "type": "temp",
+ "inputs": ["p1_core20_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core21_temp",
+ "type": "temp",
+ "inputs": ["p1_core21_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core22_temp",
+ "type": "temp",
+ "inputs": ["p1_core22_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core23_temp",
+ "type": "temp",
+ "inputs": ["p1_core23_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm8_temp",
+ "type": "temp",
+ "inputs": ["dimm8_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm9_temp",
+ "type": "temp",
+ "inputs": ["dimm9_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm10_temp",
+ "type": "temp",
+ "inputs": ["dimm10_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm11_temp",
+ "type": "temp",
+ "inputs": ["dimm11_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm12_temp",
+ "type": "temp",
+ "inputs": ["dimm12_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm13_temp",
+ "type": "temp",
+ "inputs": ["dimm13_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm14_temp",
+ "type": "temp",
+ "inputs": ["dimm14_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm15_temp",
+ "type": "temp",
+ "inputs": ["dimm15_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_vdd_temp",
+ "type": "temp",
+ "inputs": ["p1_vdd_temp"],
+ "setpoint": 85.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -40.0,
+ "integralCoeff": -2.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "minThermalOutput": 0.0,
+ "failsafePercent": 100.0,
+ "pids": [
+ {
+ "name": "fan0",
+ "type": "fan",
+ "inputs": ["fan0"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 1.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "fan1",
+ "type": "fan",
+ "inputs": ["fan1"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 1.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "fan2",
+ "type": "fan",
+ "inputs": ["fan2"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 1.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "fan3",
+ "type": "fan",
+ "inputs": ["fan3"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 1.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "ambient",
+ "type": "temp",
+ "inputs": ["ambient"],
+ "setpoint": 42.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -2.5,
+ "integralCoeff": -0.05,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "cpu_1_ambient",
+ "type": "temp",
+ "inputs": ["cpu_1_ambient"],
+ "setpoint": 42.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -2.5,
+ "integralCoeff": -0.05,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "pcie",
+ "type": "temp",
+ "inputs": ["pcie"],
+ "setpoint": 42.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -2.5,
+ "integralCoeff": -0.05,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/continue-if-sensor-not-present.patch b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/continue-if-sensor-not-present.patch
new file mode 100644
index 000000000..7c384013a
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/continue-if-sensor-not-present.patch
@@ -0,0 +1,384 @@
+diff --git a/dbus/dbuspassive.cpp b/dbus/dbuspassive.cpp
+index 806ef40..75b83f5 100644
+--- a/dbus/dbuspassive.cpp
++++ b/dbus/dbuspassive.cpp
+@@ -26,6 +26,10 @@
+ #include <string>
+ #include <variant>
+
++using Property = std::string;
++using Value = std::variant<int64_t, double, std::string, bool>;
++using PropertyMap = std::map<Property, Value>;
++
+ std::unique_ptr<ReadInterface> DbusPassive::createDbusPassive(
+ sdbusplus::bus::bus& bus, const std::string& type, const std::string& id,
+ DbusHelperInterface* helper, const conf::SensorConfig* info,
+@@ -61,6 +65,41 @@ std::unique_ptr<ReadInterface> DbusPassive::createDbusPassive(
+ return nullptr;
+ }
+
++ if (failed && (type == "fan"))
++ {
++ std::string path = getInventoryPath(id);
++
++ try
++ {
++ bool present = true;
++
++ auto pimMsg = tempBus.new_method_call("xyz.openbmc_project.Inventory.Manager", path.c_str(), "org.freedesktop.DBus.Properties", "GetAll");
++ pimMsg.append("xyz.openbmc_project.Inventory.Item");
++
++ PropertyMap propMap;
++
++ auto valueResponseMsg = bus.call(pimMsg);
++ valueResponseMsg.read(propMap);
++
++ // If no error was set, the data should all be there.
++ auto findPresent = propMap.find("Present");
++ if (findPresent != propMap.end())
++ {
++ present = std::get<bool>(findPresent->second);
++ }
++
++ // std::cerr << "DbusPassive::createDbusPassive() present: '" << present << "'\n";
++ if (!present)
++ {
++ failed = false;
++ }
++ }
++ catch (const std::exception& e)
++ {
++ // Ignore failure
++ }
++ }
++
+ /* if these values are zero, they're ignored. */
+ if (info->ignoreDbusMinMax)
+ {
+@@ -68,6 +107,7 @@ std::unique_ptr<ReadInterface> DbusPassive::createDbusPassive(
+ settings.max = 0;
+ }
+
++ // std::cerr << "DbusPassive::createDbusPassive() failed: " << failed << "\n";
+ return std::make_unique<DbusPassive>(bus, type, id, helper, settings,
+ failed, path, redundancy);
+ }
+@@ -78,8 +118,9 @@ DbusPassive::DbusPassive(
+ bool failed, const std::string& path,
+ const std::shared_ptr<DbusPassiveRedundancy>& redundancy) :
+ ReadInterface(),
+- _bus(bus), _signal(bus, getMatch(type, id).c_str(), dbusHandleSignal, this),
+- _id(id), _helper(helper), _failed(failed), path(path),
++ _id(id), _type(type), _helper(helper), _bus(bus),
++ _signal(bus, getMatch(type, id).c_str(), dbusHandleSignal, this),
++ _failed(failed), path(path),
+ redundancy(redundancy)
+
+ {
+@@ -109,19 +150,23 @@ void DbusPassive::setValue(double value)
+
+ bool DbusPassive::getFailed(void) const
+ {
++ // std::cerr << "DbusPassive::getFailed() redundancy: " << redundancy << "\n";
+ if (redundancy)
+ {
+ const std::set<std::string>& failures = redundancy->getFailed();
+ if (failures.find(path) != failures.end())
+ {
++ // std::cerr << "DbusPassive::getFailed() redundancy has signalled failure!\n";
+ return true;
+ }
+ }
++ // std::cerr << "DbusPassive::getFailed() _failed: " << _failed << "\n";
+ return _failed;
+ }
+
+ void DbusPassive::setFailed(bool value)
+ {
++ // std::cerr << "DbusPassive::setFailed(" << value << ")\n";
+ _failed = value;
+ }
+
+@@ -189,6 +234,43 @@ int handleSensorValue(sdbusplus::message::message& msg, DbusPassive* owner)
+ {
+ asserted = std::get<bool>(criticalAlarmHigh->second);
+ }
++
++ // std::cerr << "handleSensorValue() asserted: " << asserted << " type: '" << owner->_type << "'\n";
++ if (asserted && (owner->_type == "fan"))
++ {
++ std::string path = getInventoryPath(owner->_id);
++
++ try
++ {
++ bool present = true;
++
++ auto pimMsg = owner->_bus.new_method_call("xyz.openbmc_project.Inventory.Manager", path.c_str(), "org.freedesktop.DBus.Properties", "GetAll");
++ pimMsg.append("xyz.openbmc_project.Inventory.Item");
++
++ PropertyMap propMap;
++
++ auto valueResponseMsg = owner->_bus.call(pimMsg);
++ valueResponseMsg.read(propMap);
++
++ // If no error was set, the data should all be there.
++ auto findPresent = propMap.find("Present");
++ if (findPresent != propMap.end())
++ {
++ present = std::get<bool>(findPresent->second);
++ }
++
++ // std::cerr << "handleSensorValue() present: '" << present << "'\n";
++ if (!present)
++ {
++ asserted = false;
++ }
++ }
++ catch (const std::exception& e)
++ {
++ // Ignore failure
++ }
++ }
++
+ owner->setFailed(asserted);
+ }
+
+diff --git a/dbus/dbuspassive.hpp b/dbus/dbuspassive.hpp
+index f00a2ea..d025ed4 100644
+--- a/dbus/dbuspassive.hpp
++++ b/dbus/dbuspassive.hpp
+@@ -57,12 +57,14 @@ class DbusPassive : public ReadInterface
+ double getMax(void);
+ double getMin(void);
+
+- private:
++ std::string _id; // for debug identification
++ std::string _type; // for inventory match
++ DbusHelperInterface* _helper;
+ sdbusplus::bus::bus& _bus;
++
++ private:
+ sdbusplus::server::match::match _signal;
+ int64_t _scale;
+- std::string _id; // for debug identification
+- DbusHelperInterface* _helper;
+
+ std::mutex _lock;
+ double _value = 0;
+diff --git a/dbus/dbuswrite.cpp b/dbus/dbuswrite.cpp
+index 502b988..28a04e4 100644
+--- a/dbus/dbuswrite.cpp
++++ b/dbus/dbuswrite.cpp
+@@ -65,6 +65,8 @@ void DbusWritePercent::write(double value)
+ "org.freedesktop.DBus.Properties", "Set");
+ mesg.append(pwmInterface, "Target", std::variant<uint64_t>(ovalue));
+
++ // std::cerr << "DbusWritePercent::write(" << value << "), writing to connection '" << connectionName.c_str() << "', path '" << path.c_str() << "' xyz.openbmc_project.Control.FanPwm Target '" << ovalue << "'\n";
++
+ try
+ {
+ // TODO: if we don't use the reply, call_noreply()
+@@ -111,6 +113,8 @@ void DbusWrite::write(double value)
+ "org.freedesktop.DBus.Properties", "Set");
+ mesg.append(pwmInterface, "Target", std::variant<uint64_t>(value));
+
++ // std::cerr << "DbusWrite::write(" << value << "), writing to connection '" << connectionName.c_str() << "', path '" << path.c_str() << "' xyz.openbmc_project.Control.FanPwm Target '" << value << "'\n";
++
+ try
+ {
+ // TODO: consider call_noreplly
+diff --git a/dbus/util.cpp b/dbus/util.cpp
+index 33e0985..8a639eb 100644
+--- a/dbus/util.cpp
++++ b/dbus/util.cpp
+@@ -148,6 +148,7 @@ bool DbusHelper::thresholdsAsserted(sdbusplus::bus::bus& bus,
+ {
+ asserted = std::get<bool>(findCriticalHigh->second);
+ }
++ // std::cerr << "DbusHelper::thresholdsAsserted path: '" << path << "' asserted: " << asserted << "\n";
+ return asserted;
+ }
+
+@@ -170,6 +171,11 @@ std::string getSensorPath(const std::string& type, const std::string& id)
+ return std::string("/xyz/openbmc_project/sensors/" + layer + "/" + id);
+ }
+
++std::string getInventoryPath(const std::string& id)
++{
++ return std::string("/xyz/openbmc_project/inventory/system/chassis/motherboard/" + id);
++}
++
+ std::string getMatch(const std::string& type, const std::string& id)
+ {
+ return std::string("type='signal',"
+diff --git a/pid/ec/pid.cpp b/pid/ec/pid.cpp
+index 7d8b403..7a8b91d 100644
+--- a/pid/ec/pid.cpp
++++ b/pid/ec/pid.cpp
+@@ -16,6 +16,8 @@
+
+ #include "pid.hpp"
+
++#include <iostream>
++
+ namespace ec
+ {
+
+@@ -72,6 +74,8 @@ double pid(pid_info_t* pidinfoptr, double input, double setpoint)
+ output = proportionalTerm + integralTerm + feedFwdTerm;
+ output = clamp(output, pidinfoptr->outLim.min, pidinfoptr->outLim.max);
+
++ // std::cerr << "pid() input: " << input << " error: " << error << " proportionalTerm: " << proportionalTerm << " integralTerm: " << integralTerm << " feedFwdTerm: " << feedFwdTerm << " output: " << output << "\n";
++
+ // slew rate
+ // TODO(aarena) - Simplify logic as Andy suggested by creating dynamic
+ // outLim_min/max that are affected by slew rate control and just clamping
+diff --git a/pid/fancontroller.cpp b/pid/fancontroller.cpp
+index dd26d16..3a2c743 100644
+--- a/pid/fancontroller.cpp
++++ b/pid/fancontroller.cpp
+@@ -106,6 +106,7 @@ double FanController::setptProc(void)
+ setFanDirection(FanSpeedDirection::NEUTRAL);
+ }
+
++ // std::cerr << "FanController::setptProc() prev: " << prev << " going to return: " << maxRPM << "\n";
+ setSetpoint(maxRPM);
+
+ return (maxRPM);
+@@ -128,12 +129,15 @@ void FanController::outputProc(double value)
+ }
+ }
+
++ // std::cerr << "FanController::outputProc(" << value << ") _owner->getFailSafeMode(): " << _owner->getFailSafeMode() << " percent: " << percent << "\n";
++
+ // value and kFanFailSafeDutyCycle are 10 for 10% so let's fix that.
+ percent /= 100;
+
+ // PidSensorMap for writing.
+ for (const auto& it : _inputs)
+ {
++ // std::cerr << "FanController::outputProc(" << value << ") for '" << it << "', writing value '" << percent << "'\n";
+ auto sensor = _owner->getSensor(it);
+ sensor->write(percent);
+ }
+diff --git a/pid/pidcontroller.cpp b/pid/pidcontroller.cpp
+index e3eaaff..e23149e 100644
+--- a/pid/pidcontroller.cpp
++++ b/pid/pidcontroller.cpp
+@@ -73,6 +73,8 @@ void PIDController::process(void)
+ output = ec::pid(info, lastInput, setpt);
+ }
+
++ // std::cerr << "PIDController::process() setpt: " << setpt << " input: " << input << " output: " << output << "\n";
++
+ // Output new value
+ outputProc(output);
+
+diff --git a/pid/zone.cpp b/pid/zone.cpp
+index 6a63671..8cdb9f7 100644
+--- a/pid/zone.cpp
++++ b/pid/zone.cpp
+@@ -53,6 +53,11 @@ void PIDZone::setManualMode(bool mode)
+ bool PIDZone::getFailSafeMode(void) const
+ {
+ // If any keys are present at least one sensor is in fail safe mode.
++ // if (!_failSafeSensors.empty())
++ // {
++ // std::set<std::string>::iterator it = _failSafeSensors.begin();
++ // std::cerr << "PIDZone::getFailSafeMode sensor '" << *it << "' failed!\n";
++ // }
+ return !_failSafeSensors.empty();
+ }
+
+@@ -139,6 +144,7 @@ void PIDZone::determineMaxSetPointRequest(void)
+ */
+ max = std::max(getMinThermalSetpoint(), max);
+
++ // std::cerr << "PIDZone::determineMaxSetPointRequest _SetPoints.size(): " << _SetPoints.size() << " tuningEnabled: " << tuningEnabled << " max: " << max << "\n";
+ if (tuningEnabled)
+ {
+ /*
+@@ -251,6 +257,7 @@ void PIDZone::updateFanTelemetry(void)
+ // check if fan fail.
+ if (sensor->getFailed())
+ {
++ std::cerr << "Fan '" << f << "' has failed!.\n";
+ _failSafeSensors.insert(f);
+ }
+ else if (timeout != 0 && duration >= period)
+@@ -288,6 +295,17 @@ void PIDZone::updateSensors(void)
+ for (const auto& t : _thermalInputs)
+ {
+ auto sensor = _mgr.getSensor(t);
++ if (!sensor)
++ {
++ // std::cerr << "Skipping missing sensor '" << t << "'.\n";
++ // Check if it's in there: remove it.
++ auto kt = _failSafeSensors.find(t);
++ if (kt != _failSafeSensors.end())
++ {
++ _failSafeSensors.erase(kt);
++ }
++ continue;
++ }
+ ReadReturn r = sensor->read();
+ int64_t timeout = sensor->getTimeout();
+
+@@ -303,7 +321,7 @@ void PIDZone::updateSensors(void)
+ }
+ else if (timeout != 0 && duration >= period)
+ {
+- // std::cerr << "Entering fail safe mode.\n";
++ std::cerr << "Entering fail safe mode.\n";
+ _failSafeSensors.insert(t);
+ }
+ else
+@@ -315,6 +333,8 @@ void PIDZone::updateSensors(void)
+ _failSafeSensors.erase(kt);
+ }
+ }
++
++ // std::cerr << "PIDZone::updateSensors for '" << t << "', got value '" << _cachedValuesByName[t] << "'\n";
+ }
+
+ return;
+diff --git a/sensors/builder.cpp b/sensors/builder.cpp
+index 4da1cf2..464ec9c 100644
+--- a/sensors/builder.cpp
++++ b/sensors/builder.cpp
+@@ -87,9 +87,7 @@ SensorManager
+ }
+ if (ri == nullptr)
+ {
+- throw SensorBuildException(
+- "Failed to create dbus passive sensor: " + name +
+- " of type: " + info->type);
++ continue;
+ }
+ break;
+ case IOInterfaceType::EXTERNAL:
+diff --git a/sensors/manager.hpp b/sensors/manager.hpp
+index 411b302..bd1dd48 100644
+--- a/sensors/manager.hpp
++++ b/sensors/manager.hpp
+@@ -38,6 +38,8 @@ class SensorManager
+ // TODO(venture): Should implement read/write by name.
+ Sensor* getSensor(const std::string& name) const
+ {
++ if (_sensorMap.count(name) <= 0)
++ return nullptr;
+ return _sensorMap.at(name).get();
+ }
+
+diff --git a/util.hpp b/util.hpp
+index e40b61f..5e2feae 100644
+--- a/util.hpp
++++ b/util.hpp
+@@ -149,6 +149,7 @@ class DbusHelper : public DbusHelperInterface
+ };
+
+ std::string getSensorPath(const std::string& type, const std::string& id);
++std::string getInventoryPath(const std::string& id);
+ std::string getMatch(const std::string& type, const std::string& id);
+ void scaleSensorReading(const double min, const double max, double& value);
+ bool validType(const std::string& type);
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-boot-control.service b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-boot-control.service
new file mode 100644
index 000000000..2149c3da5
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-boot-control.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Set Fan to Default Duty as Booting Up
+DefaultDependencies=no
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/fan-default-speed.sh
+
+[Install]
+WantedBy=sysinit.target
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-control.sh b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-control.sh
new file mode 100644
index 000000000..87d41a8b1
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-control.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+FAN_TABLE_PATH="/usr/share/swampd/config.json"
+FAN_TABLE_BASE="/usr/share/swampd/config-base.json"
+
+# System specific tweaks go here!
+# <TWEAK>
+
+cp $FAN_TABLE_BASE $FAN_TABLE_PATH
+
+# start pid control
+/usr/bin/swampd
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh
new file mode 100644
index 000000000..95b92e37a
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh
@@ -0,0 +1,21 @@
+#!bin/bash
+
+# set fan pwm by d-bus command
+function set_fan_value() {
+ # Failsafe
+ echo 255 > /sys/class/hwmon/*/pwm1
+
+ # DBUS interface
+ set_property_path='xyz.openbmc_project.Control.FanPwm'
+ busctl set-property $1 $2 $set_property_path Target t 255
+}
+
+# WARNING
+# This makes a number of assumptions about the bus structure underlying the fan controllers...
+hwmon_path="$(mapper get-service /xyz/openbmc_project/sensors/fan_tach/fan0)"
+set_fan_value $hwmon_path "/xyz/openbmc_project/sensors/fan_tach/fan0" "/sys/class/hwmon/*/pwm1"
+set_fan_value $hwmon_path "/xyz/openbmc_project/sensors/fan_tach/fan1" "/sys/class/hwmon/*/pwm2"
+set_fan_value $hwmon_path "/xyz/openbmc_project/sensors/fan_tach/fan2" "/sys/class/hwmon/*/pwm3"
+set_fan_value $hwmon_path "/xyz/openbmc_project/sensors/fan_tach/fan3" "/sys/class/hwmon/*/pwm4"
+set_fan_value $hwmon_path "/xyz/openbmc_project/sensors/fan_tach/fan4" "/sys/class/hwmon/*/pwm5"
+set_fan_value $hwmon_path "/xyz/openbmc_project/sensors/fan_tach/fan5" "/sys/class/hwmon/*/pwm6"
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service
new file mode 100644
index 000000000..681bdbe00
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Set Fan to Default Duty as Rebooting
+DefaultDependencies=no
+After=shutdown.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=true
+ExecStart=/usr/bin/fan-default-speed.sh
+
+[Install]
+WantedBy=shutdown.target
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service
new file mode 100644
index 000000000..0e18819f8
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=OpenBMC Fan Control Daemon
+After=xyz.openbmc_project.nvme.manager.service
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/fan-control.sh
+Restart=always
+RestartSec=5
+StartLimitInterval=0
+ExecStopPost=/usr/bin/fan-default-speed.sh
+
+[Install]
+WantedBy=basic.target
OpenPOWER on IntegriCloud